步进电机角度计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
uint i;
uchar a,k;
uchar dj[];
uchar dj[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
void delay(a)
{
while(a--);
}
void main()
{
for(i=0;i<512;i++)
{
for(k=0;k<8;k++)//依次取dj[]中的8个数
{
P1=dj[k];
delay(300);
}
}
while(1);
}
这个是转一圈的程序。
这个电机步距角是5.625度的,要64个脉冲才能让转子转一圈,这个电机减速比是1:64的,也就是说要64*64=4096个脉冲外面的轴才会转一圈,主函数中两个for循环执行的循环次数512*8=4096 正好转一圈,如果想让电机一直转下去就把主函数最后那个while(1)删掉,如果想转90度就把512改成128.当然这是分为8拍走的,如果是4拍的话2048个脉冲就能走一圈了。
接线:把P1^0到P1^3分别接到驱动芯片的in1到in4,下载程序就行了
最近在做步进电机的实验,调试的已经差不多了,但碰到了一个问题,即步进电机转动的步数会随着脉冲信号的频率而成比例变化,程序的原意是通过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< #define ENA_ON() PORTB&=~(1< #define DIR_EXP() PORTB&=~(1< #define DIR_COM() PORTB|= (1< //全局变量 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< //无分频,CTC模式,OC0取反输出方波 TIMSK|=(1< } int main(void) { //上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻 PORTA = 0xFF; //不用的管脚使能内部上拉电阻。 PORTC = 0xFF; PORTD = 0xFF; PORTB |=~((1< //初始低电平,三根线,使能,方向和脉冲,接驱动器 DDRB |= ((1< //输出 DIR_COM();//电机正转 Step = 100000;//10000步/圈,转10圈,步进电机设置的是10000步/圈 ENA_ON();//使能电机 timer0_init(); sei(); //使能全局中断 while(Flag == 0) { ;//等待中断 } }