步进电机脉冲计数
前段时间看到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个数后,置标志位,启动定时器匹配中断,
现在的问题是如果串口中断接收重复进行,是不是进入不了定时器匹配中断?
请高手帮忙作答,看看可行性如何? 使用现成的控制芯片吧
页:
[1]