首页 > 其他分享 >ros - slam - 电机控制之速度控制实验

ros - slam - 电机控制之速度控制实验

时间:2024-07-02 10:19:33浏览次数:16  
标签:控制 PWM AIN1 引脚 电机 slam 占空比 ros

前面说到通过控制对应的IO上的PWM占空比即可完成对电机速度的控制。
关于PWM的介绍在ROS2硬件控制篇的舵机控制中已经介绍过了,所以我们知道通过改变PWM的占空比可以实现对输出电压的大小调节。占空比越大,输出电压越高;占空比越小,输出电压越低。
接着我们通过一个实验来验证下

一、新建工程
新建example22_motor_speed_control

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

/**
 * @file main.cpp
 * @author [email protected]
 * @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按键,观察电机转速。

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

标签:控制,PWM,AIN1,引脚,电机,slam,占空比,ros
From: https://www.cnblogs.com/ai-ldj/p/18279378

相关文章

  • ros microros 之 电机控制之正反转实验
    前面说到通过控制对应的IO电平变换即可完成对电机正反转的控制,本节我们尝试编写代码,进行实验。一、新建工程新建example21_motor_direction_control二、编写代码根据第前面硬件控制章节学到的内容可知,控制IO电平只需要使用pinMode和digitalWrite相关函数即可。/***@filem......
  • asp.net Core中控制器的两个基类ApiController和Controller
    1、Controller就是我们平常建的控制器  publicclassStudyontroller:Controller。2、ApiController这个我平常很少使用,今天发现了研究了一下,值得学习,一个很不错的控制器基类。   新建一个ApiController的步骤:  请求对应的方法就是通过请求提交数据的方式......
  • ros slam 之移动机器人常用传感器
    本节我们对移动机器人底盘结构进行简单的介绍,并着重介绍FishBot基础版的组成结构。对于一个移动底盘来说,所要提供的核心功能有两个-感知和执行能力,我们分别进行介绍。一、感知-传感器所谓感知即通过给类传感器获取环境信息的能力。在移动机器人中,我们常用的传感器有 距离传......
  • ros slam microros之H电桥电机驱动原理介绍
    一、电机驱动原理介绍正式编写代码前,我们先了解下电机驱动的原理,以便于我们了解我们如何才能通过代码控制电机的转速和正反转。1.1H桥电路让电机动起来只需要通电就行,比如我们用的额定电压为12V130RPM的电机,当给到12V的电压时可以达到额定转速130转/分,但如果我们给8V的电压,此时......
  • delphi Image32 变形控制
    先看动画:  代码:1unituFrmTransform;23interface45uses6Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,7System.Types,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,8Vcl.Dialogs,Vcl.Menus,Vc......
  • tc 动态控制带宽
    在模拟网络情况的时候不可避免的会要模拟动态网络变化,常用的有mahimahi和tc,mahimahi自己设置trace文件,每一行内容为这一毫秒发送了多少数据即可动态控制,而tc一般利用命令行控制,所以需要一点shell脚本基础。首先是shell的数组建立:band(010203020100)shell中数组利用space......
  • 基于dspic33ck64mp105的电机控制器开发①
    原理图是基于microchip官方的MCP1722_Power_Tools参考设计而来,修改部分如下:https://www.microchip.com/en-us/tools-resources/reference-designs/portable-power-tool-reference-design1,修改了电源模块2,修改了栅极驱动3,增加了蓝牙通信模块4,修改了原版AUX的端口5,增加了一个LED......
  • 46、k8s-安全认证-访问控制
    kubernetes作为一个分布式集群的管理工具、保证集群的安全性是一个很重要的任务、所谓的安全性其实就是保证对kubernetes的各种客户端进行认证和鉴权的操作客户端:在kubernetes集群中、客户端通常有两类·UserAccount:一般是独立于kubernetes之外的其它服务管理的用户账号......
  • 流程控制
    流程控制1、Scanner输入 //创建一个scanner对象,用于接收键盘数据Scannerscanner=newScanner(System.in);//判断用户有没有输入字符串if(scanner.hasNext()){Strings=scanner.next();System.out.println("输出的......
  • Unity 导航路线生成,小地图同步映射, 经过以后地图与小地图删除点位(点击小地图控制导航
    效果:(如下图所示)操作方法:搭建小地图UI截取图片创建地面挂载如下代码:usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;[RequireComponent(typeof(MeshFilter),typeof(MeshCollider),typeof(MeshRenderer))]publicclassMap:Mo......