电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
『免费开源』基于STM32的<智能垃圾桶>之舵机控制(HAL库)
分 享
扫描二维码分享
『免费开源』基于STM32的<智能垃圾桶>之舵机控制(HAL库)
智能垃圾桶
舵机控制
语音控制
芯知识学堂SingleYork
关注
发布时间: 2020-07-21
丨
阅读: 1370
大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了[<基于STM32的智能垃圾桶之成员简介>](https://www.icxbk.com/article/detail/1503.html "<基于STM32的智能垃圾桶之成员简介>")、[<基于STM32的智能垃圾桶之语音识别>](https://www.icxbk.com/article/detail/1507.html "<基于STM32的智能垃圾桶之语音识别>")和[<基于STM32的智能垃圾桶之语音播报>](https://www.icxbk.com/article/detail/1511.html "<基于STM32的智能垃圾桶之语音播报>"),今天笔者将要给大家介绍我们这个DIY智能垃圾桶套件中“舵机控制”的详细使用。 关于舵机的基本知识,网上一搜一大把,笔者在此就不跟大家做过多解释了,本例中,笔者使用的是SG90模拟舵机: ![](https://cf03.ickimg.com/bbsimages/202007/f2d86f8efbda93a588ded85d8c2c6106.png) 这个舵机的三根线分别为:GND(棕色)、VCC(红色)、PWM(黄色),按照下图所示的接线方法,直接接到我们的OWL Micro F1 - EXT扩展板的舵机接口上即可: ![](https://cf03.ickimg.com/bbsimages/202007/3b5e048e2f39e4227354ac9d9158aa5e.png) 舵机跟扩展板的硬件连接非常的简单,实际上,笔者设计的专用的四路舵机接口跟舵机的线序是一一对应的,直接插上去就OK了,笔者就不多说了。 硬件连接搞定了,那么,我们应该产生怎样的PMW波形来控制舵机的转动角度呢? SG90的舵机要求控制舵机的 PWM 信号频率在50Hz左右,即周期为 20ms 的 PWM 信号,当该信号的高电平部分在0.5ms - 2.5ms之间时,对应舵机转动的角度,具体对应情况如下表: ![](https://cf03.ickimg.com/bbsimages/202007/4f322c92a802e1717889066d3d9f4f82.png) 了解了舵机的控制原理后,接下来,笔者就要来给大家介绍软件部分的实现。软件部分笔者主要给大家介绍如何通过STM32CubeMX来配置生成代码(最终的综合代码,笔者不是采用STM32CubeMX来配置,而是采用移植的方式来实现),关于CubeMX的基本操作,包括软件安装、芯片支持包安装什么的,请大家自行百度。 首先,我们打开STM32CubeMX软件(笔者使用的是5.6.1版本),在“New Project”选项中使用“Start My project from MCU”的方式新建工程,点击“ACCESS TO MCU SELECTOR”跳转到MCU选择界面: ![](https://cf03.ickimg.com/bbsimages/202007/929b1e4dd4579b393e2a3ff5a813ec83.png) 在弹出的MCU选择界面,我们找到“CMU/MPU Selector”菜单,然后直接选择我们所使用的MCU—STM32F103C8,然后在右侧的“MCUs/MPUs List:1 item”中双击STM32F103C8便可新建一个CubeMX工程: ![](https://cf03.ickimg.com/bbsimages/202007/cac45af75fc6fcd6a7b52885b2390846.png) 接下来,我们来开始配置RCC时钟,如下图所示,在工程外设选择和引脚分配选择“Pinout&Configuartion”界面,找到“System Core”选项下面的RCC,单击RCC在“RCC mode and Configuration”界面,将“High Speed Clock(HSE)”设置为“Crystal/Ceramic Resonator”,即:使用外部晶振。 ![](https://cf03.ickimg.com/bbsimages/202007/0f5cda24395040d9c0338532a609d397.png) 接下来,进入系统时钟配置界面“Clock Configuration”,在这里,我们选择使用外部8MHz晶振,并配置系统时钟为72MHz,这里有很多选项,如果我们不知道怎么选的话,直接在“HCLK(MHz)”输入框中,直接输入72然后回车: ![](https://cf03.ickimg.com/bbsimages/202007/bf044486c89a20e49e3a1eb012e8b29d.png) 在输入72并回车之后,会弹出如下对话框,点击“OK”即可完成时钟一键配置(有些芯片可能会需要手动微调): ![](https://cf03.ickimg.com/bbsimages/202007/99d9d57d4855d3d80ecadab73acf4fca.png) 最终得到的时钟配置如下图所示: ![](https://cf03.ickimg.com/bbsimages/202007/dc617c8acb4755d812cee5ee1d90b585.png) 接下来,我们继续回到工程外设选择和引脚分配选择“Pinout&Configuartion”界面,因为我们的OWL Micro F1 - EXT扩展板上面控制四路舵机的引脚分别非PA6、PA7、PB0、PB1,正好是定时器TIM3的CH1、CH2、CH3、CH4通道,所以我们使用TIM3的功能来实现四路舵机的控制,在“Pinout&Configuartion”界面找到“Timers”,然后选择TIM3,同时勾选“Internal Clock”使能内部时钟源,并将定时器的四个通道分别设置成“PWM Generation CH1”、“PWM Generation CH2”、“PWM Generation CH3”、“PWM Generation CH4”: ![](https://cf03.ickimg.com/bbsimages/202007/5bfa3cef4d571b1c815f2fb124afa281.png) 根据定时器Update时间计算公式Tout=((arr+1)*(psc+1))/Tclk(其中,Tout为定时器溢出时间,arr为重装载值,psc为预分频系数,Tclk为定时器的输入时钟频率(单位为MHz)),我们将定时器TIM3的参数设置如下: 1. 设置定时器预分频器为719(即:720-1)可以得到100KHz的定时器计数时钟; 2. 设定定时器计数周期为1999(即:2000-1),这样定时器的频率为50Hz,即可得到20ms的周期; 3. 设置定时器的通道1(CH1)-通道4(CH4)为PWM模式1,脉冲数为150,即可得到1.5ms的高电平时间。 4. 其他设置,采用默认设置即可。 ![](https://cf03.ickimg.com/bbsimages/202007/e2d3d9ad3e6b53435ece5f199e112b63.png) 定时器配置完成后,我们接下来就可以配置“Project Manager”里面的参数,首先是Project里面的设置,这里主要是设置一下“Toolchain/IDE”就可以了,笔者使用的是MDK-ARM编译器5.29版本,所以这里选择IDE为MDK-ARM,最低版本号选择V5.27。 ![](https://cf03.ickimg.com/bbsimages/202007/5b2e017f637676e6503ff9482d77eece.png) 在Code Generator里面,我们可以根据自己的使用习惯选择,笔者这里仅在默认选型中多勾选了一个“Generate peripheral initialization as a pair of“.c/.h” files per peripheral”选型,即:为每个外设单独生产一对“.c/.h”文件。 ![](https://cf03.ickimg.com/bbsimages/202007/85fce52de1d40fa86dd56e96c627052f.png) 其他的设置,都使用软件默认设置即可。工程配置完成后,我们就可以使用CubeMX工具直接生产MDK的代码了,点击右上角的“GENERATE CODE”按钮,代码就可以自动生成了: ![](https://cf03.ickimg.com/bbsimages/202007/5f0ae8f4de67f0df02a6339701943683.png) 代码生成完成之后,弹出的提示似乎有点不正常,带有一个灰色的“感叹号”,而且,当我们点击“Open Folder”时候,会出现另外一个提示“…………but MDK-ARM V5.27 project generation have a problem”,这似乎是在提醒我们,刚才生成的MDK工程有问题。 ![](https://cf03.ickimg.com/bbsimages/202007/bf3f8df06ba3c66f8765e96cd0b4ad1a.png) 那么为什么会出现这个问题呢?这是因为我们的CubeMX工程所在的路径和文件名都包含了中文字符,似乎CubeMX对中文的支持不太友好。笔者重新在桌面建了一个名为“Smart_Rubbish”的文件夹,同时将CubeMX工程名也都改成了英文的“Smart_Rubbish”: ![](https://cf03.ickimg.com/bbsimages/202007/079690286195ab85defe25914d80601e.png) 接下来,我们再来点击“GENERATE CODE”按钮自动生成MDK代码,终于,没有问题了,这个时候,我们可以选择点击“Open Project” 直接打开工程,或者点击“Open Folder”打开工程所在的文件夹: ![](https://cf03.ickimg.com/bbsimages/202007/873878e34d6a7870d3973f6842a7c426.png) 打开MDK工程文件后,点击左上方的“Rebuild”按钮,编译工程,可以看到没有错误也没有警告: ![](https://cf03.ickimg.com/bbsimages/202007/5fe00e828ecaf95ec342b6e89fac0dcc.png) 接下来,我们点击魔法棒“Option for Target”,在Debug界面选择“ST-Link Debug”: ![](https://cf03.ickimg.com/bbsimages/202007/05637b050e17b30a12f6064c134dcff3.png) 点击“Settings”按钮,在“Flash Download”选项中,勾选“Reset and Run”,在“Pack”选项中,去掉“Enable”前面的“√”(这里尤其是要注意,很多小伙伴在使用高版本的MDK软件下载工程的时候反应,即使勾选了“Reset and Run”在程序下载后也不会自动运行,非要重新上电或者按一下复位按钮才能运行,所以这里要记得去掉这个“Enable”的“√”): ![](https://cf03.ickimg.com/bbsimages/202007/b1823ef28432349cb0a584a1d0c85be8.png) 虽然CubeMX工具可以很方便的自动生成代码,但是用户代码部分,还是需要大家手动编写的,如果我们直接将刚才生成的代码下载到MCU中去,我们会发现,板子上的四路舵机接口无任何反应。这是因为,我们还需要在程序中手动启动定时器的PWM输出。我们只需要在定时器TIM3初始化完成后,添加启动定时器TIM3的4个通道PWM输出的代码即可,如下图所示: ![](https://cf03.ickimg.com/bbsimages/202007/73d25f5a4ec7080a9332155b64f318c9.png) 在添加用户代码的时候大家需要注意,如果大家不希望每次修改CubeMX工程后把我们添加的代码覆盖掉,那么我们添加用户代码的时候一定要添加在“USER CODE BEGIN”和“USER CODE END”之间,比如笔者这里就将代码添加到了“USER CODE BEGIN 2”和“USER CODE END 2”之间,这样的话,就不用担心万一需要修改CubeMX工程重新生成代码的时候将我们自己添加的代码覆盖掉了。 现在,我们可以将代码重新编译,然后再下载到MCU中,这个时候我们可以用示波器或逻辑分析仪查看四路舵机接口的PWM波形如下图所示: ![](https://cf03.ickimg.com/bbsimages/202007/5acdc7af3e2b9e8d12533a82474befcf.png) 我们会发现,PWM波的频率为50Hz,周期为20ms,跟我们设置的一致。我们再将示波器调整一下,测量一下PWM波的高电平宽度,可以看到,也正是我们设置的1.5ms: ![](https://cf03.ickimg.com/bbsimages/202007/6286300325cfe4410f7399f68806e0d9.png) 按照我们之前介绍的PWM波高电平的时间与舵机旋转角度的关系我们可以知道,这个时候,舵机应该是在90°的位置,那么,如果要让舵机旋转到0°位置,那么我们只需要修改PWM的PLUSE值即可,接下来,我们再添加以下代码,让舵机在0°和90°之间来回旋转: ![](https://cf03.ickimg.com/bbsimages/202007/0d38512a796ffb40dcaff66e13d225ce.png) 同样的,笔者是将代码添加到了“USER CODE BEGIN 3”和“USER CODE END 3”之间。重新编译后下载代码,我们可以看到舵机每隔1秒在0°和90°之间切换(笔者这里演示只接了一个舵机,实际上,接一个舵机也是一样的效果,只是接多个电机的时候,可能要考虑一下USB线的供电能力,尤其是后面接上语音识别和语音播报模块的时候,最好使用1A以上手机充电头供电): ![](https://cf03.ickimg.com/bbsimages/202007/58f1a1ad50e74e1b2a68f1f1cc4f0adc.gif) 至此,我们的这个DIY的智能垃圾桶项目中的舵机控制部分就介绍完毕了,在下一讲中,笔者将要给大家介绍这个项目的最后一个部分内容,那就是综合的代码,在综合代码中,笔者会将语音识别、语音播报、舵机控制的代码全部整合到一起并进行讲解,敬请关注! **原创不易,转载请务必注明出处!** ![](https://cf03.ickimg.com/bbsimages/202007/d39473c2f389c03f201aab4f769bfb1c.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
2
)
芯知识学堂SingleYork
擅长:消费电子、工控电子、安防电子、光电显示、设计,制造及服务,测试仪器及设备
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交