2.门锁_STM32_舵机设备实现

概述

需求来源:

门锁的开启和关闭,就是电机来控制。这里不进行实际门锁机械结构的设计,选择用舵机或者电机转动一定的角度,就代表门锁开启。

舵机开发整体思路:

  1. 使用STM32裸机开发舵机,使得舵机可以实现基本的转动功能
  2. 封装接口,使得主函数调用一个函数,传入指定角度即可控制舵机旋转
  3. 分层硬件与设备,建立一个STM32的硬件控制文件和一个舵机角度算法文件,使得舵机角度控制可以容易的移植到其他的芯片上。
  4. 使用封装好的.c .h文件,将功能再FreeRTOS上实现应用编程(在其他博文中,暂未实现)

代码层级关系:

舵机控制裸机实现

1、舵机控制原理

舵机的型号为sg90,它有3根线:黄色为PWM信号线,红色VCC接3.3v,棕色GND

实物图如下:

舵机转动的角度与PWM信号的高电平时间有关,角度范围为0~180°

该舵机的PWM信号要求为50Hz,高电平时间与角度关系如下:

2、配置STM32的PWM输出

使用STM32CubeMx对STM32进行PWM输出的初始化配置。

这里使用的是STM32F103C8T6的TIM3_CH1作为PWM输出端口,对应引脚为PA6。

分频系数PSC配置为72-1

其余的基本配置为:使用外部晶振8MHz,最终输入到定时器的时钟频率为72MHz

3、编写STM32控制PWM文件

3.1 文件及公式

在KEIL中创建两个文件my_pwm.c和my_pwm.h。这两个文件主要实现硬件的控制,向上提供硬件控制的接口。

代码功能总述:

  • 对PWM进行一些初始化:MyPWM_Init()
  • 将所需频率转换为ARR的值:PWM_FreqToARR()
  • 将所需占空比转换为CCR的值:PWM_DutyToCCR()
  • PWM硬件控制接口:PWM_Set()

重要计算公式:

  • 定时器溢出时间计算公式:

  • 占空比计算公式:

 3.2 .h文件代码实现

该.h文件主要去定义一些宏,方便后面移植代码时的参数修改。

//PWM初始化参数
#define __TIM_F 	72000000U //时钟
#define __PSC 		(72-1)    //分频系数
#define __FREQ		1000      //频率
#define __DUTY      50		  //占空比

3.3 .c文件代码实现

3.3.1 MyPWM_Init()

该函数的作用是对PWM进行一些初始化,让PWM输出1000Hz,占空比为50%的信号。

具体函数实现如下:

/** MyPWM_Init:对PWM进行一些初始化1000Hz-50%
*/
void MyPWM_Init(void){uint32_t PWM_ARR = 0;uint32_t PWM_CCR = 0;//1.开启TIM3_CH1的PWM通道HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//2.将频率、占空比转为ARR、CCRPWM_ARR = PWM_FreqToARR(__TIM_F,__FREQ,__PSC);PWM_CCR = PWM_DutyToCCR(__DUTY,PWM_ARR);//3.写入ARR、CCR寄存器__HAL_TIM_SET_AUTORELOAD(&htim3,PWM_ARR);HAL_TIM_GenerateEvent(&htim3,TIM_EVENTSOURCE_UPDATE);__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,PWM_CCR);
}
3.3.2 PWM_FreqToARR()

该函数的作用是将所需频率转换为ARR的值。根据的公式就是定时器溢出时间计算公式。

具体代码实现如下:

/** PWM_FreqToARR:将所需频率转换为ARR的值* param TIM_F:定时器的时钟频率* param Freq:所需要的频率* param PSC:分频系数* @ret  由频率转换的ARR数值
*/
uint32_t PWM_FreqToARR(uint32_t TIM_F,uint32_t Freq,uint32_t PSC){uint32_t PWM_ARR = 0;PWM_ARR = (double)TIM_F/((PSC+1)*Freq) - 1 + 0.5;return PWM_ARR;
}
3.3.3 PWM_DutyToCCR()

该函数的作用是将所需占空比转换为CCR的值,根据的公式就是占空比计算公式。

具体代码实现如下:

/** PWM_DutyToCCR:将所需占空比转换为CCR的值* param Duty:所需要的占空比* param ARR:定时器的ARR数值* @ret  由占空比转换的CCR数值
*/
uint32_t PWM_DutyToCCR(double Duty,uint32_t ARR){uint32_t PWM_CCR = 0;PWM_CCR = (double)(ARR+1)*Duty/100 + 0.5;return PWM_CCR;
}
3.3.4 PWM_Set()

该函数的作用是设置所需PWM输出的频率和占空比参数,这是向上提供的硬件控制接口。

具体函数实现如下:

/**PWM_Set:设置所需PWM输出的频率和占空比参数* param Freq:所需要的频率* param Duty:所需要的占空比
*/
void PWM_Set(uint32_t Freq,double Duty){uint32_t PWM_ARR = 0;uint32_t PWM_CCR = 0;//1.将频率、占空比转为ARR、CCRPWM_ARR = PWM_FreqToARR(__TIM_F,Freq,__PSC);PWM_CCR = PWM_DutyToCCR(Duty,PWM_ARR);//2.写入ARR、CCR寄存器__HAL_TIM_SET_AUTORELOAD(&htim3,PWM_ARR);HAL_TIM_GenerateEvent(&htim3,TIM_EVENTSOURCE_UPDATE);__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,PWM_CCR);
}

4、编写舵机角度算法

4.1 文件

在KEIL中创建两个文件sg90.c和sg90.h。这两个文件主要是实现舵机角度与硬件接口参数的对接。最终再向上提供一个接口,以便应用层代码的使用。

代码功能总述:

  • 初始化sg90舵机设备:Sg90_Init()
  • 将传入的角度转为占空比:Sg90_AngleToDuty()
  • SG90设备控制接口:Sg90_Control()

4.2 .h文件代码实现

该.h文件主要将舵机设备抽象成一个结构体,以及舵机设备一些固定参数的宏定义

//舵机设备
typedef struct{int angle;int speed;}DevSg90,*PDevSg90;
extern DevSg90 Sg90;  //.c定义的全局变量,设备结构体
extern PDevSg90 pSg90;//.c定义的全局变量,设备结构体指针//舵机参数
#define SG90_PWM_FREQ 50      //工作的PWM频率50Hz-20ms
#define SG90_MAX_HIGH_TIM 2.5 //最大高电平时间,单位ms
#define SG90_MIN_HIGH_TIM 0.5 //最小高电平时间ms
#define SG90_MAX_ANGLE	  180 //最大转动角度
#define SG90_MIN_ANGLE    0   //最小转动角度

4.3 .c文件代码实现

4.3.1 Sg90_Init()

该函数的作用是初始化sg90舵机设备,设置设备初始角度为0度,速度-1代表任意(后续没编写)

具体代码实现如下:

/** Sg90_Init:初始化sg90舵机设备* param pDev:sg90设备指针* @ret  -1--err  0--success
*/
int Sg90_Init(PDevSg90 pDev){//1.参数有效性判断if(pDev == NULL){printf("pDev is NULL \r\n");return -1;}pDev->angle = 0;pDev->speed = -1;//-1代表默认return 0;
}
4.3.2 Sg90_AngleToDuty()

该函数的作用是将传入的角度转为占空比。

代码设计思路:

根据" 1.舵机控制原理 "章节可以得知,高电平时间与转度的关系是线性的,因此可以使用归一化的方法去实现高电平时间与转度的转换。

因为硬件接口提供的PWM控制只有频率和占空比两个参数,所以还需要将高电平时间转为占空比的值。根据" 1.舵机控制原理 "章节可以得知,该舵机的PWM控制信号是固定的50Hz,因此使用公式"占空比 = 高电平时间/总周期时间"即可进行转换。

具体代码实现如下:

/** Sg90_AngleToDuty:将传入的角度转为占空比* param angle: 需要的角度* @ret -1--err  other--转换后的占空比
*/
double Sg90_AngleToDuty(double angle){double percentAngel = 0;double highTime = 0;double duty = 0;//1.参数有效性判断if(angle > 180 || angle < 0){printf("angle err\r\n");return -1;}//2.开始转换percentAngel = angle/(SG90_MAX_ANGLE-SG90_MIN_ANGLE);//printf("Debug:percentAngel = %lf\r\n",percentAngel);highTime = percentAngel*(SG90_MAX_HIGH_TIM - SG90_MIN_HIGH_TIM)+SG90_MIN_HIGH_TIM;duty = highTime/((double)1/SG90_PWM_FREQ*1000)*100;//注意单位换算return duty;
}
4.3.3 Sg90_Control()

该函数的作用是SG90设备控制接口,这是应用层调用控制舵机的代码。

具体的函数实现如下:

/** Sg90_Control:SG90设备控制接口* param angle:所需转动的角度* @ret  -1--err  0--success
*/
int Sg90_Control(double angle){double duty = 0;//1.参数有效性判断if(angle > 180 || angle < 0){printf("angle err\r\n");return -1;}//printf("Debug:angle=%lf\r\n",angle);//2.计算占空比duty = Sg90_AngleToDuty(angle);//printf("Debug:duty=%lf\r\n",duty);//3.调用硬件代码进行控制PWM_Set(SG90_PWM_FREQ,duty);return 0;
}

5、整体调试

调试代码如下:

MyPWM_Init();				//初始化PWM硬件
Sg90_Init(pSg90);			//初始化舵机设备
pSg90->angle = 180;			//设置转动角度为180°
Sg90_Control(pSg90->angle); //驱动舵机转动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416756.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 项目 prometheus 自定义指标收集区分应用环境集群实例ip,使用 grafana 查询--方法耗时分位数指标

spring boot 项目 prometheus 自定义指标收集 auth author JellyfishMIX - github / blog.jellyfishmix.comLICENSE LICENSE-2.0 说明 网上有很多 promehteus 和 grafana 配置&#xff0c;本文不再重复&#xff0c;只介绍自定义部分。目前只介绍了分位数指标的收集和查询&a…

公认最好的跑步耳机,精选五款热门骨传导运动耳机分享

跑步时候总想来点音乐伴随&#xff0c;但是带着有线耳机太局限&#xff0c;带无线耳机又总担心掉落&#xff0c;左右为难&#xff0c;想要挑选一款运动时带着舒服的耳机真的有点难。最近发现骨传导耳机作为一种创新的音频设备&#xff0c;与传统耳机不同&#xff0c;通过将声音…

如何建立有效的沟通和协作机制来开展DFMEA工作?

在当今复杂多变的工业环境中&#xff0c;DFMEA&#xff08;设计失效模式与影响分析&#xff0c;Design Failure Mode and Effects Analysis&#xff09;作为质量管理体系中的一项关键工具&#xff0c;对于预防产品设计和开发过程中潜在的失效模式具有不可估量的价值。有效的DFM…

超声波眼镜清洗机买哪款?2024超声波眼镜清洗机推荐

超声波清洗机正逐渐成为广受欢迎的清洁解决方案&#xff0c;它以高效、深入且细腻的清洁效果&#xff0c;以及操作上的简易性&#xff0c;赢得了消费者的广泛喜爱。不过&#xff0c;市面上琳琅满目的品牌、多样化的型号及波动的价格区间&#xff0c;确实给消费者挑选时带来了不…

uniapp和vue3中使用vConsole在H5中开启移动端调试

uniapp和vue3中使用vConsole在H5中开启移动端调试 1. 安装vconsole npm install vconsole --save2. 在main.js中全局引入 重新启动项目即可

【js逆向专题】8.webpack打包

本教程仅供学习交流使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;请各学员自觉遵守相关法律法规。小节目标: 熟悉 webpack打包原理熟悉 webpack打包方式了解 webpack多模块打包 一. webpack打包 概念: webpack 是…

传递给 LEFT 或 SUBSTRING 函数的长度参数无效

我的Sql语句&#xff1a;select left(long,charindex(‘’,Long)-1) from Site 会报错&#xff0c; 错误信息是&#xff1a;传递给 LEFT 或 SUBSTRING 函数的长度参数无效。 如果我把Sql语句这样写加了一个where条件&#xff0c;即&#xff1a; select left(long,charindex(‘…

金属三通管液压成形液压机比例阀放大器

金属三通管液压成形液压机比例阀配套BEUEC比例放大器适用于紫铜、青铜、不锈钢、铝合金、复合材料的三通管、四通管、T型管、Y型管、L型管的一次液压胀形成形&#xff0c;更适用于石油化工、热能、新能源、医疗、环保、卫浴、五金等行业的各种金属中空零件和复杂曲面的管件的生…

信也持续构建集群容器化改造之路

1. 前言 随着应用构建需求增加以及新构建场景引入&#xff0c;公司对构建系统的扩展性、稳定性要求日益提高。多语言构建&#xff08;如Golang、Java、Python、Node.js 等&#xff09;所依赖的环境&#xff0c;部署在同一台物理机上时&#xff0c;使构建机环境维护困难&#xf…

解决SecoClient接收返回码超时

解决SecoClient接收返回码超时_secoclient接收返回码错误win11-CSDN博客 新的SVDDrv.sys有需要的&#xff0c;https://download.csdn.net/download/shuoshuo_12345/89715503下载即可。

【maven】阿里云和apache仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

人工智能造福公众:未来一片光明

作者&#xff1a;来自 Elastic Peter Dutton 我们如何衡量人工智能对政府的影响&#xff1f;毫无疑问&#xff0c;人工智能将为运营流程和决策带来的好处已被广泛讨论 —— 从自动化工作流程到节省成本再到减少重复工作。 但对于以服务公众为目标的组织来说&#xff0c;人工智…

基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic

摘 要 近些年来互联网迅速发展人们生活水平也稳步提升&#xff0c;人们也越来越热衷于旅游来提高生活品质。互联网的应用与发展也使得人们获取旅游信息的方法也更加丰富&#xff0c;以前的景点推荐系统现在已经不足以满足用户的要求了&#xff0c;也不能满足不同用户自身的个…

C语言 | Leetcode C语言题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step step << 1;}return …

armbian cups 远程打印机 1022

使用 CUPS Web 浏览器界面设置和管理打印机 - Oracle Solaris 管理&#xff1a;常见任务 N1刷armbian变身打印服务器&#xff0c;支持全平台无线打印PC扫描_存储设备_什么值得买 (smzdm.com) 第 6 章 使用 Web 界面向 CUPS 添加打印机 | Red Hat Product Documentation apt…

PHP CMS内容管理系统小程序源码满足您独特业务需求的最佳选择

​CMS内容管理系统 —— 满足您独特业务需求的最佳选择 &#x1f680;【开篇&#xff1a;定制化时代的呼唤】&#x1f680; 在这个信息爆炸的时代&#xff0c;每个企业都渴望在数字世界中脱颖而出&#xff0c;而内容就是那把打开用户心扉的钥匙。但面对纷繁复杂的业务需求&am…

isspace函数讲解 <ctype.h>头文件函数

目录 1.头文件 2.isspace函数使用 方源一把抓住VS2022&#xff0c;顷刻 炼化&#xff01; 1.头文件 以上函数都需要包括头文件<ctype.h> &#xff0c;其中包括 isspace 函数 #include<ctype.h> 2.isspace函数使用 isspace函数用于判断字符是否为空白字符&…

【TS】接口(Interface)学习

介绍 接口&#xff08;Interface&#xff09;是TypeScript中的一个重要概念&#xff0c;它允许你定义对象的结构&#xff0c;而不需要实现具体的逻辑。接口在编译时用于类型检查&#xff0c;确保对象具有特定的属性和方法。 接口的作用类似于抽象类&#xff0c;不同点在于接口…

ios动态创建控件及添加事件

效果如下&#xff0c;就是在一个空白页面动态添加控件&#xff0c;给按钮添加事件&#xff0c;图片名字和标题放入plist文件,plist是个Array&#xff0c;每一项是Dictionary。Dictionary里面方icon和name两个String的key。图片都放入Assets.xcassets。如果需要使用imageWithCon…

JVM 锁的种类

优质博文&#xff1a;IT-BLOG-CN 一、JVM 锁【偏向锁|轻量级锁|重量级锁】 对象头[每个对象都具有对象头] Mark&#xff1a;对象头的标记&#xff08;32位&#xff09;&#xff0c;描述对象的hash、锁信息、垃圾回收标记、年龄&#xff1b;内容包括&#xff1a;①、指向锁记录…