czjrd 发表于 2011-3-8 10:48:54

ATMage16做步进电机驱动器,实现1/2/4/8细分

电机是4相5线的,整步、半步没问题,可1/4和1/8细分时步距不均匀,怎么回事?请高手指点。

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define uchar unsigned char

unsigned char mtpa=0,mtpb=8,mtpc=16,mtpd=24;//电机各相位置指针
unsigned char mts=4;//电机工作方式:1整步,2半步,3四分之一步,4八分之一步
unsigned char mtd=0;//电机转动方向:0正转,1反转
unsigned char mtps=0; //电机指针每次移动量
unsigned char mtpm=32;
unsigned char mtv={0,49,97,141,180,212,235,250,255,250,235,212,180,141,97,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void mt_go(void)
{
if(mtd==0)
{
   mtpa+=mtps;
   if(mtpa>=mtpm) mtpa-=mtpm;
   mtpb+=mtps;
   if(mtpb>=mtpm) mtpb-=mtpm;
   mtpc+=mtps;
   if(mtpc>=mtpm) mtpc-=mtpm;
   mtpd+=mtps;
   if(mtpd>=mtpm) mtpd-=mtpm;
}
else
{
   if(mtpa<=mtps-1) mtpa=mtpm;
   mtpa-=mtps;
   if(mtpb<=mtps-1) mtpb=mtpm;
   mtpb-=mtps;
   if(mtpc<=mtps-1) mtpc=mtpm;
   mtpc-=mtps;
   if(mtpd<=mtps-1) mtpd=mtpm;
   mtpd-=mtps;
}
OCR1A = mtv;
OCR1B = mtv;
OCR0 = mtv;
OCR2 = mtv;
}
int main(void)
{
unsigned int i;
PORTB=0x00;   
DDRB=0xFF;
PORTD=0x00;   
DDRD=0xFF;   
TCCR0=0x69;   //快速PWM, TOP=255
TCCR1A=0xA1;
TCCR1B=0x09;
TCCR2=0x69;
switch(mts)
{
   case 1:mtps=8;break;
   case 2:mtps=4;break;
   case 3:mtps=2;break;
   case 4:mtps=1;break;
}
OCR1A = mtv;
OCR1B = mtv;
OCR0 = mtv;
OCR2 = mtv;
i=6000;
while (1)
{
mt_go();
_delay_us(i);
if(--i<100) i=100;
}   
}

sadf123 发表于 2011-3-8 12:06:28

电流不准.

czjrd 发表于 2011-3-8 12:34:07

回复【1楼】sadf123
电流不准.
-----------------------------------------------------------------------

我用8050做驱动,12V电压,在恒压条件下,PWM宽度不能代表流过每相线圈的电流大小吗?

mahongtu870204 发表于 2011-8-24 06:49:34

细分原理?
页: [1]
查看完整版本: ATMage16做步进电机驱动器,实现1/2/4/8细分