步进电机角度计算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

;//等待中断

}

}

相关文档
最新文档