lsnba 发表于 2009-12-19 23:01:55

步进电机脉冲计数

前段时间看到bbmingxiao发的能记录走过步数的步进电机控制程序,现在作些改动加个串口中断,大家看看可行性如何

int flag_led=0;
int dianjitime0,dianjitime1,dianjitime2;
int time0,time1,time2;
int pul0,pul1,pul2;
unsigned int r={0,0,0};
unsigned char flag=0;

#define wait asm("nop\n nop")

#define stop0()TIMSK&=~(1<<OCIE0)
#define go0()    TIMSK|=(1<<OCIE0)
#define stop1()TIMSK&=~(1<<OCIE1A)
#define go1()    TIMSK|=(1<<OCIE1A)
#define stop2()TIMSK&=~(1<<OCIE2)
#define go2()    TIMSK|=(1<<OCIE2)

#define dianji0_pul PORTB^=(1<<PB0)
#define dianji1_pul PORTB^=(1<<PB1)
#define dianji2_pul PORTB^=(1<<PB2)

/*延时函数*/
void delay_ms(unsigned char i) {

        unsigned char a, b;
        for (a = 0; a < i; a++) {
                for (b = 1; b; b++);
                }
}

/*IO口初始化函数*/
void io_init(void) {

        DDRA = 0x00;                                                                                /*方向输入*/
        PORTA = 0xFF;                                                                                /*打开上拉*/
        DDRB = 0xFF;                                                                                /*方向输出*/
        PORTB = 0xFF;                                                                                /*输出高电平*/
        DDRC = 0x00;                                                                                /*不用的IO口建议设置为输入带上拉*/
        PORTC = 0xFF;
        DDRD = 0x00;
        PORTD = 0xFF;
}

void dianji0_right(int pul0)
{      
      
    go0();
    time0 = pul0 * 2; //需要走的步数
}

void dianji1_right(int pul1)
{      
      
        go1();
    time1 = pul1 * 2; //需要走的步数
}

void dianji2_right(int pul2)
{      
      
        go2();
    time2 = pul2 * 2; //需要走的步数
}   
/*主函数*/
void main(void)
{

        unsigned char j = 0;
        unsigned int i = 0;
        unsigned char temp = 0;

        io_init();
        ctc_init();
        uart_init1();
aa:        wait;
        wait;
        if(flag==0){goto aa;}
        else
        {
        dianji0_right(r);
    dianji1_right(r);
    dianji2_right(r);
        flag=0;
        }       
        goto aa;
}

#pragma interrupt_handler OC1_int:7
void OC1_int(void)
{
   static int count1;
      count1 ++ ;
      if( count1 == time1 )
      {
      count1 =0 ;
      stop1();
      }
dianjitime1 ++;
dianji1_pul;

}

#pragma interrupt_handler OC2_int:4
void OC2_int(void)
{
   static int count2;
      count2 ++ ;
      if( count2 == time2 )
      {
      count2 =0 ;
      stop2();
      }
dianjitime2 ++;
dianji2_pul;

}

#pragma interrupt_handler OC0_int:20
void OC0_int(void)
{
   static int count0;
      count0 ++ ;
      if( count0 == time0 )
      {
      count0 =0 ;
      stop0();
      }
dianjitime0 ++;
dianji0_pul;

}


#pragma interrupt_handler usart_rx_isr:12

void usart_rx_isr(void)
{

r=UDR;
flag_led++;
if(flag_led==3){flag=1;flag_led=0;}
}

上述程序是在串行接收3个数后,置标志位,启动定时器匹配中断,
现在的问题是如果串口中断接收重复进行,是不是进入不了定时器匹配中断?
请高手帮忙作答,看看可行性如何?

TRINAMIC 发表于 2010-1-11 14:04:37

使用现成的控制芯片吧
页: [1]
查看完整版本: 步进电机脉冲计数