设计需求
利用定时器产生PWM,实现LCD亮度渐变
一、基础知识
PWM(Pulse Width Modulation)、即脉冲宽度0度调制。是一种利用微处理器的数字输出来对模拟电路进行控制的技术,广泛应用在测量、通信、功率控制等诸多领域。
举个最常见的例子,利用PWM控制显示屏亮度,屏幕背光可以看作是一个大灯,这个大灯只有亮,灭两种状态。如果把灯亮看作100%,灯灭看作0%,要实现50%的亮度,可以在某个单位时间里亮灯50%时间、灭灯50%时间,只要这个单位够小,由于人眼具有视觉暂留效应,就会从宏观的感觉整个灯是一直亮着,且亮度只要原来的一半。本节就以LED灯类比屏幕背光灯实现对其亮度的控制。
PWM实质就是GPIO不断地翻转输出高低电平,这个效果可以写代码控制GPIO产生,但是这样就会占用CPU,CPU就不方便去做其他时间。MCU里都有一个定时器,配置好这个定时器,就可以让它去控制CPIO自动翻转,无需CPU再参与
STM32MP157有14个定时器TIM(各有差异),5个低功耗定时器(LPTIM)
硬件知识
参考开发板LED原理图,两个LED灯,分别使用PA10和PG8
通过查阅数据手册可以知道两个脚都支持TIM功能
这里以PG8为例,设置其复用功能位TIM2_CH1输出PWM
STM32CubeIDE开发
MX设置
代码设计
driver_tim_pwm.h
#ifndef DRIVER_TIM_PWM_H_
#define DRIVER_TIM_PWM_H_
#include "main.h"
#include "stm32mp1xx_hal.h"
extern TIM_HandleTypeDef htim2;
extern void TIM_LED3_Start(void);
#endif /* DRIVER_TIM_PWM_H_ */
driver_tim_pwm.c
#include "driver_tim_pwm.h"
#include "stm32_hal_legacy.h"
static uint32_t pulse=0;
//设置PWM一个周期满,溢出时,的回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIM2){
pulse++;//进入中断回调函数,更改pulse的值,进行更改占空比
if(pulse>1000){
pulse=0;
}
__HAL_TIM_SetCompare (&htim2, TIM_CHANNEL_1, pulse);
}
}
//启动PWM函数
void TIM_LED3_Start(void){
if(HAL_TIM_Base_Start(&htim2)!=HAL_OK){//轮询中断是否开启
Error_Handler();
}
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//开启PWM定时器
}
工程结构
运行结果
实验现象没问题,黄灯从亮变暗,一直循环