我使用的是定时器3进行pwm呼吸灯调试
一、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使能中断关闭函数
二、CUBEMX配置
(1)RCC配置

(2)设置LED引脚A6为TIM3_CHANNEL1

?(3)TIM3配置

?将TIM3设置为外部时钟源。
具体pwm设置:

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%
三、代码编写
/* 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 */
}
|