datetime:2023/11/01 10:06
author:nzb

该项目来源于大佬的动手学ROS2

4.电机控制之速度控制实验

前面说到通过控制对应的IO上的PWM占空比即可完成对电机速度的控制。

关于PWM的介绍在ROS2硬件控制篇的舵机控制中已经介绍过了,所以我们知道通过改变PWM的占空比可以实现对输出电压的大小调节。占空比越大,输出电压越高;占空比越小,输出电压越低。

接着我们通过一个实验来验证下

一、新建工程

新建example22_motor_speed_control

image-20230228020753916

二、编写代码

程序的基本思路是,通过检测按键输入来改变占空比的大小,从而控制电机的转速。按下按键后,每次增加0.1的占空比,当占空比达到1.0时,重新从0开始计数。在loop函数中,通过控制AIN1引脚的高低电平来实现PWM信号的输出,从而控制电机的速度。

/**
 * @file main.cpp
 * @author fishros@foxmail.com
 * @brief 电机速度控制
 * @version 0.1
 * @date 2022-12-19
 * 
 * @copyright Copyright (c) 2022
 * 
 */

#include <Arduino.h>

#define AIN1 23  // 电机驱动模块AIN1引脚
#define AIN2 22  // 电机驱动模块AIN2引脚
#define KEY 0    // 按键引脚
#define CYCLE 10 // 定义PWM信号的周期长度,单位为ms

float duty = 0.0; // 定义占空比变量,并初始化为0.0

void setup()
{
  Serial.begin(115200);   // 初始化串口通信
  pinMode(KEY, INPUT);    // 设置按键引脚为输入模式
  pinMode(AIN1, OUTPUT);  // 设置AIN1引脚为输出模式
  pinMode(AIN2, OUTPUT);  // 设置AIN2引脚为输出模式
  digitalWrite(AIN2, LOW);// 设置AIN2引脚为低电平,控制电机转向
}

void loop()
{
  // 检测按键是否按下
  if (digitalRead(KEY) == LOW) 
  {
    delay(50); // 延迟50ms,以防止误触
    // 确认按键已经按下
    if (digitalRead(KEY) == LOW)
    {
      // 等待按键松开,避免连续按下
      while (digitalRead(0) == LOW) 
        ;
      // 每次增加0.1的占空比,当占空比达到1.0时,重新从0开始计数
      duty = duty + 0.1;
      if (duty > 1.0)
        duty = 0;
    }
  }

  // 输出PWM信号控制电机转速
  digitalWrite(AIN1, HIGH);     // 将AIN1引脚设置为高电平
  delay(CYCLE * duty);           // 延迟一段时间,时间长度由占空比决定
  digitalWrite(AIN1, LOW);      // 将AIN1引脚设置为低电平
  delay(CYCLE * (1 - duty));     // 延迟一段时间,时间长度由占空比决定
}

三、测试

将代码下载到主控板上,点击BOOT按键,观察电机转速。

motor_speed_cotrol

四、总结

本节我们通过简单的一个实验学习了如何通过PWM调节电机的PWM,但有一点需要注意,程序中使用了delay函数来控制PWM信号的占空比,这种方法在简单的应用场景下是可行的,但是在需要更高精度的控制场景下可能会产生问题。为了实现更高精度的PWM控制,我们可以采用ESP32的电机PWM控制单元,下一节我们就尝试使用这一开源库实现更精细化的控制。

results matching ""

    No results matching ""