我使用的是定时器3进行pwm呼吸灯调试
目录
一、pwm所用到的hal库函数
二、CUBEMX配置
(1)RCC配置
(2)设置LED引脚A6为TIM3_CHANNEL1
(3)TIM3配置
具体pwm设置:
(4)计算PWM占空比
PS:计算的教学:
三、代码编写
四、简单解析
__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); //修改比较值,修改占空比
将TIM3设置为外部时钟源。
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低电平点亮
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 */
}
改CCR1可以修改占空比,修改arr可以修改频率
PWM频率:
Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)
占空比: