搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 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.

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 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[mp->step_counter] );

}



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

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

出0入0汤圆

 楼主| 发表于 2008-10-16 19:16:20 | 显示全部楼层
PC口我只用了前四根作为数据线.DDRC=0XF,我只是输出低四位而已.另外,延长时间的做法,我也试过了.数据线,我也认真看过了,应该没错.

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



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

出0入0汤圆

发表于 2008-10-16 19:04:07 | 显示全部楼层
另外, 你的驱动电路长啥样子, 想学习学习

出0入0汤圆

发表于 2008-10-16 19:03:34 | 显示全部楼层
还有小错误,

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



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

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



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

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

出0入0汤圆

发表于 2008-10-16 18:56:38 | 显示全部楼层
1, 确认ABCD四跟线没有接错

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

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

4, 加长你的延时时间, 最好用库里的_delay_ms(100);
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-15 10:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表