基于STM32F03RCT的多路频率占空比可调PWM输出
基于STM32F03RCT的多路频率占空比可调PWM输出
- 1. 准备
- 1.1. 硬件
- 1.2. 软件
- 2. 基础知识
- 3. CubeMX配置
- 3.1. 通用配置
- 3.2. 定时器配置及初始化代码生成
- 4. PWM相关代码编写
- 5. 代码验证
- 6.后记
1. 准备
1.1. 硬件
STM32RCT6核心板、STLink V2.1调试器、线材若干、Mini示波器
1.2. 软件
STM32CubeMX、STMCubeIDE
2. 基础知识
利用CubeMX配置PWM时,大多数参数保持软件给出的默认值即可。为了使PWM频率及占空比可调,我们只需要额外控制预分频器寄存器 (TIMx_PSC) 、自动装载寄存器 (TIMx_ARR) 和捕获/比较寄存器(TIMx_CCRx) 三个寄存器的值即可。HAL库对某些操作进行了封装,调用特定的函数即可对寄存器进行操作,当然也可以采用直接操作寄存器的方式。
PWM频率及占空比与上述三个寄存器内数值的关系如下:
PWM頻率:
freq=SysClock(PSC+1)(ARR+1)freq = \frac{{SysClock}}{{(PSC + 1)(ARR + 1)}} freq=(PSC+1)(ARR+1)SysClock
PWM占空比:
duty=CCRxARR+1duty = \frac{{CCRx}}{{ARR + 1}} duty=ARR+1CCRx
SysClock为系统时钟频率,本例中为72MHz,PSC、ARR、CCRx分别为对应寄存器内数值。
3. CubeMX配置
3.1. 通用配置
配置HCLK时钟频率为最大频率,即72MHz,APB1定时器时钟为72MHz,调试方式选择“Serial Wire"。
3.2. 定时器配置及初始化代码生成
首先应该明确的是PWM频率
使用定时器2和定时器3作为PWM输出定时器,二者配置相同,下面以定时器2为例说明。
Clock Source(时钟源)选择Internal Clock(内部时钟),四个通道均配置为PWM输出,如下图所示。
定时器预分频器(PSC)设置为720-1,自动装载寄存器ARR设置为100-1,自动重装设置为Enable,CCRx设置为50. 由上面的公式计算可知,按照此参数初始化后,PWM的频率为1000Hz,占空比为50%.
配置完成后,设置目标IDE及其他配置选项,生成初始化代码.
4. PWM相关代码编写
新建"pwm.h"和"pwm.c"文件,添加头文件地址到项目,并将"pwm.c"添加至项目中;
在"pwm.h"中做如下定义:
#define hpwm0 htim2
#define hpwm1 htim3#define PWM_CH1 0x00
#define PWM_CH2 0x01
#define PWM_CH3 0x02
#define PWM_CH4 0x03#define PWM0_CLOCK 72 * 1000 * 1000
声明如下函数:
void PWM_SetFreq(TIM_HandleTypeDef *hpwmx, float freq);
void PWM_SetDuty(TIM_HandleTypeDef *hpwmx, uint32_t ch, float duty);
void PWM_Stop(TIM_HandleTypeDef *hpwmx, uint32_t ch);
void PWM_Start(TIM_HandleTypeDef *hpwmx, uint32_t ch);
在"pwm.c"中实现上述函数:
/*** @description: 设置PWM的频率(不能分通道设置)* @param {TIM_HandleTypeDef} htimx PWM句柄 hpwmx* @param {float} freq 频率值* @return {*}*/
void PWM_SetFreq(TIM_HandleTypeDef *hpwmx, float freq)
{/* 有时需要在设置PSC寄存器前重新选择合适的ARR寄存器值(例如:1000-1)// 1.读出占空比uint32_t duty=hpwmx->Instance->CCR1/hpwmx->Instance->ARR;// 2.设置ARR寄存器的值hpwmx->Instance->ARR=1000-1;// 3.为保持占空比不变设置CCRx寄存器的值hpwmx->Instance->CCR1=(uint32_t)((hpwmx->Instance->ARR+1)*duty);*/// 根据ARR寄存器的值设置计算预分频PSC的值hpwmx->Instance->PSC = PWM0_CLOCK / (hpwmx->Instance->ARR + 1) / freq - 1;
}/*** @description: 设置PWM某一通道的占空比* @param {TIM_HandleTypeDef} htimx PWM句柄 hpwmx* @param {float} duty 占空比(百分制,占空=50%,则duty=50)* @param {uint8_t} ch 通道* @return {*}*/
void PWM_SetDuty(TIM_HandleTypeDef *hpwmx, uint32_t channel, float duty)
{// 设置CCRx寄存器的值// 也可以用HAL库的函数:// __HAL_TIM_SET_COMPARE(&hpwm0,TIM_CHANNEL_1,duty/100.0*(hpwmx->Instance->ARR);*(uint32_t *)(&hpwmx->Instance->CCR1 + channel) = duty/100.0*(hpwmx->Instance->ARR+1);
}/*** @description: 开启PWM某一通道* @param {TIM_HandleTypeDef} htimx hpwmx* @return {*}*/
void PWM_Start(TIM_HandleTypeDef *hpwmx, uint32_t channel)
{HAL_TIM_PWM_Start(hpwmx, (uint32_t)channel * 4);
}/*** @description: 关闭PWM某一通道* @param {TIM_HandleTypeDef} htimx hpwmx* @return {*}*/
void PWM_Stop(TIM_HandleTypeDef *hpwmx, uint32_t channel)
{HAL_TIM_PWM_Stop(hpwmx, (uint32_t)channel * 4);
}
代码中已有详尽的注释,此处不再赘述。
在"main.c"中的用户代码区域添加如下代码对PWM功能进行测试:
/* USER CODE BEGIN 2 */PWM_SetFreq(&hpwm0, 1000.0); // 设置第1组PWM的频率PWM_SetDuty(&hpwm0, PWM_CH1, 10.0); // 设置通道1的占空比PWM_SetDuty(&hpwm0, PWM_CH2, 30.0); // 设置通道2的占空比PWM_SetDuty(&hpwm0, PWM_CH3, 50.0); // 设置通道3的占空比PWM_SetDuty(&hpwm0, PWM_CH4, 70.0); // 设置通道4的占空比PWM_Start(&hpwm0, PWM_CH1); // 开启第1组PWM的通道1输出PWM_Start(&hpwm0, PWM_CH2); // 开启第1组PWM的通道2输出PWM_Start(&hpwm0, PWM_CH3); // 开启第1组PWM的通道3输出PWM_Start(&hpwm0, PWM_CH4); // 开启第1组PWM的通道4输出PWM_SetFreq(&hpwm1, 2000.0); // 设置第2组PWM的频率PWM_SetDuty(&hpwm1, PWM_CH1, 20.0);PWM_SetDuty(&hpwm1, PWM_CH2, 40.0);PWM_SetDuty(&hpwm1, PWM_CH3, 60.0);PWM_SetDuty(&hpwm1, PWM_CH4, 80.0);PWM_Start(&hpwm1, PWM_CH1);PWM_Start(&hpwm1, PWM_CH2);PWM_Start(&hpwm1, PWM_CH3);PWM_Start(&hpwm1, PWM_CH4);/* USER CODE END 2 */
5. 代码验证
编译代码,下载到单片机中,用示波器观察对应引脚输出如下:
第1组PWM(Timer2):
第2组PWM(Timer3)
6.后记
由上述PWM频率和占空比计算式可知,PWM的频率与PSC*ARR成反比,当PWM频率一定时,PSC和ARR寄存器的数值必然会此消彼长。本例中为了使PWM频率在较大值时仍具有较高的精度,ARR值选为100,如果您对占空比精度要求较高,可以将ARR寄存器的数值设置为1000或更大的数值,但时这必然会使得PWM频率精度降低,尤其是频率较高时,这个现象应该会很明显。
喜欢的话可以关注公众号“早点儿毕业”,祝愿学生朋友们都能早点儿毕业!!!
基于STM32F03RCT的多路频率占空比可调PWM输出相关推荐
- 【电赛备考】基于STM32控制的可调PWM输出+LCD显示
情况分析 大三老油条一枚,大一时赶上19年国赛申请留校一月自学(划水)开赛以后就和队友参观了一下其他队伍准备的情况就愉快的回家了.(材料都没买),因为疫情的原因大二的省赛推迟到了大三.趁着考研压力还不 ...
- 产生频率或者占空比可调的PWM波【汇编语言】
PWM在各个编程中都非常的重要,在学习32单片机,FPGA等中都有学习到,本次文章为介绍汇编语言编写频率或占空比可调的PWM波,从更加底层的方面介绍和去了解pwm波生成的过程,基于S3C2410X/S ...
- 基于STC8G1K08A的可调节占空比和频率的PWM应用案例
基于STC8G的可调节占空比和频率的PWM应用案例 CSDN的小白分享 前言 一.STC8G系列的介绍 二.使用记录 1.建立工程 2.打开工程所需的芯片功能,及本人的函数 总结 CSDN的小白分享 ...
- 如何使用定时器产生两路频率可调、占空比可调的PWM波
接上次的博客,上一篇博客介绍的是产生两路频率可调.占空比固定为50%的方波,但是更多情况下也需要调节占空比,这篇博客简单介绍下.其实和频率可调的输出基本上是一样的,只需要再加上一个Duty来控制CCR ...
- 函数信号发生器:本设计中要求输出方波、三角波、锯齿波、正弦波,电压0-10V可调,调节精度0.1V;输出信号的频率0-100Hz;占空比可调
函数信号发生器:本设计中要求输出方波.三角波.锯齿波.正弦波,电压0-10V可调,调节精度0.1V:输出信号的频率0-100Hz:占空比可调. 本次课题设计将利用单片机控制来实现信号发生系统所要求的功 ...
- 基于NE555芯片设计占空比可调的方波信号发生器
NE555介绍 555定时器是一种应用极为广泛的中规模集成电路,该电路使用灵活.方便,只需外接少量的阻容原件就可以构成单稳.多谐和施密特触发器.因而广泛用于信号的产生.变换.控制和检测. 1脚:外接电 ...
- 码分复用的matlab仿真,基于matlab的多路时分复用仿真.doc
基于matlab的多路时分复用仿真 通信系统原理综设实验报告 多路时分复用matlab仿真系统 教师评语: 引言 在实际的通信系统中,为了扩大通信链路的容量,提高通信系统的利用率,需要在一条链路上传输 ...
- yshon对讲机如何调频率_窄带宽、窄脉宽、高重复频率,主动调Q光纤激光器是如何实现的?...
文 / 毛庆和.姚波.张骥 中国科学院合肥物质科学研究院主动调Q 光纤激光器及优势 大能量纳秒脉冲激光在激光清洗.雷达探测.精密加工及非线性变频等领域具有极其重要的应用.通常,这类脉冲激光由高品质纳秒 ...
- 基于matlab的时分复用实现,基于matlab的多路时分复用仿真.doc
基于matlab的多路时分复用仿真.doc 通信系统原理综设实验报告多路时分复用matlab仿真系统教师评语:1.引言在实际的通信系统中,为了扩大通信链路的容量,提高通信系统的利用率,需要在一条链路上 ...
最新文章
- [转]移动端页面开发资源总结及技巧
- Vue3 核心技能从入门到难点攻破,看这一篇就够了!
- 用jQuery实现网页卷轴的效果
- 已知二叉树先序和中序遍历结果,求后序遍历结果
- MYSQL SELECT 过程 转
- [python]python学习笔记(三)——编译
- java 怎样 thread dump_怎样分析 JAVA 的 Thread Dumps
- OpenGL基础2:OpenGL简介
- matlab拟合gamma分布,使用matlab拟合Gamma分布
- 49.QComboBox
- MyBatis-Spring(五)--MapperScannerConfigurer实现增删改查
- python疫苗预约系统毕业设计开题报告
- java笔试 https://blog.csdn.net/zhugewendu/article/details/72852033
- linux 查看用户访问ip,(总结)按时按登录IP记录Linux所有用户操作日志的方法(附脚本)...
- 2008服务器系统ie,windows server 2008 IE增强的安全配置关闭方法
- 联想拯救者R7000安装Ubuntu18.04
- localhost与ip的区别
- 05-用户和组以及权限
- 【数学之美】分形——发现隐藏的维度
- Robomongo的安装及简单使用
热门文章
- AcWing 273. 分级 (推论,DP)
- 文献关联分析图谱——connected papers网站
- Macbook上如何调整Windows分区大小,NTFS-FAT-FAT32
- PDF转换Word、Excel、PPT、图片,PDF去水印,PDF拆分该怎么做到这些
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡
- 根轨迹分析 matlab,MATLAB的根轨迹分析
- 简单编写图书管理系统
- 17种Vue适用于移动端的ui框架
- Deep Match to Rank Model for Personalized Click-Through Rate Prediction
- 从球场捡拾矿泉水瓶的老人,看市场经济下的供求关系