当前位置: 首页 > news >正文

STM32CubeIDE新建项目过程记录备忘(八)使用通用定时器中断生成PWM波形

名词解释:PWM

本例是一个PWM输出demo。

  • GPIO管脚设置: 

        将TIM2的Channel3设置为PWM generation GH3,它对应的管脚是PA2,当Channel3设置为PWM generation GH3后,PA2就自动被设置为TIM2_CH3。

  •  PWM载波频率设置:

PWM载波频率:  f_{PWM}=\frac{F_{t}/(Prescaler+1) }{Counter Period+1} 

        本例的APB1定时器的时钟频率F_{t}=72MHz。Prescaler=71,Counter Period=999,就可以得到1KHz的载波频率。

  • 中断配置: 

 

  • 生成代码:

配置完成后生成代码。 记得选这个:

  • 新建tim_app.h 和 tim_app.c 文件:

  • 在tim_app.h内添加代码:

 

#ifndef __TIM_APP_H
#define __TIM_APP_H#include "stm32f1xx_hal.h"  // 根据芯片系列调整void TIM2_PWM_Init(void);
void TIM2_PWM_Start(void);
void TIM2_PWM_Update_Duty(uint32_t duty);  // duty: 0~100#endif

 在tim_app.c内添加代码:

#include "tim_app.h"
#include "main.h"extern TIM_HandleTypeDef htim2;// 初始化封装(可选)
void TIM2_PWM_Init(void)
{// CubeMX 已生成 MX_TIM2_Init()
}// 启动 PWM
void TIM2_PWM_Start(void)
{HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
}// 设置占空比(0~100)
void TIM2_PWM_Update_Duty(uint32_t duty)
{if (duty > 100) duty = 100;__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, duty * 10);  // ARR=999 → duty*10
}
  • 在main.c内添加代码:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
static uint8_t direction = 1;  // 1: 增加, 0: 减少
static uint32_t duty = 0;     //初始占空比=0%
/* USER CODE END 0 */

 

/* USER CODE BEGIN 2 */TIM2_PWM_Start();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){TIM2_PWM_Update_Duty(duty);HAL_Delay(20);  // 每 20ms 调整一次,2 秒完成 0→100→0if (direction){duty++;if (duty >= 100)direction = 0;}else{duty--;if (duty == 0)direction = 1;}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

 

        这里是在main.c的主循环里周期刷新占空比,当然也可以再开一个定时器中断,在定时器中断响应里周期调整占空比。

http://www.dtcms.com/a/316702.html

相关文章:

  • LINUX 85 SHElL if else 前瞻 实例
  • MLS学习
  • vue3 计算属性
  • Docker 容器内进行 frp 内网穿透
  • 关于怎么知道linux(ubuntu)系统交叉编译器的命令的方法:
  • web-vue工作流程
  • 从AUTOSAR角度理解CAN以及CANFD
  • 权值树状数组
  • 政务信息化项目建设管理办法的主要内容有哪些
  • 防火墙和网闸的区别,什么场景下,需要用到网闸?
  • iOS混淆工具有哪些?技术演进与选型趋势全景解析
  • 《C++》继承完全指南:从入门到精通
  • BeanFactory 和 ApplicationContext 的区别?
  • python-自定义抠图
  • 【分析学】内积空间中的线性算子
  • lumerical——多模干涉耦合器(MMI)
  • 机械学习--决策树(实战案例)
  • lumerical——Y分支功分器
  • Linux学习-数据结构(链表)
  • GISBox一键转换IFC到3DTiles
  • 【PCIE044】基于 JFM7VX690T 的全国产化 FPGA 开发套件
  • 分布式网关技术 + BGP EVPN,解锁真正的无缝漫游
  • 防火墙安全策略练习
  • PBX Feature Code(功能码)
  • 【DAB收音机】DAB系统架构介绍
  • mq_unlink系统调用及示例
  • 图像处理控件Aspose.Imaging教程:使用 C# 将 SVG 转换为 EMF
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
  • 【PCB】3. 信号部分设计
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘keras’问题