电子说
上回我们用 PWM 控制了一盏 LED 灯的亮度,实现了渐明渐暗的效果。今天就来用 PWM 控制一个直流电机的转速,实现逐渐加速,减速的效果。为了能清除看到效果,笔者还专门用拙劣的手工做了一个纸风车,粘到电机转轴上。下面就来动手做实验。
实验器材:
实验器材一览如下:
注意事项:
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 秒,周而复始。
最后,为了更加明显的看到电机的转动,笔者给小电机安上了一个粗糙的纸风车,效果如下:
全部0条评论
快来发表一下你的评论吧 !