普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)

简介

实现PWM呼吸灯。
主芯片 STM32F103ZET6
 呼吸灯引脚 : PC7

电路原理图

LED8 电路图
普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)_第1张图片
LED8 与 主芯片连接图
普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)_第2张图片

其他知识

公式

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灯)

初始化PC7为PWM输出

普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)_第3张图片

添加用户代码

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呼吸灯)

代码

不需要下载, 基本代码上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)

你可能感兴趣的:(普中STM32-PZ6806L,stm32,嵌入式硬件,单片机)