pwm.c#include "pwm.h"
TIM_HandleTypeDef TIM3_PWM_Struct; // TIM_PWM句柄
TIM_OC_InitTypeDef TIM3_OC_Sturct; // TIM_OC句柄
void TIM3_PWM_Init() // PWM初始化
{
TIM3_PWM_Struct.Instance = TIM3;
TIM3_PWM_Struct.Init.Prescaler = 90 - 1; // 预分频系数
TIM3_PWM_Struct.Init.Period = 500 - 1; // 自动装载值
TIM3_PWM_Struct.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数模式:向上计数
HAL_TIM_PWM_Init(&TIM3_PWM_Struct); // TIM_PWM初始化
TIM3_OC_Sturct.OCMode = TIM_OCMODE_PWM1; // 选择PWM1,还是PWM2
TIM3_OC_Sturct.Pulse = 250; // 占空比:为Period(ARR)一半
TIM3_OC_Sturct.OCPolarity = TIM_OCPOLARITY_LOW; // 因为小灯是低电平有效 选择低电平
HAL_TIM_PWM_ConfigChannel(&TIM3_PWM_Struct, &TIM3_OC_Sturct, TIM_CHANNEL_4); // 初始化PWM通道参数
HAL_TIM_PWM_Start(&TIM3_PWM_Struct, TIM_CHANNEL_4); // 使能定时器PWM
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3)
{
GPIO_InitTypeDef GPIO_Struct; // GPIO句柄
GPIO_Struct.Pin = GPIO_PIN_1; // PB1
GPIO_Struct.Mode = GPIO_MODE_AF_PP; // 推挽输出
GPIO_Struct.Pull = GPIO_PULLUP; // 上拉
GPIO_Struct.Speed = GPIO_SPEED_FAST; // 高速
GPIO_Struct.Alternate = GPIO_AF2_TIM3; // 复用为TIM3
HAL_GPIO_Init(GPIOB, &GPIO_Struct);
__HAL_RCC_TIM3_CLK_ENABLE(); // TIM3时钟使能
__HAL_RCC_GPIOB_CLK_ENABLE(); // GPIOB时钟使能
}
}
void TIM3_PWM_SetValue(TIM_HandleTypeDef *htim, uint32_t value) // 改变PWM占空比的值
{
htim->Instance->CCR4 = value; // 占空比大亮度亮,占空比小亮度暗
}
|