STM32L051C8T6 HAL库 使用PWM控制LED灯(呼吸灯效果)
目录
2、知识回顾,要使用PWM功能,必须要在通用定时器配置才行,基本定时器是没有PWM这个功能的。
1、STM32CubeMx配置(注:占空比参数不需要填,默认即可)
概述
本示例,只要演示,使用PWM来控制LED灯(呼吸灯效果)。
1、芯片型号: STM32L051C8T6
通道 :TIM22_CH2
输出引脚:PA7
2、知识回顾,要使用PWM功能,必须要在通用定时器配置才行,基本定时器是没有PWM这个功能的。
1) 通用定时器(TIM2/3,TIM21/22)
2) 基本定时器(TIM6/7)
对定时器周期公式的理解:
F = 1 / T (周期与频率的公式)
其中TICK为时钟频率,PSC为时钟预分频系数,arr为自动重装载值。
F = Tick / (psc+1) * (arr+1)
(注意:频率F来计算ARR和PSC,由于ARR和PSC寄存器只有16位,所以ARR和PSC值都必须小于65535,且只能是整数)
Tick / (psc+1)即为时钟频率,1/f 为机器周期,乘以(arr+1)即可得出定时器周期。
例子:TICK=72MHZ,psc=71,时钟周期=1us,(arr+1)值为多少,定时器周期就为多少毫秒。
3、引脚配置
1、STM32CubeMx配置(注:占空比参数不需要填,默认即可)
2、main.c文件代码
/* USER CODE BEGIN 1 */
uint16_t dutycycle=0;
uint8_t dir=0;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
// HAL_TIM_PWM_Start(&htim22, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim22, TIM_CHANNEL_2);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
#if 0
while(dutycycle<1000)
{
dutycycle++;
// __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,dutycycle); //库操作方式
__HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,dutycycle); //库操作方式
// TIM22->CCR2 = dutycycle; //寄存器操作方式
HAL_Delay(1);
}
while(dutycycle)
{
dutycycle--;
// __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,dutycycle); //库操作方式
__HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,dutycycle); //库操作方式
// TIM22->CCR2 = dutycycle; //寄存器操作方式
HAL_Delay(1);
}
HAL_Delay(100);
// HAL_TIM_PWM_Stop(&htim22, TIM_CHANNEL_1); //这里根据具体情况来定,禁用pwm
// HAL_TIM_PWM_Stop(&htim22, TIM_CHANNEL_2); //
#else
HAL_Delay(2);
if(dir) dutycycle++;
else dutycycle--;
if(dutycycle>1000) dir = 0;
else if(dutycycle<=1000) dir = 1;
// __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,dutycycle); //库操作方式
__HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,dutycycle); //库操作方式
#endif
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
注:决定输出频率和占空比主要由这三个参数(Prescaler(PSC:分频系数)、Period(重装载值)、Pulse(脉宽值))决定的。
例一:
PWM频率 = 系统时钟32MHZ / 32 / 1000 = 1000HZ = 1KHz
占空比 = 脉宽值(Pulse) / 装载值(Period) * 100% = 999 / 1000 * 100% = 99.9%
例二:
输出1KHz,20%来举例说明:
TIM22_PRESCALER_VALUE = 32M / 2 / 8M - 1 = 1 (也就是2分频)
tim22_Period = 8000 - 1
tim22_Pulse = 1600
频率1KHz = 16M / 16000
占空比20% = 1600/16000
同理:3200/32000也是20%
3、LED呼吸灯效果
代码链接 (注:代码中,漏了配置占空比参数 ) sConfigOC.Pulse = 999;
相关文章
- 轻松控制EasyUI-Tab选项卡
- 【原创】.NET读写Excel工具Spire.Xls使用(3)单元格控制
- CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)
- VXLAN中EVPN技术详解(一)——EVPN实现VXLAN隧道控制
- springboot+mybatis整合shiro——登录认证和权限控制
- 〖Python 数据库开发实战 - Python与MySQL交互篇③〗- MySQL Connector的事务控制与异常处理
- m十字路口多功能控制交通系统,包括基于遗传算法优化的红绿灯时长模糊控制器和基于BP神经网络的车牌识别算法
- leaflet 加载视频,添加暂停播放等控制按钮(095)
- Linux下CMake简明教程(10) 定义宏来控制打印的信息
- LabVIEW编程LabVIEW控制NI-9205例程与相关资料
- DropboxC2 工具原理总结——就是通过dropbox文件来间接做c2控制和交互。
- Scratch3.0——助力新进程序员理解程序(五、控制)