欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(HAL库学习7)STM32CubeMX HAL库 PWM输出

程序员文章站 2022-06-09 08:19:41
...

这一节是设置STM32单片机定时器PWM输出驱动舵机

pwm输出依靠的是定时器通道,stm32除了定时器6,7,都有输出pwm的通道,高级定时器通道数还要多于普通定时器。定时器的核心特质就是两个参数:频率和占空比,这里先告诉大家结果,设置频率在CubeMX上设置,而占空比我写了一个函数大家可以设置占空比。

第一步在CubeMX上开启pwm输出通道:

(HAL库学习7)STM32CubeMX HAL库 PWM输出
开启pwm输出是很简单的哈,但是要理解他这个分频和计数周期的设置,这很重要。

第二步:在生成的工程中使用PWM输出

(HAL库学习7)STM32CubeMX HAL库 PWM输出
下面是main中该有的部分
(HAL库学习7)STM32CubeMX HAL库 PWM输出
下面是自己写的设置pwm的函数部分
(HAL库学习7)STM32CubeMX HAL库 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年了,我会带着热爱一直把博文写下去,也是自己记笔记的一种方式,大家可以关注我,给我留言,一起学习