基于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输出相关推荐

  1. 【电赛备考】基于STM32控制的可调PWM输出+LCD显示

    情况分析 大三老油条一枚,大一时赶上19年国赛申请留校一月自学(划水)开赛以后就和队友参观了一下其他队伍准备的情况就愉快的回家了.(材料都没买),因为疫情的原因大二的省赛推迟到了大三.趁着考研压力还不 ...

  2. 产生频率或者占空比可调的PWM波【汇编语言】

    PWM在各个编程中都非常的重要,在学习32单片机,FPGA等中都有学习到,本次文章为介绍汇编语言编写频率或占空比可调的PWM波,从更加底层的方面介绍和去了解pwm波生成的过程,基于S3C2410X/S ...

  3. 基于STC8G1K08A的可调节占空比和频率的PWM应用案例

    基于STC8G的可调节占空比和频率的PWM应用案例 CSDN的小白分享 前言 一.STC8G系列的介绍 二.使用记录 1.建立工程 2.打开工程所需的芯片功能,及本人的函数 总结 CSDN的小白分享 ...

  4. 如何使用定时器产生两路频率可调、占空比可调的PWM波

    接上次的博客,上一篇博客介绍的是产生两路频率可调.占空比固定为50%的方波,但是更多情况下也需要调节占空比,这篇博客简单介绍下.其实和频率可调的输出基本上是一样的,只需要再加上一个Duty来控制CCR ...

  5. 函数信号发生器:本设计中要求输出方波、三角波、锯齿波、正弦波,电压0-10V可调,调节精度0.1V;输出信号的频率0-100Hz;占空比可调

    函数信号发生器:本设计中要求输出方波.三角波.锯齿波.正弦波,电压0-10V可调,调节精度0.1V:输出信号的频率0-100Hz:占空比可调. 本次课题设计将利用单片机控制来实现信号发生系统所要求的功 ...

  6. 基于NE555芯片设计占空比可调的方波信号发生器

    NE555介绍 555定时器是一种应用极为广泛的中规模集成电路,该电路使用灵活.方便,只需外接少量的阻容原件就可以构成单稳.多谐和施密特触发器.因而广泛用于信号的产生.变换.控制和检测. 1脚:外接电 ...

  7. 码分复用的matlab仿真,基于matlab的多路时分复用仿真.doc

    基于matlab的多路时分复用仿真 通信系统原理综设实验报告 多路时分复用matlab仿真系统 教师评语: 引言 在实际的通信系统中,为了扩大通信链路的容量,提高通信系统的利用率,需要在一条链路上传输 ...

  8. yshon对讲机如何调频率_窄带宽、窄脉宽、高重复频率,主动调Q光纤激光器是如何实现的?...

    文 / 毛庆和.姚波.张骥 中国科学院合肥物质科学研究院主动调Q 光纤激光器及优势 大能量纳秒脉冲激光在激光清洗.雷达探测.精密加工及非线性变频等领域具有极其重要的应用.通常,这类脉冲激光由高品质纳秒 ...

  9. 基于matlab的时分复用实现,基于matlab的多路时分复用仿真.doc

    基于matlab的多路时分复用仿真.doc 通信系统原理综设实验报告多路时分复用matlab仿真系统教师评语:1.引言在实际的通信系统中,为了扩大通信链路的容量,提高通信系统的利用率,需要在一条链路上 ...

最新文章

  1. [转]移动端页面开发资源总结及技巧
  2. Vue3 核心技能从入门到难点攻破,看这一篇就够了!
  3. 用jQuery实现网页卷轴的效果
  4. 已知二叉树先序和中序遍历结果,求后序遍历结果
  5. MYSQL SELECT 过程 转
  6. [python]python学习笔记(三)——编译
  7. java 怎样 thread dump_怎样分析 JAVA 的 Thread Dumps
  8. OpenGL基础2:OpenGL简介
  9. matlab拟合gamma分布,使用matlab拟合Gamma分布
  10. 49.QComboBox
  11. MyBatis-Spring(五)--MapperScannerConfigurer实现增删改查
  12. python疫苗预约系统毕业设计开题报告
  13. java笔试 https://blog.csdn.net/zhugewendu/article/details/72852033
  14. linux 查看用户访问ip,(总结)按时按登录IP记录Linux所有用户操作日志的方法(附脚本)...
  15. 2008服务器系统ie,windows server 2008 IE增强的安全配置关闭方法
  16. 联想拯救者R7000安装Ubuntu18.04
  17. localhost与ip的区别
  18. 05-用户和组以及权限
  19. 【数学之美】分形——发现隐藏的维度
  20. Robomongo的安装及简单使用

热门文章

  1. AcWing 273. 分级 (推论,DP)
  2. 文献关联分析图谱——connected papers网站
  3. Macbook上如何调整Windows分区大小,NTFS-FAT-FAT32
  4. PDF转换Word、Excel、PPT、图片,PDF去水印,PDF拆分该怎么做到这些
  5. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡
  6. 根轨迹分析 matlab,MATLAB的根轨迹分析
  7. 简单编写图书管理系统
  8. 17种Vue适用于移动端的ui框架
  9. Deep Match to Rank Model for Personalized Click-Through Rate Prediction
  10. 从球场捡拾矿泉水瓶的老人,看市场经济下的供求关系