STM32控制SG90舵机的PWM部分参数的设置解答
一、(180度)舵机控制要知道的知识
我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。
当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。
- 换句话说,我们要用单片机产生一个
周期(20ms)
的PWM波,然后获得对应这些时长(分别是0.5ms
、1ms
、1.5ms
、2ms
、2.5ms
)的高电平
。 - 或者说:它们是以20ms为周期的方波,分别为
2.5%
,5%
,7.5%
,10%
,12.5%
的占空比
。
二、PWM的参数要怎么计算
公式:f = SYSCLK/((TIM_Period+1)*(TIM_Prescaler+1))
- 我们已知的有:
- f=1/50Hz(舵机需要的频率)
- sys_clk=72MHz(根据板子的系统时钟频率来取值)
- 我们要求的是
分频值
和重装载值
:
- TIM_Prescaler:计时器的预分频器值,它决定了 PWM 信号的频率,也就是每秒钟有多少个脉冲。预分频值越大,每秒钟产生的脉冲数就越少,频率就越低
- TIM_Period:计时器的自动重装载寄存器(Auto-Reload Register,ARR)的值,用于确定计时器的计数周期。它决定了每个 PWM 周期的长度。重装载值越大,每个周期的长度就越长,脉冲也会持续更久。
总之,预分频值和重装载值的选择会直接影响到 PWM 信号的频率和占空比。通过适当地调整这两个值,你可以实现所需的 PWM 输出效果。需要根据具体的应用需求和硬件规格来确定适合的预分频值和重装载值。
用大白话说,比如倒着数数,预分频值就是你一次数几个数,装载值是你从哪个数开始倒数。
- 1次1个就是 100、99、98…
- 1次2个就是100、98、96… 以此类推。
然后再理解一下这个Compare:
你把数的这串数字看作是一整个波形。
波形嘛,是有高、低电平的。而Compare值就是用来指出高电平在其中所占的个数的。
那么把高电平所占的个数除以数字总个数,就是占空比啦!!!
1、为什么要分频呢?
定时器的计数有限。因为板子的系统时钟频率是72MHz,意味着1秒可以计数72M次。
- 对于16位的定时器,计数范围是0~65536,2的16次方嘛。
- 对于32位的定时器,则为0到4294967295。但是虽然可以满足,但是计数太快了,利用率就不行。所以通过给系统时钟分频,可以根据具体应用需求灵活地调整定时器的计数速度。对于需要高精度和高频率的应用,可以选择较高的系统时钟频率和相应的预分频系数;对于需要较低频率的应用,可以选择较低的系统时钟频率和相应的预分频系数。
我对它的理解是,我们通过一个生活中的数数例子来理解上面这段话。
假设你和朋友一起数数,计数范围是0到9。你们每秒钟能够数一次,并且使用一个计数器来记录当前的数字。
现在,假设你们使用的时钟是系统时钟,频率为100次/秒,即每秒钟系统时钟发生100个时钟脉冲。
如果你们直接将系统时钟作为计数器的输入时钟,计数器每接收到一个时钟脉冲就会加1,那么在1秒钟内,计数器将会累加100次。由于计数范围只有0到9,计数器的值会很快达到最大值9,并溢出回到0,无法完成较长的计数周期。
为了实现更长的计数周期和较低的频率,你们决定将系统时钟频率分频,比如分频为10。这意味着计数器每接收到10个时钟脉冲才会加1,也就是每秒钟计数器只会加1次。这样,计数器的值在1秒钟内只会从0增加到1,而不会溢出,可以实现更长的计数周期和较低的频率。
---------------------------------------例如----------------------------------------------
stm32F103C8T6的系统时钟是72MHz,
-
我给它进行72分频(
TIM_Prescaler=72
),也就是 72MHz / 72 = 1MHz (1秒1M个数),我们分频以后计一个数就是1us -
一个数1us,那我们需要20ms,也是20ms = 20 000us / 1us = 20000个(
TIM_Period=20000
),也就是我们需要计20000数,这很好理解吧。 -
cubeMX里是这么设置的
-
然后我们要知道下面这张图,意思就是在这个20ms的一个周期内,如果高电平占20ms中的0.5ms(占空比嘛,高电平在一个周期内的占比),则可以让舵机转到0°,后面的以此例推。
-
然后,问题来了,我们要记多少个数才可以达到0.5ms呢?
答:因为1us计数1个,0.5ms则是500us,所以对应500个嘛。
-
然后要怎么让单片机知道,我们这500个数,计的是高电平呢?(你要是没有设置,它肯定不知道的)
在CubeMX里
在代码里
2、为什么选择PWM模式1(TIM_OCMode_PWM1)呢?
按我的理解来说,pwm1的就是先输出有效电平(高电平)再输出无效电平(低电平)。而pwm2就是反过来,先输出无效电平再输出有效电平。
Hal库__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,500);或者是库函数的 TIM_SetCompare3(TIM3,500);
当配置的是pwm1模式,那这句话的意思都是,输出计500个数的时间的有效电平(高电平),500*1us=0.5ms,剩余的(20-0.5)ms则是低电平。
若是配置pwm2模式,也是输出的500个数的时间是低电平。【一般都用pwm1】
如果还是不太懂的话,可以去看看江科大讲的stm32入门教程。