等级考试四级学习小组 加入小组

288个成员 29个话题 创建时间:2019-02-21

电机示例程序详解,四级实操必考内容之一!

发表于2019-03-04 1046次查看

四级等级考试开考以来,两次实操考试都是考察的小车的搭建和程序驱动小车的任务,所以用代码编程来控制电机已经成为四级等级考试的必考内容之一。在这里简单的通过示例程序来讲解一下如何用代码编程来控制电机的正传、反转、停止。供各位老师和学员参考。

在三级考试里只考察图形化模块编程驱动电机,但是四级中是要求用代码编程,对于代码编程比较薄弱的新手来说是一个挑战。但是掌握了方法进行相应的练习还是完全可以掌握的,这部分只是并没有那么深奥。

在这里用的示例套件是芝麻豆主控,我们知道芝麻豆的主控在图形化编程环境中,只有D1、D2、D3三个端口可以接直流电机并驱动电机进行工作。对应的应该是输出模块,注意电机是可以调速的,不是简单的开关数字量,所以在这里这三个端口对应的就是模拟输出。之前的帖子里我讲过 芝麻豆主控的D1、D2、D3端口对应的arduino UNO的管脚分别是:

D1 ——  5、6   (其中5是辅助管脚,6是主管脚)

D2 —— 9、10  (其中9是辅助管脚,10是主管脚) 

D3 —— 3、11 (其中3是辅助管脚,11是主管脚) 

对于arduino UNO主控板3、5、6、9、10、11这些管脚实际上就是模拟输出管脚,也就是具有PWM(脉冲宽度调制)功能的引脚,这些引脚可以通过脉冲宽度调制,来调整占空比,从而实现模拟输出,实现电机调速功能,模拟输出的取值范围是0——255之间。0代表管脚完全关闭,相当于输出电压为0,255表示管脚完全打开,相当于输出电压5V。很明显255的时候电机速度应该是最快的。 0的时候电机是停止的。实际情况由于电机启动需要较大的电流,一般情况下,模拟输出大约在0到120之间的时候,很多电机是启动不起来的,所以建议要想让电机转动,模拟输出的值不能太小。最好大于120。

为什么要用两个模拟引脚去控制一个电机呢?这里是为了实现程序可以控制电机正反转的功能。比如D1端口(5、6)上连接直流电机模块驱动电机。当5引脚输出模拟量255、6引脚输出0的时候,电机是向一个方向最大速度转动,反之,如5引脚输出0,6引脚输出255,那就是以最大速度反转。

以上介绍的是芝麻豆主控接电机的原理,接下来看代码示例程序。想必应该能够看懂了,如果看不懂,请继续阅读我上面的解释。示例程序在本文后面的附件中可以下载,大家可以在示例的基础上进行修改,来体验用代码控制电机的乐趣、希望本文对大家有所帮助。

 /* 
 本程序为D1端口的电机正传反转停止示例程序,本程序只启用了D1、D2和D3端口
 对于芝麻豆主控只有D1、D2和D3端口接电机模块时才可以调节电机速度
 如其他数字端口接电机将不能实现调速。
 */
int D1=6;//端口D1主IO引脚
int D1f=5;//端口D1辅助IO引脚
int D2=10;//端口D2主IO引脚
int D2f=9;//端口D2辅助IO引脚
int D3=11;//端口D3主IO引脚
int D3f=3;//端口D3辅助IO引脚
 /*
int D4=13;//端口D4主IO引脚
int D4f=12;//端口D4辅助IO引脚
int D5=2;//端口D5主IO引脚
int D5f=8;//端口D5辅助IO引脚
int D6=1;//端口D6主IO引脚
int D6f=0;//端口D6辅助IO引脚
int D7=4;//端口D7主IO引脚
int D7f=7;//端口D7辅助IO引脚
int D8=A5;//端口D8主IO引脚
int D8f=A4;//端口D8辅助IO引脚
int ZMDA1=A0;//端口A1IO引脚
int ZMDA2=A1;//端口A2IO引脚
int ZMDA3=A2;//端口A3IO引脚
int ZMDA4=A3;//端口A4IO引脚
 */
//以上声明的变量为芝麻豆主控端口和管脚对应关系,只用了设置了D1、D2、D3端口,其他的均已经注释掉了。

void setup() {
pinMode(D1, OUTPUT);//设置D1端口主管脚模式为输出
pinMode(D1f, OUTPUT);//设置D1端口辅助管脚模式为输出
digitalWrite(D1, 0);
digitalWrite(D1f, 0);
}

void loop() {
 digitalWrite(D1f, 0);
 analogWrite(D1, 255);//D1端口电机全速正传
 delay(1000);
 digitalWrite(D1, 0);
 analogWrite(D1f, 255);//D1端口电机全速反转
 delay(1000);
 digitalWrite(D1, 0);
 digitalWrite(D1f, 0);//D1端口电机停止
 delay(1000);
}

 

ZMDmotor.rar 预览 下载
1回复
  • 2楼 李猛 2019-03-06

    对于小车,至少是双电机来进行驱动的,所以程序需要启用两个端口来接电机。程序只需要将上面的示例程序稍作改动即可。无非就是粘贴程序就可以变化成如下:

    int D1=6;//端口D1主IO引脚
    int D1f=5;//端口D1辅助IO引脚
    int D2=10;//端口D2主IO引脚
    int D2f=9;//端口D2辅助IO引脚
    int D3=11;//端口D3主IO引脚
    int D3f=3;//端口D3辅助IO引脚
    
    
    void setup() {
    pinMode(D1, OUTPUT);//设置D1端口主管脚模式为输出
    pinMode(D1f, OUTPUT);//设置D1端口辅助管脚模式为输出
    pinMode(D2, OUTPUT);//设置D2端口主管脚模式为输出
    pinMode(D2f, OUTPUT);//设置D2端口辅助管脚模式为输出
    digitalWrite(D1, 0);
    digitalWrite(D1f, 0);
    digitalWrite(D2, 0);
    digitalWrite(D2f, 0);
    }
    
    void loop() {
     digitalWrite(D1f, 0);
     analogWrite(D1, 255);//D1端口电机全速正传
     digitalWrite(D2f, 0);
     analogWrite(D2, 255);//D2端口电机全速正传
     delay(1000);
     digitalWrite(D1, 0);
     analogWrite(D1f, 255);//D1端口电机全速反转
     digitalWrite(D2, 0);
     analogWrite(D2f, 255);//D2端口电机全速反转
     delay(1000);
     digitalWrite(D1, 0);
     digitalWrite(D1f, 0);//D1端口电机停止
     digitalWrite(D2, 0);
     digitalWrite(D2f, 0);//D2端口电机停止
     delay(1000);
    }

     

发表回复
你还没有登录,请先 登录或 注册!