# 机器人基础--马达驱动器

之前我们做LED试验的时候,如果非常快地开开关关,会看到LED没有熄灭,而是亮度降低了。如果我们也用很快的速度,让马达转一会,停一会,马达也会像LED一样,没有停下来,只是速度慢了哦。

# 情景分析

  1. 我们看到马达上有两条线,一根正极接到电池的正极,一根负极接到电池的负极,接通以后马达就会旋转起来。如果把两根线调换,马达的正极接到电池的负极,马达的负极接到电池的正极,它就会向另一边旋转。如果把两根线都接到电池的正极,或者负极呢?马达是不会旋转的。
  2. 我们给马达通电,马达转动起来了,把电断开,马达转动慢了一点,在没有完全停下来之前再次通电马达又会加速继续旋转,再断开…再通电…再……
    想让马达转快一点,就让它通电的时间长一点。需要马达转慢一点,通电时间就短一点,这样就可以控制马达的速度了。 这个方法叫做脉冲宽度调制,简称PWM。它在控制器内部是由专门硬件实现的,并不需要像在LED试验那样,要由指令来切换开关,在程序中只需要告诉PWM控制器:通电多久,断开多久,它就会自动在端口上输出控制信号。
  3. 现在我们已经知道怎么样让马达转不同的方向和速度了,但是控制器的端口只能提供很少的电流,没办法让马达转动起来,需要用马达驱动模块来把电流放大。OSEPP的马达驱动器TBMotorDriver可以同时为两个马达放大电流,插在控制器上后,马达驱动其中一路接到了11号,12号端口。另一路接到8号,3号端口(控制速度)。为什么一个马达要接2个端口?因为除了想要控制马达的速度,还需要控制转动的方向。其中一个端口用来控制通电和断电,另外一个端口告诉马达驱动把电流方向翻转,马达就会反方向转动。只要在这4个端口上输出相应的信号就可以控制两个马达了。
  4. 在UnoMax控制器上有6个端口可以输出PWM。分别是3,5,6,9,10,11号端口。PWM控制器把时间分成255份,只需要告诉它,每255份里面有多少份是高电平,它就会按照设置不停地工作。我们需要用指令analogWrite(pin,pwm)来告诉控制器,pin是输出PWM的端口,只能是支持PWM的端口哦,pwm是高电平的时间,也就是速度(从0到255)。我们的机器人上是使用3号端口来控制一个马达的转动方向,8号端口用PWM控制马达的速度。另一个马达是12号端口控制方向,11号端口控制速度。analogWrite(pin,pwm)对应积木

# 流程解析

  1. 控制器开机后使用pinMode指令配置端口11,12为输出模式。
  2. 使用digitalWrite指令设置12号端口输出低电平,控制马达的旋转方向。
  3. 使用analogWrite(11,234)指令来设置11号端口的PWM数值为234,控制马达的速度。
  4. 暂停3秒钟,方便观察马达的旋转情况。
  5. 设置12号端口输出高电平,控制马达旋转相反的方向。
  6. 设置11号端口的PWM数值为123,控制马达以较慢的速度转动。
  7. 暂停3秒钟,方便观察马达的旋转情况。
  8. 重复执行:设置11号端口PWM数值为0,马达停止。
uml diagram

# 参考程序

  • oseppBlock IDE 程序

  • Arduino IDE 程序
 void setup() {
     pinMode(12, OUTPUT);     //12号端口配置为输出模式
     pinMode(11, OUTPUT);     //11号端口配置为输出模式
     digitalWrite(12, LOW);   //12号端口输出低电平
     analogWrite(11, 234);    //11号端口通过PWM输出234速度
     delay(3000);             //暂停3秒中,观察马达转动
     digitalWrite(12, HIGH);  //12号端口速度高电平
     analogWrite(11, 123);    //11号端口通过PWM输出123速度
     delay(3000);             //等待3秒钟,观察马达是否向另一方向转动
 }

 void loop() {
     analogWrite(11, 0);     //11号端口通过PWM输出0速度,马达停止
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 运行结果

请注意将机器人悬空,马达将会转动。需要接上电池才能看到效果哦
接通电源,上传程序后,其中一个马达开始转动,3秒中之后,向另一个方向转动,并且速度慢一些。最后停止转动。如果没有看清楚,可以按一下控制器上面的复位按钮或者关掉再打开电源再看一次。

# 课程解读

  1. PWM在运行到暂停指令时,会继续工作吗?PWM是硬件实现的,一旦启动后,会一直工作直到再次设置它,或者断电。
  2. 放置在setup函数中的指令,只会在通电后执行一次,之后就不断地重复执行loop函数中的指令。我们的程序结构中,马达转动,暂停,反过来转动,暂停。每次通电都只会执行一次。而马达停止的指令会不断地执行。但是这些指令并没有改变信号,所以相当于没有执行,就是消磨一下时间。
  3. 把PWM设置成很小的数字,马达会很慢地转动吗?为什么?

# 拓展知识

  1. PWM硬件是用定时器来实现的,定时器定时地不停地数数,从0数到255,再回到0。每次数到0的时候,就把端口设置为高电平,每次数到我们设置的数字时,就把端口设置为低电平。默认情况下,每一秒钟数50遍。通过一些额外的配置,可以设置数到0时输出低电平,数到设置的数字时输出高电平。还可以设置每1秒钟数多少遍。
  2. 定时器一秒钟数多少遍,称为定时器的频率,单位是赫兹。一秒数50遍,就是50赫兹,人耳朵可以听到的频率范围是16到20000赫兹,所以有时我们会听到马达发出声音。如果把频率设置到20000以上,就可以改善马达的噪音问题。
  3. 马达驱动是通过H桥来实现的,H桥内部有4个开关

    控制器给出的信号会通过一定的处理后,控制这4个开关的通和断。当Q1和Q3接通,Q2和Q4断开时,电从马达M的左边流到右边。Q2和Q4接通,Q1和Q3断开时,电从马达M的右边流到左边。
  4. 马达启动时,需要比转动起来后的电流大2.5倍左右,叫做启动电流,每个马达所需要的启动电流是不一样的。没有达到启动电流马达是不会转动起来的。

# oseppBlock操作视频

# ArduinoIDE操作视频