pwm输出依靠的是定时器通道,stm32除了定时器6,7,都有输出pwm的通道,高级定时器通道数还要多于普通定时器。定时器的核心特质就是两个参数:频率和占空比,这里先告诉大家结果,设置频率在CubeMX上设置,而占空比我写了一个函数大家可以设置占空比。
开启pwm输出是很简单的哈,但是要理解他这个分频和计数周期的设置,这很重要。
下面是main中该有的部分
下面是自己写的设置pwm的函数部分
这是使能定时器那一点代码
HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_1); //使能PWM输出
HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_2); //使能PWM输出
SET_PWM(htim9,50,1);
SET_PWM(htim9,250,2);
这是我自己写的设置pwm值的方法,原理在上面那几张图里面有讲解,大家看一下很容易明白。
void SET_PWM(TIM_HandleTypeDef tim_temp,uint16_t value , unsigned char num)
{
if(num == 1){
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&tim_temp, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&tim_temp, TIM_CHANNEL_1);
}
if(num == 2){
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&tim_temp, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&tim_temp, TIM_CHANNEL_2);
}
if(num == 3){
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&tim_temp, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&tim_temp, TIM_CHANNEL_3);
}
if(num == 4){
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&tim_temp, &sConfigOC, TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&tim_temp, TIM_CHANNEL_4);
}
}
到这里就是pwm输出的用法了,设置之后我的舵机接在这连个通道上可以看出是转到了我想要的角度上的,这里补充一点,9克舵机转角为180度左右,时基是20ms,也就是在20ms这个周期上,每个周期若果占空比为0.5ms,就转到0度位置,如果占空比为2.5ms,就转到180度极限位置,中间的位置自己换算,很容易上手用,至于其他舵机大同小异哈。
我是一个新人博主,目前也是一个大学生,但是真心喜欢嵌入式和物联网,已经自学3年了,我会带着热爱一直把博文写下去,也是自己记笔记的一种方式,大家可以关注我,给我留言,一起学习