如何控制电机速度

2019-07-15 18:28发布

本帖最后由 11hyliang1 于 2014-9-23 17:01 编辑

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit ENA=P1^5;
sbit ENB=P1^6;
uchar c,a,b,temp,flag,flag1;
void rec_data();
void delay(uint);void qianjin();
void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SCON=0X50;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        PCON=0x00;
        P1=0XFF;
        flag=0;

        while(1)
        {
                if(flag1==1)
                {
                switch(a)
            {
                    case 0x11: qianjin();break;               
//               case 0x22: D1=1;D2=0;D3=0;D4=1;break;               
  //              case 0x33: D1=0;D2=1;D3=0;D4=1;break;              
  //              case 0x44: D1=1;D2=0;D3=1;D4=0;break;                     
   //             case 0x00: D1=0;D2=0;D3=0;D4=0;break;                     
                default: break;
                        }
                        flag1=0;
                }
         }
}
void rec_data()
{
        uchar c;
        c=SBUF;
        switch(flag)

        {
                case 0:if(c==0xfc){flag=1;} else flag=0;break;
                case 1:if(c!=0xff){flag=2;a=SBUF;} else flag=0;break;
                case 2:if(c==0xfc||c==0x0d||c==0x1e||c==0x2f||c==0x41){flag=3;flag1=1;flag=0;} else flag=0;break;
                default: break;
        }
}

void serial() interrupt 4
{
                ES=0;
                if(RI==1)
                {
                        RI=0;
                        rec_data();
                }
                ES=1;
}

void qianjin()
{
        uint cycle=0,T=500;
        D1=1;
        D2=0;
        while(cycle!=T)
        {
                ENA=1;
                delay(cycle++);
                ENA=0;
                delay(T-cycle);
        }
               
}

void delay(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
如何才能控制电机处于一个较慢的速度转动,太快了,不需要精确具体速度是多少,就尽量减慢转速就行,像我那样写不太理想,因为好像慢慢加速完了就会停止了,我希望进入qianjin函数后,如果我没有发送任何信号,电机能一直恒速、低速前进,另外在不大改动我的代码的情况下,应该怎么写代码
忘记说了,是用的L298驱动模块驱动的


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
wamvsq
1楼-- · 2019-07-15 23:41
沙发我的
                                            
11hyliang1
2楼-- · 2019-07-16 01:52
总结一下就算结束帖子了,我去看了一下PWM的原理,和我上面写的完全不是一码事,PWM是改变占空比的,所以怎么调节一个周期内,高电平的持续时间就是重点,这是我的想法:
aa=1;
n=30;
.....
void timer0() interrupt 1
{
        if(aa==1)
        {
                TH0=(65535-(100-n)*50)/256;
                TL0=(65535-(100-n)*50)%256;
                ENA=0;
                ENB=0;
        }
        else
        {
                TH0=(65535-n*50)/256;
                TL0=(65535-n*50)%256;
                ENA=1;
                ENB=1;       
        }
        aa=~aa;
}
这相当于一个周期,高电平只占周期的n/100,也就是想要占多少,n就等多少,等于原来给一1秒的高电平现在只给1/3秒,这样电机就会大大减速,这是我的理解,也不知对不对,实测,程序可行,很好的减速效果,希望大家一起学习交流~~
清寒素尘
3楼-- · 2019-07-16 06:58
 精彩回答 2  元偷偷看……
11hyliang1
4楼-- · 2019-07-16 07:48
本帖最后由 11hyliang1 于 2014-9-23 22:53 编辑
清寒素尘 发表于 2014-9-23 21:37
看看如果延时长一些会不会可以?

延长可以,不过转弯就不知怎么弄了,电机一个正,一个反,只会在原地打圈,还是说转太快了就会原地打圈,想用两个定时器,但上面波特率设置已经用了定时器了,而且有时开着开着就停了,发送什么指令都没用,去手动弄一下轮子又可以跑,不知是摩擦太大还是怎么回事,电池我测了一下,电力很足
lqwuliang
5楼-- · 2019-07-16 10:25
我个人觉得,DA去控制电机比用PWM去控制电机要稳定
11hyliang1
6楼-- · 2019-07-16 14:53
lqwuliang 发表于 2014-9-23 23:32
我个人觉得,DA去控制电机比用PWM去控制电机要稳定

自己做的最小系统,没办法,只能用PWM,现在是前进后退都慢下来了,但转弯还是很快,直接就在原地打圈了,现在一个定时器设置波特率了,一个定时器控制前进后退,如果转弯也用,就显得特别快,不知怎么处理

一周热门 更多>