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;
}
} 电流不准. 回复【1楼】sadf123
电流不准.
-----------------------------------------------------------------------
我用8050做驱动,12V电压,在恒压条件下,PWM宽度不能代表流过每相线圈的电流大小吗? 细分原理?
页:
[1]