我做了一个单片机控制步进电机驱动器的电路板,开始它的脉冲输出控制PUL端使用计时器控制输出,但是,有的时候会输出脉冲不一样,有时刚好等于那个数,有时却少了(没有多的时候),仔细观察计时器的时间常数,有时会不一样,所以请大家来一起分析一下,为何会这样? 下面我给出部分相关程序:
//******主程序内工作子程序:
void work_Auto (void) { if (QD_flag) //启动按钮标志为1时,表示按了启动按钮 {
do //先执行一次,再测是否为自动运行,自动运行,则继续,不继续则停机 { ENA=0; //步进电机驱动器允许运行
DIR=0; //正转 maichong=0; //脉冲量清零
TH0=-7000/256; //装启动时间常数 TL0=-7000%6 ;
PUL=0; ET0=1; //允许计时器T0中断 TR0=1; //启动计时器T0,让PUL端输出脉冲
while (maichong <= jiaodujishuan ) ; //等待转动角度达到设定值 为总共角度除以每步角度 ET0=1; //允许计时器T0中断 TR0=0; delay(1);
DIR=1; //设定反转
maichong=0; //脉冲量清零 TH0=-7000/256; //装启动时间常数 TL0=-7000%6 ; PUL=0;
TR0=1; //重新启动,但为反转 while (maichong <= jiaodujishuan ); //等待反转到设定值 TR0=0; //停转 DIR=0; ENA=1; //关闭步进电机驱动 maichong=0; _nop_(); _nop_();
delay ( 100*zhanting ); //延时设定暂停时间,单位为0.1S
_nop_(); _nop_(); QD_flag=0;
} while (Auto_flag); //检测是否为自动模式,自动模式则继续运行,半自动则跳出再去检查是否有启动按键 按下
}
}
//*****************计时器中断子程序:
void zd0(void ) interrupt 1 { //此中断程序用输出脉冲给步进电机驱动板速度控制端
_nop_(); _nop_(); if ((maichong<10) || (maichong >(jiaodujishuan-20))) { TH0=-7000/256; TL0=-7000/256; } else { TH0=-T/256; TL0=-T/256; } maichong++; //脉冲量计数加1
PUL=!PUL; //脉冲输出反相
}
敬请大家分析!
[此贴子已经被admin于2008-10-4 1:34:58编辑过]
|