搜索
bottom↓
回复: 8

51控制步进电机 ,震动太厉害,怎么回事啊,求高手帮我优化一下程序!!!!

[复制链接]

出0入0汤圆

发表于 2011-11-17 20:27:06 | 显示全部楼层 |阅读模式
#include <AT89X51.h>

static unsigned int count;
static int step_index;

void delay(unsigned int endcount);
void gorun(bit turn, unsigned int speedlevel);

void main(void)
{
        count = 0;
        step_index = 0;
        P1_0 = 0;
        P1_1 = 0;
        P1_2 = 0;
        P1_3 = 0;


        EA = 1;             //允许CPU中断
        TMOD = 0x11; //设定时器0和1为16位模式1
        ET0 = 1;            //定时器0中断允许
       
        TH0 = 0xFE;
        TL0 = 0x0C; //设定时每隔0.5ms中断一次
        TR0 = 1;         //开始计数

        do        {
                    gorun(1,10);
                }while(1);

}

//定时器0中断处理           
void timeint(void) interrupt 1
{
        TH0=0xFE;
        TL0=0x0C; //设定时每隔0.5ms中断一次
        count++;
}

void delay(unsigned int endcount)
{
        count=0;
        do{}while(count<endcount);
}

void gorun(bit turn,unsigned int speedlevel)
{
        switch(step_index)
        {
                case 0:
                    P1_0 = 1;
                    P1_1 = 0;
                    P1_2 = 0;
                    P1_3 = 0;
                    break;
                case 1:
                    P1_0 = 1;
                    P1_1 = 0;
                    P1_2 = 1;
                    P1_3 = 0;
                    break;
                case 2:
                    P1_0 = 0;
                    P1_1 = 0;
                    P1_2 = 1;
                    P1_3 = 0;
                    break;
                case 3:
                    P1_0 = 0;
                    P1_1 = 1;
                    P1_2 = 1;
                    P1_3 = 0;
                    break;
                case 4:
                    P1_0 = 0;
                    P1_1 = 1;
                    P1_2 = 0;
                    P1_3 = 0;
                    break;
                case 5:
                    P1_0 = 0;
                    P1_1 = 1;
                    P1_2 = 0;
                    P1_3 = 1;
                    break;
                case 6:
                    P1_0 = 0;
                    P1_1 = 0;
                    P1_2 = 0;
                    P1_3 = 1;
                    break;
                case 7:
                    P1_0 = 1;
                    P1_1 = 0;
                    P1_2 = 0;
                    P1_3 = 1;
        }
       
        delay(speedlevel);
       
        if (turn==0)
        {
            step_index++;
            if (step_index>7)
              step_index=0;
        }
        else
        {
            step_index--;
            if (step_index<0)
              step_index=7;
        }
   
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-12-28 23:09:19 | 显示全部楼层
一般只有细分能解决这个问题吧。

出0入0汤圆

发表于 2011-12-29 01:16:53 | 显示全部楼层
时序跑飞了。去看看你的步进电机的时序图吧。只要把时序和步进电机的时序对准时就不会震得那么历害了。。

出0入0汤圆

发表于 2011-12-29 03:36:27 | 显示全部楼层
细分,或者是启动转速太快

出0入0汤圆

发表于 2011-12-29 11:43:08 | 显示全部楼层
回复【4楼】shenrongze shenrongze
-----------------------------------------------------------------------

要细分才行。

出0入0汤圆

发表于 2011-12-29 22:24:20 | 显示全部楼层
应该是太快了,10个周期很短;如果还抖可以考虑换个电机或者电路试试。

出0入0汤圆

发表于 2012-2-10 21:00:36 | 显示全部楼层
没有细分是这样的了

出0入0汤圆

发表于 2012-2-26 17:27:44 | 显示全部楼层
不一定要细分。不过震动大说明你的电机时序是不对的。看你 “TL0=0x0C; //设定时每隔0.5ms中断一次”  基本判断是启动速度太快了所致。  建议你修改一下定时值低速跑一个看看效果。行的话,问题就找到了。之后的策略就是低速起步后再慢慢的变速至你希望的速度。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 23:42

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

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