# 3.电机控制之正反转实验 你好,我是小鱼。前面说到通过控制对应的IO电平变换即可完成对电机正反转的控制,本节我们尝试编写代码,进行实验。 ## 一、新建工程 新建`example21_motor_direction_control` ![image-20230228001904027](3.%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6%E4%B9%8B%E6%AD%A3%E5%8F%8D%E8%BD%AC%E5%AE%9E%E9%AA%8C/imgs/image-20230228001904027.png) ## 二、编写代码 根据第前面硬件控制章节学到的内容可知,控制IO电平只需要使用`pinMode`和`digitalWrite`相关函数即可。 ```cpp /** * @file main.cpp * @author fishros@foxmail.com * @brief 电机正反转控制 * @version 0.1 * @date 2022-12-19 * * @copyright Copyright (c) 2022 * */ #include #define AIN1 23 // 电机驱动模块AIN1引脚 #define AIN2 22 // 电机驱动模块AIN2引脚 #define KEY 0 // 按键引脚 int motorStatus = 0; // 电机状态变量,0-3循环变化 void setup() { Serial.begin(115200); // 初始化串口通信 pinMode(KEY, INPUT); // 设置按键引脚为输入模式 pinMode(AIN1, OUTPUT); // 设置AIN1引脚为输出模式 pinMode(AIN2, OUTPUT); // 设置AIN2引脚为输出模式 } void loop() { if (digitalRead(KEY) == LOW) // 检测按键是否按下 { delay(50); // 延迟50ms,以防止误触 if (digitalRead(KEY) == LOW) { while (digitalRead(0) == LOW) // 等待按键松开,避免连续按下 ; motorStatus++; // 切换电机状态 motorStatus = motorStatus % 4; // 保持该变量值在0-4之间 } } // 根据电机状态切换IO电平 switch (motorStatus) { case 0: Serial.println("AIN1: HIGH, AIN2: LOW"); // 调试信息:AIN1为高电平,AIN2为低电平 digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); break; case 1: Serial.println("AIN1: LOW, AIN2: HIGH"); // 调试信息:AIN1为低电平,AIN2为高电平 digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); break; case 2: Serial.println("AIN1: HIGH, AIN2: HIGH"); // 调试信息:AIN1和AIN2均为高电平 digitalWrite(AIN1, HIGH); digitalWrite(AIN2, HIGH); break; case 3: Serial.println("AIN1: LOW, AIN2: LOW"); // 调试信息:AIN1和AIN2均为低电平 digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); break; default: break; } } ``` 代码解释 在setup函数中,通过pinMode函数将KEY、AIN1和AIN2引脚设置为对应的输入输出模式。 在loop函数中,首先通过digitalRead函数检测按键是否按下,如果检测到按键按下,则会将电机状态变量motorStatus加1,然后通过switch语句根据电机状态改变AIN1和AIN2引脚的电平状态。同时,还会通过Serial.println函数将AIN1和AIN2引脚的电平状态输出到串口,方便调试。 ## 三、测试 将代码下载到FishBot主控板上,点击按键,查看轮子转动效果。 ![a](3.%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6%E4%B9%8B%E6%AD%A3%E5%8F%8D%E8%BD%AC%E5%AE%9E%E9%AA%8C/imgs/a.gif) 你可以发现,当AIN1和AIN2同时为高电平或者同时为低时,电机并不会转动,符合上一节中对H桥的介绍。 ## 四、总结 本节我们成功通过代码验证了上一节电机控制理论,下一节我们尝试通过PWM的占空比控制电机的转速。