请各位帮我看看程序,为什么不能转动步进电机 【恢复】
程序运行时,步进电动机只是又转一小步,后又左转回一小步,根本没完成一圈的转动,请教大家下列程序有什么问题.步进电动机:
型号:日本生产,PX243-11A-C18
2相6线
1.8度/step
DC 4V 0.95A
#include <avr/io.h>
#define motoa 0 //pc0
#define motob 1 //pc1
#define motoc 2 //pc2
#define motod 3 //pc3
static void io_init(void)
{
PORTC = 0x0;
DDRC = 0xf;
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
{
delay_1ms();
}
}
int main(void)
{
io_init();
while(1)
{
PORTC=(1<<motoa)|(1<<motob);
delay_nms(80);
PORTC=(1<<motob)|(1<<motoc);
delay_nms(80);
PORTC=(1<<motoc)|(1<<motod);
delay_nms(80);
PORTC=(1<<motod)|(1<<motoa);
delay_nms(80);
}
}
本贴被 liurengui 编辑过,最后修改时间:2008-10-16,19:09:49. 我的代码类似这样
const char halfstep_table[] = {
0x0a, 0x08, 0x09, 0x01, 0x05, 0x04, 0x06, 0x02 /* ABCD */
};
#define SETPHAS(a) PORTx = xxxx
inline void _halfstep()
{
if (mp->dir == 0)
mp->step_counter++;
else // mp->dir == 1
mp->step_counter--;
if (mp->step_counter>= 8)
mp->step_counter = 0;
else if (mp->step_counter <= -1)
// mp->step_counter = 8 - 1; /* WHY CANNOT USE SIZEOF HERE?! */
mp->step_counter = sizeof(halfstep_table) - 1;
SETPHASE( halfstep_table );
}
这是半步走发, 你改一些相表, 和表长就是整步的。
还可以走微步, 当然需要其它的处理。 PC口我只用了前四根作为数据线.DDRC=0XF,我只是输出低四位而已.另外,延长时间的做法,我也试过了.数据线,我也认真看过了,应该没错.
我的驱动是通过四个D882三极管驱动四个数据线.
请问你有没有一个范例给我参考一下,我不甚感激! 另外, 你的驱动电路长啥样子, 想学习学习 还有小错误,
DDRC = 0xf; // 0xf != 0xff
你的主循环里, 跑上一圈, ABCD不是全变成高啦?
好的的做法是, 把你认为正确的相序写在一个数组里, 然后通过index给PORT赋值
再推荐你一个写法, 利用avr libc里的宏_BV()来进行bit操作看上去更清晰
本贴被 chopin1998 编辑过,最后修改时间:2008-10-16,19:09:49. 1, 确认ABCD四跟线没有接错
2, 确认电机是好的(包含接头)
3, 确认代码里给出的时序!!!
4, 加长你的延时时间, 最好用库里的_delay_ms(100);
页:
[1]