历经了前前后后一个月的学习,算是对STM32板子有了最最最基础的理解。对于我个人而言,最为直接的应用方式就是控制电机。正好前段时间刚学完PWM,加上今天又对于老项目OSBoat控制部分有了新的认识,于是就有了今天的应用总结。
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。具体其他的内容我就不细讲了,原理太难了,应用的话大家都知道是干嘛的。
这个是我测试的时候用的舵机,也是比较常用的舵机的一种。在这里我主要就记录一些关键内容。
这是一个180°,30kg的舵机,那么对于一般舵机来说,舵机的控制一般需要一个20Ms左右的时基脉冲,该脉冲的高电平部分一般为0.5Ms~2.5Ms范围内的角度控制脉冲部分,总间隔为2Ms。以180°舵机为例,对应的控制关系如下:
0.5Ms————0°
1.0Ms————45°
1.5Ms————90°
2.0Ms————135°
2.5Ms————180°
而360°舵机与其他普通舵机不同,它实际相当于无极变速的减速电机,可以控制速度和方向,但是没有0-360°角度控制的功能。控制方向和一般舵机的控制信号相同:
0.5Ms————正向最大转速
1.5Ms————速度为0
2.5Ms————反向最大转速
舵机的接线绝大多数都是三根:
黄色-S :是信号线,用于传输数据(pwm信号)
红色-V:是电源正极线(VCC)。
褐色(棕色、黑色)-G:是接地线(GND)。
了解了舵机最基本的东西之后,咱们就来看看代码!
我原本以为舵机、电机的控制是一件多么神秘的事情,结果凭借PWM输出,即可完成。关于PWM输出我就不在这里过多赘述,在这里放一篇我之前学习记录的文章:(14条消息) 【学习记录】 STM32 PWM输出实验_HFUTdumpling的博客-CSDN博客
直接上代码:
pwm.c:
#include
#include "sys.h"
void My_TIM3_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStr;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStr;
TIM_OCInitTypeDef TIM_OCInitStr;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_InitStr.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStr.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStr.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStr);
TIM_TimeBaseInitStr.TIM_Period = arr;
TIM_TimeBaseInitStr.TIM_Prescaler = psc;
TIM_TimeBaseInitStr.TIM_ClockDivision = TIM_CounterMode_Up;
TIM_TimeBaseInitStr.TIM_CounterMode = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStr);
TIM_OCInitStr.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStr.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStr.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC2Init(TIM3,&TIM_OCInitStr);
TIM_OC1Init(TIM3,&TIM_OCInitStr);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
}
main.c:
int main(void)
{
My_TIM3_Init(19999,71);//周期为20ms (arr+1)(psc+1) = 20000*72/72000000 = 20ms
delay_init();
while(1)
{
TIM_SetCompare1(TIM3,500); //舵机驱动
delay_s(3); //超过2s尽量自己新写一个延时函数,因为大于2s会溢出
TIM_SetCompare1(TIM3,2000);
delay_s(3);
}
}
这里要强调一个事情,就是为什么delay_s()这个函数要自己封装一下,因为正点原子里面自带的两个delay_ms()和delay_us(),如果调用delay_ms()的话,取的时间大于2s,会有溢出的情况,因为其内部的计数器倍数有限,当他超过2s之后,计数器会溢出,即延时永远不会大于2s。所以需要自己封装一个delay_s()。当然这个也很简单,一个for循环就搞定啦!
void delay_s(u16 s)
{
int i = 0;
for(i = 0;i < s;i++)
delay_ms(1000);
}
然后这里编译完成后就可以下载程序了。
我这里下载程序用的是ST-LINK,也比较方便,需要连接四根线即可:
分别是GND、3.3V、SWCLK、SWDIO,与STM32的接口接好,并在电脑上安装响应驱动即可。
(这里我是很早就接好了就不放相关链接了,C站上很多相关文章)。
完成下载后,我们将舵机和32板子的线接好,并拔掉ST-LINK,开启外接电源(注意一定不要同时接两个电源,容易烧板子)。打开开关,舵机开始运行:每隔3s舵机转动135°,正转一次,反转一次。
到此,舵机的驱动就已经完成啦!
由于我手边没有空闲的电机,本来想利用OSBoat(我之前的一个项目,后面会讲)上的蜗轮蜗杆减速电机来动一下,然后研究了半天发现差一根接地线(GND)需要焊接,于是就没有继续。但这反倒让我搞明白了OSBoat船的电路接线逻辑,也算是一个很大的意外收获了!
先来讲电机,与舵机类似,电机也是通过PWM来控制的,通过调整不同的占空比来实现。而电机与舵机不同的是,电机需要使用两个pin口来传输PWM数据,同时还需要一个电机驱动。
进入正题,先上代码:
pwm.c:与舵机的相同。这里只需要比舵机多开一个pin口就行,舵机那边我使用了PA6,电机这儿我用了PA5和PA6,可以发现其实在舵机的pwm.c文件中我已经完成了这两个口的初始化。
GPIO_InitStr.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
main.c:
int main(void)
{
My_TIM3_Init(19999,71);//周期为20ms (arr+1)(psc+1) = 20000*72/72000000 = 20ms
delay_init();
while(1)
{
TIM_SetCompare1(TIM3,10000);//电机驱动
TIM_SetCompare2(TIM3,500);
delay_s(2);
TIM_SetCompare1(TIM3,500);
TIM_SetCompare2(TIM3,10000);
delay_s(2);
}
}
代码很简单,与舵机基本类似,只是调用了两个TIM通道。
这里需要用到一个电机驱动器,比较常用的,也是我这里有的一个驱动器:L298N。
L298N电机控制模块实现方法 - 知乎 (zhihu.com)
其实这张图已经完全概括了这个驱动器的用法了。我就来简单列一下我对于它应用的一些小总结。
输出A和输出B就是可以接两个电机的意思,即输出端。供电模块的三个口中间是GND,两边分别是12v供电和5v供电。最重要的是输入口。中间四个口是逻辑输入口,左边两个是IN1和IN2,即通道A,右边为通道B同理。逻辑输入顾名思义就是连接后就可以让电机动起来了。而左右的通道A通道B使能,就是在你需要对他进行其他的控制,比如速度、或者其他指令的时候,需要连接,否则的话就需要接高电平,即让两个口短接,或者说像图中一般的L298N板子自带跳线帽已经接了高电平。就不用管他。
接线的话,就把IN1和IN2(或者IN3,IN4)接到STM32的PA5和PA6上(我的程序是PA5,PA6),然后接地线与STM32的接地线连接(我的理解是要有一个基准线,不然高低电平就没有意义了),即可完成。这跟接地线我那儿好像得焊接,还没焊,所以就没有实际实现的过程。
OSBoat,取名灵感来自于美国Argonne National Laboratory团队Oleo Sponge新型海绵。该种海绵具有良好的疏水亲油性,可实现反复吸油和挤压出油。通过这个海绵的特性,搭载我们的船体,可以实现海上原油的自动清理。我们最初是以机械创新设计大赛的生态修复赛题为导向,开始了这样一个项目的制作。
由于某些原因,这个图纸的总设计师不是我,但这个项目的总工程师可以算是我。从制作到建模修改到实现,主要都是我和我的队友一起完成的。这对于一个机械专业的本科生来说,只要肯去做就不算是难事!话不多说,上图!
图一是在实验室拍的照片,图二是在合肥工业大学屯溪路校区斛兵塘拍摄的照片。
这个项目呢,目前是已经拿到了1个国奖、2个省奖,还有不计其数的校奖。省部级级以上获奖如下:
中国大学生机械工程创新创意大赛——“卓然—笃顺杯“第13届过程装备实践与创新赛 三等奖
第十届全国大学生机械创新设计大赛安徽赛区 二等奖
第十六届“西门子杯”中国智能制造挑战赛——华东一赛区 一等奖
好了多的就不说了。咱们进入正题。为什么我会在这篇文章提到这个项目呢,因为这个项目的控制是由我队友完成的,他是我的一个学长,也是CSDN嵌入式领域的优秀作者,目前是在上海的某家芯片研发的大厂工作(没错应该就是最大的那个)。(14条消息) Top嵌入式的博客_CSDN博客-Linux驱动开发,STM32,U-Boot源码分析领域博主
其实这个项目是个半成品,由于各种原因,我们的机械结构和控制的相关理论还没有实现,所以做控制的老板在之前做的时候,也没有用太多复杂的东西。所以我才有机会很快的把OSBoat的电路接线的逻辑弄明白。
这张图应该就是全部的电路了。输出端就两个水下推进器和一个蜗轮蜗杆减速电机。控制器是用的RoboMaster的常用的一个控制器。(32是我在调试)然后我大概做了个图把整个的电路梳理了一下。
PS:换了电脑Visio出问题了没法用,呜呜友友们将就一下。
这大概就是整个电路的基本图解,主要实现的功能其实就是让整个船能够遥控并动起来。
感觉让学长这样的大佬来做这样相对简单的事情,仿佛是有点大材小用的感觉嘿嘿嘿。
哦对了,这篇文章的来源也出自这个项目,我们想要把群体智能的理论融入我们的项目中。这也是C站小白目前点赞、收藏、浏览量最高的一篇文章,也感谢大家的认可!(14条消息) 关于求解微分方程——初学Matlab里的 ODE求解器_HFUTdumpling的博客-CSDN博客_微分方程求解器
STM32跟着正点原子的课程学习过程算是告一段落了。刚看完原子哥的课程时我确实还是有很多疑惑。但作为一个应用者来说,当我学会了用STM32来控制电机的时候,我对于STM32的就有了更深的理解,或者说是不一样的认识,这对于我来说无疑是非常开心的一件事情。
对于后续嵌入式的学习,我主要分为两个部分。首先还是以项目为导向,在实践中去学习,无疑效率最高来的最快。嵌入式开发离不开PCB的设计,所以我后面会坚持学习一些电子设计的相关内容,以及使用Altium Designer软件来自己设计PCB板。同时,基于我之前安卓开发的经验(后悔那个时候还没有注册C站留下相关学习资料),我想的是之后去学习一下利用App,通过蓝牙或wifi模块,将手机作为遥控器,来实现遥控。并且在近段时间我也会更多地接触STM32的一些项目实战的东西。毕竟作为机械人,天天坐在3D打印实验室,有着得天独厚的条件,想搞事那可太容易了嘿嘿嘿。
看到这儿的友友们一定都是真爱了,感谢你的观看,让我们一起学习,一起进步,也欢迎大家跟我多多交流哇!也希望大家多多点赞收藏+关注嗷!
1、舵机_百度百科 (baidu.com)
2、(14条消息) PWM控制舵机_kkdaron的博客-CSDN博客_舵机pwm控制