STM32HAL库学习之路(五):PWM呼吸灯

我使用的是定时器3进行pwm呼吸灯调试

目录

一、pwm所用到的hal库函数

二、CUBEMX配置

(1)RCC配置

(2)设置LED引脚A6为TIM3_CHANNEL1

 (3)TIM3配置

具体pwm设置:

(4)计算PWM占空比

PS:计算的教学:

三、代码编写

四、简单解析


一、pwm所用到的hal库函数

__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)//pwm占空比设置
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);//pwm使能函数

HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);//pwm使能关闭函数
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);//owm中断使能函数
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);//pwm使能中断关闭函数
#define __HAL_TIM_SetCompare            __HAL_TIM_SET_COMPARE
__HAL_TIM_SetCompare(&htim, TIM_CHANNEL_, pwmVal);    //修改比较值,修改占空比

二、CUBEMX配置

(1)RCC配置

STM32HAL库学习之路(五):PWM呼吸灯_第1张图片

(2)设置LED引脚A6为TIM3_CHANNEL1

STM32HAL库学习之路(五):PWM呼吸灯_第2张图片

 (3)TIM3配置

STM32HAL库学习之路(五):PWM呼吸灯_第3张图片

 将TIM3设置为外部时钟源。

具体pwm设置:

STM32HAL库学习之路(五):PWM呼吸灯_第4张图片

Prescaler(时钟预分频数):72-1=71
Counter Mode(计数模式):Up(向上计数模式)
Counter Period(自动重装载值):1000-1(计数值即到此溢出)
Internal Clock Division(CKD)(时钟分频因子):No Division(不分频)
auto-reload preload(自动重装载):Disnable(不使能)//使能不使能在这不影响工作

Mode(定时模式):PWM mode 1 设置定时器计数器与比较值相等时输出引脚的状态
Pulse(计数比较值):500

//我们也可以设置为0,然后在中断中再改变比较寄存器的值
Output compare preload(输出比较预加载):Enable(使能) 作用和 auto-reload preload 类似
Fast Mode(脉冲快速模式):Disable(不使能) 与我们配置无关不使能
CH Polarity(输出极性):Low 当定时器计数值小于 CCR1_Val 时,输出低电平,LED低电平点亮

(4)计算PWM占空比

1.预分频寄存器PSC:决定时钟频率,定时器时钟频率为72M,分频后为为72M/(71+1)=1M
2.自动重装载寄存器ARR:也与定时器时钟频率有关,决定PWM输出周期,此处设置为999
3.脉冲宽度Pulse:用来设置占空比,初始化占空比=500 / 999约=50%

PS:计算的教学:

定时器的配置主要有两个,一个是定时时间,另一个就是是否重装定时器。

而我们常说的定时频率(定时周期) = 定时器时钟 / (预分频 +1 / (计数值 + 1 MHz
定时时间 = 1 / 定时频率 Ms
定时器时钟我们一般都默认为72Hz,默认频率拉到最大,而Prescaler(时钟预分频数)和计数值Pulse(计数比较值)就是我们主要要配置的东西。
如这个示例为例计算:
(预分频+1)*(自动装载值+1)/时钟频率
STM32CUBEMX配置如下:(71+1)*(999+1)/72M=1ms
占空比为:pluse/(999+1)
剩下的就是占空比的调试,我一般都是默认定时器时钟频率为72,预分频为71,计数值为999,这样的定时的时间就为1s,剩下的只需要更改占空比即可。

三、代码编写

  /* USER CODE BEGIN 1 */
	uint16_t  pwm_pulse=0;//占空比
	uint8_t pwm_dir=0;//标志位,用来调整方向
  /* USER CODE END 1 */
  /* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  /* USER CODE END 2 */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(pwm_dir==0)
		{
		 HAL_Delay(10);
		 TIM3->CCR1 = pwm_pulse++;
			if(pwm_pulse>999)
			{
				pwm_dir=1;
			}
			else
			{
				pwm_dir=0;
			}
		}
		else if(pwm_dir==1)
		{
			HAL_Delay(10);
			TIM3->CCR1=pwm_pulse--;
				if(pwm_pulse<1)
			{
				pwm_dir=0;
			}
			else
			{
				pwm_dir=1;
			}
		}
  }
  /* USER CODE END 3 */
}

四、简单解析

改CCR1可以修改占空比,修改arr可以修改频率

PWM频率:

Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)

  • arr 是计数器值
  • psc 是预分频值

占空比:

  • duty circle = TIM3->CCR1 / arr(单位:%)
  • TIM3->CCR1  用户设定值

你可能感兴趣的:(stm32hal库学习之旅,单片机,嵌入式,stm,stm32)