实现PWM呼吸灯。
主芯片 STM32F103ZET6
呼吸灯引脚 : PC7
LED8 电路图
LED8 与 主芯片连接图
PWM周期公式:
Tpwm = ( (ARR + 1) * (PSC + 1) ) / Tclk
Tclk为定时器的输入时钟频率
Tout则为定时器溢出时间
ARR为计数周期
PSC为预分频器的值PWM频率 计算公式:
Fpwm = 主频 / ((ARR+1)(PSC+1))占空比的计算公式为 :
duty circle = TIMx->CCRy / ARR
CCRy代表比较寄存器本例中
Fpwm 频率为 Fpwm = 72MHz/(500 * 72) = 2KHz
占空比 = TIMx->CCRy / ARR = TIMx->CCRy / 500
占空比最大是1 最小是0, 所以值最大500, 最小0
参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)
main.c
#include "tim.h"
#define PWM_TIMER htim8
#define PWM_TIMER_CHANNEL TIM_CHANNEL_2
void PWM_DoAction(void)
{
uint8_t isIncreasing = 1; // 递增还是递减
int32_t pwmValue = 0; // pwm值
uint16_t pwmMaxValue = PWM_TIMER.Init.Period + 1; // 最大值
int16_t pwmIncrementValue = pwmMaxValue/50; // 增量
HAL_TIM_PWM_Start(&htim8, PWM_TIMER_CHANNEL); // 启动PWM输出
__HAL_TIM_SET_COMPARE(&htim8, PWM_TIMER_CHANNEL, pwmValue); // 设置默认PWM值0
while (1)
{
if (isIncreasing)
{
pwmValue += pwmIncrementValue;
if (pwmValue >= pwmMaxValue)
{
isIncreasing = 0;
}
}
else
{
pwmValue -= pwmIncrementValue;
if (pwmValue <= pwmIncrementValue)
{
isIncreasing = 1;
}
}
__HAL_TIM_SET_COMPARE(&htim8, PWM_TIMER_CHANNEL, pwmValue); // 设置默认PWM值0
HAL_Delay(50);
}
}
int main()
{
...
while(1)
{
PWM_DoAction();
}
...
}
普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)