大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了<基于STM32的智能垃圾桶之成员简介>、<基于STM32的智能垃圾桶之语音识别>和<基于STM32的智能垃圾桶之语音播报>,今天笔者将要给大家介绍我们这个DIY智能垃圾桶套件中“舵机控制”的详细使用。
关于舵机的基本知识,网上一搜一大把,笔者在此就不跟大家做过多解释了,本例中,笔者使用的是SG90模拟舵机:
这个舵机的三根线分别为:GND(棕色)、VCC(红色)、PWM(黄色),按照下图所示的接线方法,直接接到我们的OWL Micro F1 - EXT扩展板的舵机接口上即可:
舵机跟扩展板的硬件连接非常的简单,实际上,笔者设计的专用的四路舵机接口跟舵机的线序是一一对应的,直接插上去就OK了,笔者就不多说了。
硬件连接搞定了,那么,我们应该产生怎样的PMW波形来控制舵机的转动角度呢?
SG90的舵机要求控制舵机的 PWM 信号频率在50Hz左右,即周期为 20ms 的 PWM 信号,当该信号的高电平部分在0.5ms - 2.5ms之间时,对应舵机转动的角度,具体对应情况如下表:
了解了舵机的控制原理后,接下来,笔者就要来给大家介绍软件部分的实现。软件部分笔者主要给大家介绍如何通过STM32CubeMX来配置生成代码(最终的综合代码,笔者不是采用STM32CubeMX来配置,而是采用移植的方式来实现),关于CubeMX的基本操作,包括软件安装、芯片支持包安装什么的,请大家自行百度。
首先,我们打开STM32CubeMX软件(笔者使用的是5.6.1版本),在“New Project”选项中使用“Start My project from MCU”的方式新建工程,点击“ACCESS TO MCU SELECTOR”跳转到MCU选择界面:
在弹出的MCU选择界面,我们找到“CMU/MPU Selector”菜单,然后直接选择我们所使用的MCU—STM32F103C8,然后在右侧的“MCUs/MPUs List:1 item”中双击STM32F103C8便可新建一个CubeMX工程:
接下来,我们来开始配置RCC时钟,如下图所示,在工程外设选择和引脚分配选择“Pinout&Configuartion”界面,找到“System Core”选项下面的RCC,单击RCC在“RCC mode and Configuration”界面,将“High Speed Clock(HSE)”设置为“Crystal/Ceramic Resonator”,即:使用外部晶振。
接下来,进入系统时钟配置界面“Clock Configuration”,在这里,我们选择使用外部8MHz晶振,并配置系统时钟为72MHz,这里有很多选项,如果我们不知道怎么选的话,直接在“HCLK(MHz)”输入框中,直接输入72然后回车:
在输入72并回车之后,会弹出如下对话框,点击“OK”即可完成时钟一键配置(有些芯片可能会需要手动微调):
最终得到的时钟配置如下图所示:
接下来,我们继续回到工程外设选择和引脚分配选择“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”:
根据定时器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、其他设置,采用默认设置即可。
定时器配置完成后,我们接下来就可以配置“Project Manager”里面的参数,首先是Project里面的设置,这里主要是设置一下“Toolchain/IDE”就可以了,笔者使用的是MDK-ARM编译器5.29版本,所以这里选择IDE为MDK-ARM,最低版本号选择V5.27。
在Code Generator里面,我们可以根据自己的使用习惯选择,笔者这里仅在默认选型中多勾选了一个“Generate peripheral initialization as a pair of“.c/.h” files per peripheral”选型,即:为每个外设单独生产一对“.c/.h”文件。
其他的设置,都使用软件默认设置即可。工程配置完成后,我们就可以使用CubeMX工具直接生产MDK的代码了,点击右上角的“GENERATE CODE”按钮,代码就可以自动生成了:
代码生成完成之后,弹出的提示似乎有点不正常,带有一个灰色的“感叹号”,而且,当我们点击“Open Folder”时候,会出现另外一个提示“…………but MDK-ARM V5.27 project generation have a problem”,这似乎是在提醒我们,刚才生成的MDK工程有问题。
那么为什么会出现这个问题呢?这是因为我们的CubeMX工程所在的路径和文件名都包含了中文字符,似乎CubeMX对中文的支持不太友好。笔者重新在桌面建了一个名为“Smart_Rubbish”的文件夹,同时将CubeMX工程名也都改成了英文的“Smart_Rubbish”:
接下来,我们再来点击“GENERATE CODE”按钮自动生成MDK代码,终于,没有问题了,这个时候,我们可以选择点击“Open Project” 直接打开工程,或者点击“Open Folder”打开工程所在的文件夹:
打开MDK工程文件后,点击左上方的“Rebuild”按钮,编译工程,可以看到没有错误也没有警告:
接下来,我们点击魔法棒“Option for Target”,在Debug界面选择“ST-Link Debug”:
点击“Settings”按钮,在“Flash Download”选项中,勾选“Reset and Run”,在“Pack”选项中,去掉“Enable”前面的“√”(这里尤其是要注意,很多小伙伴在使用高版本的MDK软件下载工程的时候反应,即使勾选了“Reset and Run”在程序下载后也不会自动运行,非要重新上电或者按一下复位按钮才能运行,所以这里要记得去掉这个“Enable”的“√”):
虽然CubeMX工具可以很方便的自动生成代码,但是用户代码部分,还是需要大家手动编写的,如果我们直接将刚才生成的代码下载到MCU中去,我们会发现,板子上的四路舵机接口无任何反应。这是因为,我们还需要在程序中手动启动定时器的PWM输出。我们只需要在定时器TIM3初始化完成后,添加启动定时器TIM3的4个通道PWM输出的代码即可,如下图所示:
在添加用户代码的时候大家需要注意,如果大家不希望每次修改CubeMX工程后把我们添加的代码覆盖掉,那么我们添加用户代码的时候一定要添加在“USER CODE BEGIN”和“USER CODE END”之间,比如笔者这里就将代码添加到了“USER CODE BEGIN 2”和“USER CODE END 2”之间,这样的话,就不用担心万一需要修改CubeMX工程重新生成代码的时候将我们自己添加的代码覆盖掉了。
现在,我们可以将代码重新编译,然后再下载到MCU中,这个时候我们可以用示波器或逻辑分析仪查看四路舵机接口的PWM波形如下图所示:
我们会发现,PWM波的频率为50Hz,周期为20ms,跟我们设置的一致。我们再将示波器调整一下,测量一下PWM波的高电平宽度,可以看到,也正是我们设置的1.5ms:
按照我们之前介绍的PWM波高电平的时间与舵机旋转角度的关系我们可以知道,这个时候,舵机应该是在90°的位置,那么,如果要让舵机旋转到0°位置,那么我们只需要修改PWM的PLUSE值即可,接下来,我们再添加以下代码,让舵机在0°和90°之间来回旋转:
同样的,笔者是将代码添加到了“USER CODE BEGIN 3”和“USER CODE END 3”之间。重新编译后下载代码,我们可以看到舵机每隔1秒在0°和90°之间切换(笔者这里演示只接了一个舵机,实际上,接一个舵机也是一样的效果,只是接多个电机的时候,可能要考虑一下USB线的供电能力,尤其是后面接上语音识别和语音播报模块的时候,最好使用1A以上手机充电头供电):
至此,我们的这个DIY的智能垃圾桶项目中的舵机控制部分就介绍完毕了,在下一讲中,笔者将要给大家介绍这个项目的最后一个部分内容,那就是综合的代码,在综合代码中,笔者会将语音识别、语音播报、舵机控制的代码全部整合到一起并进行讲解,敬请关注!
原创不易,转载请务必注明出处!