好久没更新了,最近忙着换工作了。

前面几期好像把硬件部分的搭建说完了,从这期开始讲讲软件吧,先说说直流电机的控制。这部分可以看作是整个系统运行起来的第一步吧,有了这部分内容,前面搭建起来的机器人硬件就可以运作起来了,你的小车就可以放地上跑起来了。

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调速相关推荐

  1. 从零开始搭建ROS移动机器人系列之(一)预备知识及总体框架

    " 笔者2020年初次接触ROS,2021年参加工作以后,愈发对ROS产生浓厚的兴趣,渴望拥有一台ROS机器人,淘宝上一搜再搜,发现有很多现成的产品,但是价格属实让人望而却步,遂产生了自己搭 ...

  2. 基于51单片机直流电机PWM调速设计

    具体实现功能 系统由STC89C52单片机.LCD1602液晶显示屏.霍尔测速传感器.3V直流电机.按键模块构成. 具体功能: 1.采用霍尔传感器非接触式测电机转速: 2.LCD1602液晶显示当前的 ...

  3. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)

    编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...

  4. 直流电机PWM调速系统中控制电压非线性研究

    由于线性放大驱动方式效率和散热问题严重,目前绝大多数直流电动机采用开关驱动方式.开关驱动方式是半导体功率器件工作在开关状态,通过脉宽调制PWM控制电动机电枢电压,实现调速.本文通过实验验证,在不带电机 ...

  5. pwmc语言调速程序_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...

    设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...

  6. PIC16 F887 单片机 直流电机PWM调速 PID调速 PID算法

    直流电机PWM调速:使用将直流电机转速转换为脉冲频率,测量出电机的转速,与写入到单片机的EEPROM里的脉冲设定值进行比较产生偏差,若偏差为正值则电机减速,偏差为负值则加速,并在LCD上显示电机的转速 ...

  7. 【Proteus仿真】51单片机+直流电机PWM调速实验

    [Proteus仿真]51单片机+直流电机PWM调速实验 Proteus仿真 采用L293驱动直流电机 -PWM是采用定时器中断实现 /******************************** ...

  8. 51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)

    设计思路 直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部 ...

  9. uln2803驱动直流电机电路图_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...

    设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...

  10. 基于L298N的STM32的直流电机PWM调速控制

    这两天研究了一下基于L298N与stm32的直流电机调速,实验结果良好,可以根据调节STM32的PWM占空比来进行直流电机的调速.实验系统图如下: 首先整个PWM实验选用的是stm32f103系列,驱 ...

最新文章

  1. AVFoundation学习Demo--拍摄视频
  2. 关于“xxx”object is not callable的异常(转)
  3. Java线程问题问答
  4. 【转】UITableView详解(UITableViewCell
  5. 二维数组按行和按列遍历的效率
  6. Tensorflow基础语法和概念
  7. Java语言基础-反射机制、正则表达式
  8. 超详细java中的ClassLoader详解
  9. Ubuntu Tty (字符终端) 显示中文,和字体大小设置
  10. 如何修复金蝶专用版服务器,金蝶KIS专业版常见问题及解决方法
  11. java graphics 模糊_使用Graphics2D模糊Java背景
  12. 对话管理DST:Deep Neural Network Approach for the Dialog State Tracking Challenge
  13. 在跑SC-LEGO-LOAM时报错[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloude
  14. 来来来!java程序员个人优势
  15. usaco 2012 Open【Running Laps奶牛赛跑】
  16. WEBIX JavaScript UI 10.0.4 Crack
  17. 一款赛丽麦进销存软件V0.99-9已开源,永久免费,Mysql数据库
  18. java 微博客户端_记一个Android微博客户端的开发
  19. 写函数:自己写一个作图函数就是这么简单
  20. 无法在 Safari 浏览器中打开网站如何解决?

热门文章

  1. 一篇文章带你解决 Unable to infer base url. This is common when using dynamic servlet registra
  2. firewalld防火墙IP伪装和端口转发
  3. 【python】如何批量修改文件名
  4. 终端网络饱和攻击猜想
  5. 常见的磁盘格式以及它们之间的区别
  6. lifecycle-aware components(生命周期感知组件用法和原理)
  7. 近期DDG挖矿病毒防护与分析
  8. redis为什么这么快
  9. 前后端分离 Spring Boot + Vue 开发网易云、QQ音乐(附源码)!
  10. java压_JAVA背压