|
最近在做步进电机的实验,调试的已经差不多了,但碰到了一个问题,即步进电机转动的步数会随着脉冲信号的频率而成比例变化,程序的原意是通过T/C0的CTC模式产生的脉冲信号,Step值设置电机转动的步数,但是运行时发现当Step不变,调整CTC输出的脉冲频率,转的步数也会发生变化,比如脉冲频率为10kHz,Step=100000(10圈),电机转动了7.5圈(应该是误差造成的吧?),而当频率改为20kHz,Step值不变时,电机转动了15圈,当频率为5Hz时为3.75圈,所以这里就有个问题,Step是在中断中执行减1的操作,应该和频率无关的吧,但结果确是和频率成正比,难道Step定义的是时间而不是步数?百思不得其解,望大家指教,谢谢~~程序主要部分如下:
//管脚定义,fosc=1MHZ,内部RC振荡
#define ENA 0 //PB0
#define DIR 1 //PB1
#define PUL 3 //OC0 PB3
//宏定义
#define ENA_OFF() PORTB|= (1<<ENA) //电机朝扩充方向转
#define ENA_ON() PORTB&=~(1<<ENA) //电机朝压缩方向转
#define DIR_EXP() PORTB&=~(1<<DIR) //电机反转
#define DIR_COM() PORTB|= (1<<DIR) //电机正转
//全局变量
volatile unsigned long Step; //步进电机待走的步数
volatile signed long Pos_Count; //记录步进电机的绝对位置
SIGNAL(SIG_OUTPUT_COMPARE0)//T0输出比较A匹配中断
{
if(Step == 0)
{
ENA_OFF();//步数已减至0,即电机已转至目标位置
}
else
Step--;//步数减一
}
void timer0_init(void) //CTC模式输出10KHz方波
{
OCR0 = 0x31; //设定TOP值
//TOP=1000000/(2*1*10000)-1=49 (0.1mS)
TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(1<<CS00);
//无分频,CTC模式,OC0取反输出方波
TIMSK|=(1<<OCIE0);//T/C0输出比较匹配使能
}
int main(void)
{
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTA = 0xFF; //不用的管脚使能内部上拉电阻。
PORTC = 0xFF;
PORTD = 0xFF;
PORTB |=~((1<<ENA)|(1<<DIR)|(1<<PUL)); //初始低电平,三根线,使能,方向和脉冲,接驱动器
DDRB |= ((1<<ENA)|(1<<DIR)|(1<<PUL)); //输出
DIR_COM();//电机正转
Step = 100000;//10000步/圈,转10圈,步进电机设置的是10000步/圈
ENA_ON();//使能电机
timer0_init();
sei(); //使能全局中断
while(Flag == 0)
{
;//等待中断
}
}
-----此内容被linky于2006-06-29,11:01:02编辑过 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|