从零开始搭建ROS移动机器人系列之(四)直流电机PWM调速
“ 好久没更新了,最近忙着换工作了。”
前面几期好像把硬件部分的搭建说完了,从这期开始讲讲软件吧,先说说直流电机的控制。这部分可以看作是整个系统运行起来的第一步吧,有了这部分内容,前面搭建起来的机器人硬件就可以运作起来了,你的小车就可以放地上跑起来了。
01
—
PWM
PWM(Pulse Width Modulation),即脉冲宽度调制,是利用微处理器的数字输出对模拟电路进行控制的一种技术,其控制简单灵活、动态响应好,广泛应用于工业测控、功率控制,电机控制、开关电源以及音频放大器等领域。
PWM通过使用高分辨率计数器调整输出信号的占空比,实现用数字信号控制模拟信号。PWM信号是数字信号,在任一时刻,电源只有通(1)或断(0)两种状态,电源是以重复脉冲序列加到模拟负载上的。
如图所示,一个PWM的周期内包括一段高电平和一段低电平,其中高电平时间即为脉宽时间,PWM的占空比即为脉宽时间与PWM周期的比值。实际应用中,通过改变占空比来实现控制。
下面以一个电压控制的例子解释PWM的控制实现方法。
如图所示,假设高电平为5V,低电平为0V,当设置PWM的占空比为50%,则实际输出电压值为5V*50%=2.5V,同理,当占空比设置为75%或20%时,则对应的输出电压值分别为3.75V和1V,从而实现了电压的调制输出。由此可见,只要我们设置不同的占空比,理论上就可以将输出电压调制为任意值。
02
—
代码实现
通过STM32单片机的定时器生成PWM信号。
STM32原理与应用就不讲了,可以自行去学习。 这里直接给出代码。笔者用了STM32CUBEMX进行开发,这个软件是ST自己的软件,相当于是内置了stm32的HAL库,相当于引脚配置这部分的代码不需要自己再手写了,省去了造轮子的时间,开发人员只需要把精力放在业务代码的实现上,大大提高了开发效率。当然如果读者习惯了用标准库函数开发,也可以自己决定使用哪种。
说一下CUBEMX的配置吧。这块具体的配置内容,包括引脚号啥的跟前面硬件的连接那部分是相关的,读者自行对照着看即可。
首先就是要选择单片机型号,即stm32f103c8t6。
双击以后就会自动生成工程。
设置时钟源为外部晶振。
设置时钟频率为72MHz
开启SW仿真调试。
设置定时器TIM1生成两路PWM信号。
设置电机驱动模块的两路电机输入引脚。注意设置为推挽输出。
这样的话,单片机就配置完了。然后设置一下代码生成规则。
此处MDK版本对照你电脑上安装的版本即可。
点击生成代码。
点击打开工程即可。然后就自动用KeilMDK软件打开了。
这是自动生成的引脚配置的代码。
再写一点设置PWM的代码。
#include "stm32f1xx_hal.h"
#include "pwm.h"
#include "tim.h"void Set_pwm(signed short left, signed short right)
{if(left >= 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, left);}else{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, -left);}if(right >= 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_4, right);}else{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_4, -right);}
}
然后在主函数里开启PWM,再调用Set_pwm函数就可以了。
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);/* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){Set_pwm(1000,1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
编译通过后下载进单片机就可以看到电机已经可以转起来了。读者也可以尝试改变Set_pwm函数的参数大小,可以发现电机转速会随着参数值的变化而变化。至此就实现了直流电机的PWM调速。
从零开始搭建ROS移动机器人系列之(四)直流电机PWM调速相关推荐
- 从零开始搭建ROS移动机器人系列之(一)预备知识及总体框架
" 笔者2020年初次接触ROS,2021年参加工作以后,愈发对ROS产生浓厚的兴趣,渴望拥有一台ROS机器人,淘宝上一搜再搜,发现有很多现成的产品,但是价格属实让人望而却步,遂产生了自己搭 ...
- 基于51单片机直流电机PWM调速设计
具体实现功能 系统由STC89C52单片机.LCD1602液晶显示屏.霍尔测速传感器.3V直流电机.按键模块构成. 具体功能: 1.采用霍尔传感器非接触式测电机转速: 2.LCD1602液晶显示当前的 ...
- 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)
编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...
- 直流电机PWM调速系统中控制电压非线性研究
由于线性放大驱动方式效率和散热问题严重,目前绝大多数直流电动机采用开关驱动方式.开关驱动方式是半导体功率器件工作在开关状态,通过脉宽调制PWM控制电动机电枢电压,实现调速.本文通过实验验证,在不带电机 ...
- pwmc语言调速程序_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...
设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...
- PIC16 F887 单片机 直流电机PWM调速 PID调速 PID算法
直流电机PWM调速:使用将直流电机转速转换为脉冲频率,测量出电机的转速,与写入到单片机的EEPROM里的脉冲设定值进行比较产生偏差,若偏差为正值则电机减速,偏差为负值则加速,并在LCD上显示电机的转速 ...
- 【Proteus仿真】51单片机+直流电机PWM调速实验
[Proteus仿真]51单片机+直流电机PWM调速实验 Proteus仿真 采用L293驱动直流电机 -PWM是采用定时器中断实现 /******************************** ...
- 51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)
设计思路 直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部 ...
- uln2803驱动直流电机电路图_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...
设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...
- 基于L298N的STM32的直流电机PWM调速控制
这两天研究了一下基于L298N与stm32的直流电机调速,实验结果良好,可以根据调节STM32的PWM占空比来进行直流电机的调速.实验系统图如下: 首先整个PWM实验选用的是stm32f103系列,驱 ...
最新文章
- AVFoundation学习Demo--拍摄视频
- 关于“xxx”object is not callable的异常(转)
- Java线程问题问答
- 【转】UITableView详解(UITableViewCell
- 二维数组按行和按列遍历的效率
- Tensorflow基础语法和概念
- Java语言基础-反射机制、正则表达式
- 超详细java中的ClassLoader详解
- Ubuntu Tty (字符终端) 显示中文,和字体大小设置
- 如何修复金蝶专用版服务器,金蝶KIS专业版常见问题及解决方法
- java graphics 模糊_使用Graphics2D模糊Java背景
- 对话管理DST:Deep Neural Network Approach for the Dialog State Tracking Challenge
- 在跑SC-LEGO-LOAM时报错[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloude
- 来来来!java程序员个人优势
- usaco 2012 Open【Running Laps奶牛赛跑】
- WEBIX JavaScript UI 10.0.4 Crack
- 一款赛丽麦进销存软件V0.99-9已开源,永久免费,Mysql数据库
- java 微博客户端_记一个Android微博客户端的开发
- 写函数:自己写一个作图函数就是这么简单
- 无法在 Safari 浏览器中打开网站如何解决?
热门文章
- 一篇文章带你解决 Unable to infer base url. This is common when using dynamic servlet registra
- firewalld防火墙IP伪装和端口转发
- 【python】如何批量修改文件名
- 终端网络饱和攻击猜想
- 常见的磁盘格式以及它们之间的区别
- lifecycle-aware components(生命周期感知组件用法和原理)
- 近期DDG挖矿病毒防护与分析
- redis为什么这么快
- 前后端分离 Spring Boot + Vue 开发网易云、QQ音乐(附源码)!
- java压_JAVA背压