大侠们,
兄弟弄一个小程序,用左右两个按键控制步进电机的运转方向或者速度。
在编程时遇到几个问题:
1. 开机后电机顺时针转,按右键(Mw)后逆时针转。但松开右键后,应该是回到顺时针转。然而并没有,仍然在逆时针转。
2.逆时针转的情况下,按下Two开关应该是修改计时器对比值后加快旋转的速度(提高脉冲输出频率),然而没有反应。
程序调试过很多遍,始终没有得到解决。
红色字体是问题所在行。
求教各位了!
#define Me PINC&0x01 //RA-.PIN是用来读出io口的逻辑电平值。不能对它写操作。
#define Ms PINC&0x02
#define Mw PINC&0x08 //PC3对应电路板上S5,对应RA+
#define Mn PINC&0x04
#define Two PINC&0x10 //00010000,PC4,1时16X,0时2X
#define Ns PIND&0x10
#define Sp PINA&0x02 //00000010,PA1
void Port_Init(void)
{
PORTA = 0xff; //PA0-RA输入,PA1-DEC输入。RA电机使能、方向、细分,输出给驱动芯片。PORT就跟51的Px口一样,直接读或直接写
DDRA = 0x1c;/*PA口前两位是AD输入,其余输出,00011100。PA5/6/7位==DRV8825驱动芯片的M0/M1/M2?
?111对应32细分,000对应无细分.DDR寄存器用来控制数据的方向,1为数据出,0为数据入*/
PORTB = 0xff; //PB口上拉,PB6-16X led。DEC电机使能、方向、细分,输出给驱动芯片。
DDRB = 0xff; //全部输出
PORTC=0xff; //PC口输入上拉,PC4-Speed,16X处
DDRC =0x00; //PC口全部输入
PORTD = 0x40; //01000000,PD6-2X LED,USART的发送接收端口分别为PD0和PD1,PD5-RA脉冲输出,PD7-DEC脉冲输出
DDRD = 0xe2; //11100010定义PD口为输入输出D5-RA脉冲输出,PD7-DEC脉冲输出。PD0为接收端口,置为输入口;PD1为发送端口,置为输出口,PD6-2x,输出
}
////////////////////////////////////
//R.A.跟踪定时器初始化
//////////////////////////////////////
void Timer1_Init(void)
{
TIMSK=TIMSK&0x1c; //原来c3,是不是应该是0x1c,TC1使能??00011100:TC1使能
TCCR1A=0x40; //0x40 4:0100--比较匹配时OC1A取反,0:和下面的TCCR1B的9组合,0100--CTC模式,OCR1A为计数最大值
TCCR1B=0x09; //0x09 00001001:WGM12=1,CTC模式。CS00=1(无分频)
TCNT1H=0x00; //计时器的底为0
TCNT1L=0x00;
OCR1AH=0x09; //RA脉冲输出,对应PD5。16细分
OCR1AL=0xbd; //
}
void Motor_Init(void)
{
//DEC禁止,RA正转使能
PORTA=0x8C; //10001100,PA5-7:100-16细分,000-无细分,111--32细分,PA4--0时使能,PA3--方向,1为朝西转。PA2--reset
}
int main(void)
{
Port_Init(); //端口初始化
Timer1_Init();
Motor_Init();
sei(); //使能全局中断
while(1)
{
if((Two)==0)
{PORTD=0x40;} //PORTD&0xbf;} //01000000,PD6-2X led,0时点亮
else if((Two)!=0)
{PORTD=0x00;} //01000000
if((Ns)==0) //N/S在N位置,北半球
{
if((Mw)==1) //设计是没有按键时就执行下面的PA赋值,但是按键后,这个语句就完全没有执行
{PORTA=0x8C;} //10001100,没有按键时,默认向西运动
else if((Mw)==0)
{
PORTA=0x84; //10000100:100-16细分,000-无细分,PA4--使能,PA3--方向(0-反向),PA2--reset.
if((Two)!=0) //这个判别语句没起作用
{
OCR1AH=0xd8; //一倍速06//二倍速03//八倍速00,加上之前的16细分2倍,实际是4倍速 //按下Me后到了这里?
OCR1AL=0x00; //一倍速ba//二倍速60//八倍速d8
}
else
{
OCR1AH=0x0a; //无细分 /一倍速06//二倍速03//八倍速00,加上之前的16细分2倍,实际是16倍速
OCR1AL=0xcc; //一倍速ba//二倍速60//八倍速d8
}
} // if Mw=0 结束
} //Ns=0 if 循环
} //while循环
} //main循环