Arduino提供的PWM控制功能入门(2)

电子说

1.3w人已加入

描述

上回我们用 PWM 控制了一盏 LED 灯的亮度,实现了渐明渐暗的效果。今天就来用 PWM 控制一个直流电机的转速,实现逐渐加速,减速的效果。为了能清除看到效果,笔者还专门用拙劣的手工做了一个纸风车,粘到电机转轴上。下面就来动手做实验。

实验器材:

  1. Arduino Uno R3 芯片 x1
  2. Adafruit 电机驱动板(Motor Shield)V1 型 x1
  3. 直流电机 x1
  4. 电线 x2
  5. USB 数据线 x1
  6. PC x1

实验器材一览如下:

电机驱动

注意事项:

Adafruit 电机驱动板是设计成兼容 Arduino Uno R3 芯片的,可以直接堆叠在 Arduino 上连接。

驱动板上的 jumper(在标注 PWRJMP,意为 power jumper 的位置)是用来决定 Arduino 和驱动板是否独立供电的。如果盖上 jumper,则驱动板由 Arduino供电;如果拔掉jumper,则驱动板独立供电。

驱动板若要独立供电,电源接标注 EXT_PWR(意为 external power)的 2 个接口。注意不要接反正负极,否则会烧坏驱动板甚至 Arduino!驱动板上LED 灯亮,表示驱动板供电正常。

实验原理:

PWM 全称 Pulse Width Modulation,它的原理,简而言之,是通过产生持续时间长短不一的数字脉冲,来模拟连续变化的电平(“捏造”模拟信号)。注意芯片上的标识, pin 号旁边有 ~ 符号的表示该 pin 支持 PWM。(更详尽的原理以后再做整理)

实验步骤:

1.连接硬件:

首先将 Adafruit 电机驱动板直接堆叠插在 Arduino 板上,注意数字引脚对数字引脚,模拟引脚对模拟引脚,就可以很容易安装好。效果如图:

电机驱动

b. Arduino 板用 USB 数据线接 PC。这时候 Arduino 和驱动板都有供电,2 个板子上的 LED 灯常亮;

c. 2 条电线穿进电机的 2 个脚,打个小结固定一下,连接顺序现在来说随意。这里提一下电线的准备,用剪刀剪出合适大小的电线后,用剪刀在电线的 2 端各去掉半个手指头长度的包皮,让导线头裸露;

d. 2 条电线另外一端接驱动板上标注 M3(意为 Motor 3)的 2 个脚。用 3 mm 十字螺丝刀拧松 2 个脚的螺丝,把电线放进去 2 只脚的压片下,然后拧紧螺丝,效果如图:

电机驱动

2.下载安装电机驱动库

要用代码控制 Adafruit 电机驱动板,可以使用 Adafruit 提供的库函数,轻松上手。

然后打开 Arduino IDE,在菜单里,点击“项目”->“加载库”->“添加一个新 ZIP 库”,然后选择刚刚下载的 ZIP 压缩包就可以了。

3.编写程序

#include < AFMotor.h >

// 因为电机装在驱动板的 M3 位置,所以第一个参数是 3
// 第 2 个参数是 PWM 频率,如果电机接在 M1-M2 位上,则参数可选
// MOTOR12_64KHZ
// MOTOR12_8KHZ
// MOTOR12_2KHZ 
// MOTOR12_1KHZ
// 如果电机接在 M3-M4 位上,则参数可选
// MOTOR34_64KHZ
// MOTOR34_8KHZ
// MOTOR34_1KHZ
AF_DCMotor motor(3, MOTOR34_64KHZ);

void setup() {
    // 选择串口 Baud 率
    Serial.begin(9600);
    Serial.println("Motor test!");
}

void loop() {
    Serial.println("tick");
    // 设置电机向前运转
    motor.run(FORWARD);
    // 不断加速
    for (int i = 0; i < 255; i++) {
        motor.setSpeed(i);
        // 等待 0.1 s 让电机充分加速
        delay(100);
    }
    // 让电机恒速运转 10 s
    delay(10000);
    // 不断减速
    for (int i = 255; i > 0; i--) {
        motor.setSpeed(i);
        // 等待 0.1 s 让电机充分减速
        delay(100);
    }

    Serial.println("tock");
    // 释放电机,不运转
    motor.run(RELEASE);
    // 停转 1 s
    delay(1000);

    Serial.println("tack");
    // 设置电机向后运转
    motor.run(BACKWARD);
    // 不断加速
    for (int i = 0; i < 255; i++) {
        motor.setSpeed(i);
        // 等待 0.1 s 让电机充分加速
        delay(100);
    }
    // 让电机恒速运转 10 s
    delay(10000);
    // 不断减速
    for (int i = 255; i > 0; i--) {
        motor.setSpeed(i);
        // 等待 0.1 s 让电机充分减速
        delay(100);
    }

    Serial.println("tock");
    // 释放电机,不运转
    motor.run(RELEASE);
    // 停转 1 s
    delay(1000);
}

烧录到 Arduino 芯片上,可以看到电机按照我们设计的一样,先正向加速运转,然后恒速转动 10 秒,然后减速运转,停顿 1 秒,然后反向加速运转,恒速转动 10 秒,然后减速运转,停顿 1 秒,周而复始。

最后,为了更加明显的看到电机的转动,笔者给小电机安上了一个粗糙的纸风车,效果如下:

电机驱动

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分