一、实验目的
使用定时器PWM功能,输出占空比可变的PWM波用来驱动LED灯,从而达到LED亮度由暗变亮,又从亮变暗,如此循环。
二、代码及分析
#include "timer.h"
TIM_HandleTypeDef TIM3_Handler; // 定时器3PWM句柄
TIM_OC_InitTypeDef TIM3_CH4Handler; //定时器3通道4句柄
void TIM_PWM_Init(u16 psc,u16 arr)
{
TIM3_Handler.Instance = TIM3;
TIM3_Handler.Init.Prescaler = psc;
TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM3_Handler.Init.Period= arr;
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM3_Handler);
// 以上为初始化PWM时基参数
// 配置TIM3通道4
TIM3_CH4Handler.OCMode = TIM_OCMODE_COMBINED_PWM1;
TIM3_CH4Handler.Pulse = arr/2;
TIM3_CH4Handler.OCPolarity=TIM_OCNPOLARITY_LOW;
HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_4); //开启PWM通道4
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_1; //PB1
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
GPIO_Initure.Alternate=GPIO_AF2_TIM3; //复用为TIM3_CH4
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化PB1
}
}
//设置TIM3通道4的占空比
//compare :比较值
void TIM3_Setcompare4(u32 compare)
{
TIM3->CCR4 = compare;
}
int main(void)
{
u8 dir =1;
u16 led0pwmval =0;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
TIM_PWM_Init( 108-1,50-1) ; // PWM频率为20K HZ
while(1)
{
delay_ms(10);
if(dir)led0pwmval++; //dir==1 led0pwmval递增
else led0pwmval--; //dir==0 led0pwmval递减
if(led0pwmval>30)dir=0; //led0pwmval到达30后,方向为递减
if(led0pwmval==0)dir=1; //led0pwmval递减到0后,方向改为递增
TIM3_Setcompare4(led0pwmval); //修改比较值,修改占空比
}
}
(1)首先,自己定义一个 TIM_PWM_Init(u16 psc,u16 arr)函数,来调用HAL_TIM_PWM_Init(&TIM3_Handler);
来初始化PWM时基参数 ,包括自动重装载值arr、定时器分频数psc、计数模式等 。调用HAL_TIM_PWM_ConfigChannel()来进行PWM的通道设置。它的第二次参数用来设置PWM的输出模式、极性、比较值等参数。调用HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_4) 来使能定时器TIM3、使能能定时器TIM3的CH4输出。
(2)在回调函数HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)中,开启定时器时钟和GPIOB时钟、并把PB1复用为TIM3_CH4输出。
(3)设置TIM3通道4的占空比函数 TIM3_Setcompare4(u32 compare)
(4)在while循环中,dir =1,规定灯为暗, led0pwmval递增,占空比增大,灯由暗变亮。等到30时, led0pwmval递减,占空比减小,灯由亮变暗。如此循环。