|
我最做了一个用ATmega16和带细分的驱动A3955控制两相四线步进电机的项目。由于要控制两个相同的电机因此我用到四个A3955并用到ATmega16的A口和C口作为电机控制表输出口。我按照A3955说明书提供的8细分电机控制表编写了一个测试程序,目的让两个电机不停的转动,程序如下
//ICC-AVR application builder : 2006-10-9 17:15:10
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include <stdio.h>
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0xFF; //m103 output only
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0x00;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
//---------------------- 延时函数 ----------------------
void delay_1us(void)
{
asm("nop");
}
void delay_us(unsigned int n)
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
//----------------------电机控制表----------------------
uchar lnp, rnp;
const uchar motortbr[] = {0x99,0xB7,0xD5,0xF3,0xF1,0xF2,0xD4,0xB6,
0x98,0x7A,0x5C,0x3E,0x1E,0x2E,0x4C,0x6A,
0x88,0xA6,0xC4,0xE2,0xE0,0xE3,0xC5,0xA7,
0x89,0x6B,0x4D,0x2F,0x0F,0x3F,0x5D,0x7B};
const uchar motortbl[] = {0x99,0xD7,0xB5,0xF3,0xF1,0xF2,0xB4,0xD6,
0x98,0x7A,0x3C,0x5E,0x1E,0x4E,0x2C,0x6A,
0x88,0xC6,0xA4,0xE2,0xE0,0xE3,0xA5,0xC7,
0x89,0x6B,0x2D,0x4F,0x0F,0x5F,0x3D,0x7B};
//---------------------主函数---------------------------
void main(void)
{
port_init(); //端口初始化
lnp = 0;
rnp = 0;
while(1)
{
PORTC = motortbr[rnp];
if(rnp == 31)
rnp = 0;
else
rnp++;
PORTA = motortbl[lnp];
if(lnp == 31)
lnp = 0;
else
lnp++;
delay_us(2);
}
}程序很简单,烧入程序后发现其中一个电机转动没有问题另一个电机却出现问题,另一个电机转动几圈以后会颤动几下后继续转动或者变为反转。说明一下两个电机的控制表是不同的因为制版时由于疏忽将两个IO口与A3955的相应口接反了,但是本人认为两个控制表均没有问题。至于为什么会出现一个电机工作不正常本人百思不得其解请那位能够帮忙分析一下 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|