【Day20】:Servo控制-By PWM输出

Servo

对於简单的角度控制,大家第一个想到的就是伺服马达了吧,大小也适中,非常适合用在机器人上。
https://ithelp.ithome.com.tw/upload/images/20210921/20141525pR8xDfIA3M.jpg
还记得我们以前在Arduino的时代是怎麽控制Servo的吗?
伺服马达总共就只有三条线(通常是咖啡色、红色、黄色),分别对应到GND、5V、PWM,前面两个应该没什麽问题吧,而PWM的那条线我们就会把他接到Arduino上面有一个波浪号的脚位上,然後再打一行程序:

Servo myservo;  
void setup() {
  myservo.attach(9);  // 设定要将伺服马达接到哪一个PIN脚
}
void loop() {   
  myservo.write(50)

而上面的三行程序码中,最关键的就是myservo.write()了,这一行事实上就是做方波的输出,而这个方波的频率是490Hz(~500Hz)。

用STM32控制Servo

昨天我们已经介绍了PWM的输出,因此只要配置好PSC、ARR等值,并不难,真正难的点在於,究竟是多少dutycycle对应到多少角度呢?这个问题的答案我真的查了好久,我不知道是我查的方式有问题还是怎样,但我就是查不太到这个数据。
起初我将0%对应到0度,100%对应到180度,结果很显然Servo完全不受控,因为根本就不是这样嘛...
而最後聪明的我就想到,只要在arduino用myservo.write()将servo转到两个角度,我再用视波器去量测我到底输出了什麽东西就可以啦!

void loop() {   
  myservo.write(0)
  myservo.write(150)

经过我的测量,我得到的结果如下:

角度 duty cycle(%)
0 3%
150 10.5%

很吃惊吧,居然是这麽诡异的数字。而用哪两个角度并不是太重要,总之你知道角度与dutycycle是线性的关系,有两点你就可以反推线性方程序了。
我们就直接给出结果:

duty = 3 + (double) angle / 150 * 7.5;

可以将angle代入0、150验算一下,duty分别是3与10.5。

小结

帮大家整理一下,总之控制伺服马达很简单,就是输出一个PWM到黄色那条线,而设定的部分,预设的情况时钟的频率是16MHz,PSC设为15、ARR设为20000,这样输出的方波频率就会是500Hz,接着Pulse的部分可以先设为600让servo转到0度。在程序内部我们可以用昨天教的

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 20000*duty);

这个函式来改pulse的值,(timer跟channel要看你脚位的配置),duty这个变数就是dutycycle,而角度换算成dutycycle的公式就用上面的那行即可。

就实际接线,看看Servo有没有照着自己设定的角度来转动吧~


<<:  【Day19】:PWM输出-模拟类比讯号

>>:  【Day21】:客制化的PWM输出

[Day 11] 实作 Ktor i18n 机制

以微框架来说,i18n 不是必备的功能,但如果是想要开发面向一般大众的服务,在这个国际化的时代,i1...

Day 30 聊聊一些 JS 几个常听到的名词

API 常听到工程师在工作场域中说要取得什麽 API,那这个 API 表示的是什麽意思呢? API ...

Day 16. Hashicorp Vault: Upgrade

Hashicorp Vault: Upgrade 升级方式: Vault是binary的档案,所以更...

Day3. 如何在生活中提升设计判断力

昨天我们讨论了怎麽判断什麽是好的设计,属於道的部份。今天来谈谈术的部份,怎麽内化这种判断能力 日常...

成员 2 人:别公平、别相爱、别把友情当应该

「一支筷子易折断,两支筷子好夹菜。」 两个人很常一起 IT 创业的原因是: 你是设计师,我是工程师 ...