liurengui 发表于 2008-10-16 18:49:55

请各位帮我看看程序,为什么不能转动步进电机 【恢复】

程序运行时,步进电动机只是又转一小步,后又左转回一小步,根本没完成一圈的转动,请教大家下列程序有什么问题.



步进电动机:

型号:日本生产,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.

chopin1998 发表于 2008-10-16 21:08:31

我的代码类似这样



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 );

}



这是半步走发, 你改一些相表, 和表长就是整步的。

还可以走微步, 当然需要其它的处理。

liurengui 发表于 2008-10-16 19:16:20

PC口我只用了前四根作为数据线.DDRC=0XF,我只是输出低四位而已.另外,延长时间的做法,我也试过了.数据线,我也认真看过了,应该没错.

我的驱动是通过四个D882三极管驱动四个数据线.



请问你有没有一个范例给我参考一下,我不甚感激!

chopin1998 发表于 2008-10-16 19:04:07

另外, 你的驱动电路长啥样子, 想学习学习

chopin1998 发表于 2008-10-16 19:03:34

还有小错误,

DDRC = 0xf; // 0xf != 0xff



你的主循环里, 跑上一圈, ABCD不是全变成高啦? 

好的的做法是, 把你认为正确的相序写在一个数组里, 然后通过index给PORT赋值



再推荐你一个写法, 利用avr libc里的宏_BV()来进行bit操作看上去更清晰

本贴被 chopin1998 编辑过,最后修改时间:2008-10-16,19:09:49.

chopin1998 发表于 2008-10-16 18:56:38

1, 确认ABCD四跟线没有接错

2, 确认电机是好的(包含接头)

3, 确认代码里给出的时序!!!

4, 加长你的延时时间, 最好用库里的_delay_ms(100);
页: [1]
查看完整版本: 请各位帮我看看程序,为什么不能转动步进电机 【恢复】