背景
很早以前在看江协科技的课程时,他驱动舵机的VCC是5.0V,PWM信号是标准3.3V,舵机能够被正常驱动。但是实际上这种接法并不完全正确。
由数据手册我们可以看到SG90的供电电压范围为4.8V~6V,5V在合适的范围内。
但是要关心以下两点:
1.数据手册显示在20ms的周期中,1ms的脉冲对应-90°,2ms的脉冲对应90°。(错误版本)
这与我们熟知的PWM驱动舵机规则是不同的(正确版本):
并且经过实际测试,数据手册中所给出的1 - 2ms Duty Cycle是不可行的。无法从-90°映射到90°。我又查阅了很多数据手册,发现都是这样写的,排除数据手册大批量出现这么低级的错误的情况,也许是国外的舵机版本与我们的版本不同?
2.数据手册规定PWM信号的电平最大值为4.8V~5V
也就是说,舵机的供电以及PWM信号最好都为5V。
但是经过实测,对于SG90舵机来说,在接5V电压时,不需要额外的PWM电平转换电路,3.3V的PWM信号也能够完全驱动舵机从-90°转动到90°。
野火作为stm32培训的领头羊,在野火的舵机驱动教程中,他们给出了一套更为严谨的方案:将stm32单片机输出的3.3V PWM信号转化为5V的方案:
分析:
在J28中,1为GND,2为VCC,3为PWM信号。在这里我们分析3号引脚电路。
PD12为单片机PWM输出信号。
a. 假设我们输出2.5ms脉冲的舵机驱动信号,理论上PD12处的最高电压为2.5/20*3.3=0.4125V,也就是三极管基极的电压为0.4125V,而根据SS8050的数据手册可知,这是一个硅三极管,该NPN三极管的导通电压Vbe值约为0.7V。PWM输入信号的电压值完全无法使三极管开启。说明此时无法完成PWM电平转换的功能。
b. 假设我们输入占空比为40%的PWM信号,PD12处的最高电压为0.4*3.3=1.32V。
在输出高电平期间,三极管导通,Vce接近于0v,三极管ce视为短接,向舵机输入0v信号;
在输出低电平期间,三极管截至,Vce接近于5V,三极管ce视为断路,向舵机输入5V信号;
从以上我们可以看出,这里的电平转化电路实际上是经历了一个反相。
那我们要如何弥补这个反相呢?
这里介绍下stm32的PWM模式:
模式1规定,当定时器的计数值CNT小于CCR时输出高电平,大于CCR时输出低电平
模式2规定,当定时器的计数值CNT小于CCR时输出低电平,大于CCR时输出高电平
可以看出,模式1与模式2正好是反相的关系。
具体分析为,通过PWM输出1ms的低电平信号时,电平转化电路产生对应的1ms高电平信号;
输出剩余19ms高电平信号时,电平转化电路产生对应的19ms低电平信号,完美补偿了电平转化电路所带来的影响。