这次单独看看servo的测试
https://www.corvin.cn/3331.html 这里有介绍Servo的文章,感觉讲的不错
- 对于180度的舵机,是通过固定的频率,然后控制占空比来控制舵机的转动
这里有一个特殊的点是,舵机的移动是根据脉宽时间来的,所以只要周期大于2.5ms都可以进行控制。这里opencat用的频率是240 - 对于360度的电机,区别是舵机不是转到特定的角度,而是以一个速度不停的转动。
- 0.5ms:是正向的最大转速
- 1.5ms:速度为0,停止转动
- 2.5ms:反向最大转速
回过头来看看Servo库的逻辑:
* 用opencat中的舵机举例子,他的min max是500/2500,angle是270,然后freq是240
* timer_width,即占空比的精度是16位,即65536
* period即周期长度是 1000 * 1000 / freq = 4166
* ticks为 default_pulse_width * timer_width_ticks / period = 2w多
,这个意思是,默认情况下,宽度是1.5ms,然后一个周期这里计算出来是4.1ms,一除就得到了占空比,然后再乘上精度单位65536,就是要发送给电机的占空比
* pwd.attachPin,这里直接就是ledcSetup,设置timer width,以及freq。以及ledcAttachPin
* 后续写入的时候,用目的的角度,和max 270,映射到500~2500这个区间上,就是pulse_width,按照上面的方式就可以算出来需要写入多少tick了
* 读取的话,因为每次写入都记录了上次写入的ticks,这里直接转化一下就得到了,并没有去读取PWM中的数据。一个可能的问题是,如果不读取电机中的角度的话,会导致这个转动没有反馈,可能不能很好的做控制?
Servo的基本读写差不多就是这样,一些动态调整timer width,以及freq什么的暂时就不关注了
文章评论