对於简单的角度控制,大家第一个想到的就是伺服马达了吧,大小也适中,非常适合用在机器人上。
还记得我们以前在Arduino的时代是怎麽控制Servo的吗?
伺服马达总共就只有三条线(通常是咖啡色、红色、黄色),分别对应到GND、5V、PWM,前面两个应该没什麽问题吧,而PWM的那条线我们就会把他接到Arduino上面有一个波浪号的脚位上,然後再打一行程序:
Servo myservo;
void setup() {
myservo.attach(9); // 设定要将伺服马达接到哪一个PIN脚
}
void loop() {
myservo.write(50)
而上面的三行程序码中,最关键的就是myservo.write()了,这一行事实上就是做方波的输出,而这个方波的频率是490Hz(~500Hz)。
昨天我们已经介绍了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有没有照着自己设定的角度来转动吧~
以微框架来说,i18n 不是必备的功能,但如果是想要开发面向一般大众的服务,在这个国际化的时代,i1...
API 常听到工程师在工作场域中说要取得什麽 API,那这个 API 表示的是什麽意思呢? API ...
Hashicorp Vault: Upgrade 升级方式: Vault是binary的档案,所以更...
昨天我们讨论了怎麽判断什麽是好的设计,属於道的部份。今天来谈谈术的部份,怎麽内化这种判断能力 日常...
「一支筷子易折断,两支筷子好夹菜。」 两个人很常一起 IT 创业的原因是: 你是设计师,我是工程师 ...