代码实现
c
复制代码
#include "stm32f0xx_hal.h"
/* 定时器句柄 */
TIM_HandleTypeDef htim2;
/* 初始化定时器 */
void TIM2_PWM_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用定时器 2 的时钟
/* 配置定时器 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 48 - 1; // 预分频器,定时器时钟频率为 1 MHz(系统时钟 48 MHz)
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000 - 1; // 设置 PWM 周期为 1 ms
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim2); // 初始化定时器 2 为 PWM 模式
/* 配置 PWM 输出通道 */
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 设置占空比为 50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); // 配置 TIM2 的通道 1
/* 启动 PWM 输出 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟
/* 配置 PA5 为定时器输出 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 初始化 PWM */
TIM2_PWM_Init();
while (1)
{
// 在这里你可以修改 CCR 的值来调节 PWM 的占空比
// 例如,增加占空比:
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 750); // 将占空比调整为 75%
HAL_Delay(1000);
// 还可以动态调整 PWM 波形
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 250); // 将占空比调整为 25%
HAL_Delay(1000);
}
}
|