由于Arduino的Servol类不支持teensy,当需要用teensy对舵机驱动时,就要自动动手写响应的代码了。以下是我的笔记。
1.单片机是通过PWM信号驱动舵机的,通常驱动舵机的PWM信号的频率为500Hz(见舵机技术规格)。
但Teensy的PWM信号的频率就不一定是500Hz了。好就好在Teensy提供了设置PWM波频率的功能,可根据需要自行设置。
analogWriteFrequency(14, 500); //将Pin14的pwm的频率置为500赫兹。
注意,将Pin14的频率修改后,其他所以针的PWM频率都将随之改变。
2.控制舵机信号的分辨率。这一项不是必须的。Teensy与其他的板子相同,缺省的分辨率为512(8位),为使舵机的动作更加细腻,可把控制舵机的pwm输出信号的分辨率置为1024(10位)。
analogWriteResolution(10); // analogWrite value 0 to 1024, or 4096 for high
3.修正PWM信号脉冲宽度与舵机角度的关系
理论上,当脉冲宽度从0->1023时,舵机的转角会从最小转为最大。但实际测试时发现,舵机的最小转角并不在PWM脉冲宽度为零时。我手上的舵机就是从大于300以后才开始动作的。
实测我的一只金属舵机: 脉冲宽度300-1024 对应舵机的角度约为0-160度。
拿到这组数据后,自然就可以在程序中计算脉冲宽度与舵机转角的关系了。下面这段代码就是干这件事的,你可以观测PWM值和舵机的角度关系。
void setup() {
// put your setup code here, to run once:
pinMode(3,OUTPUT);
analogWriteFrequency(3, 500); //将pwm的频率置为500赫兹。
analogWriteResolution(10); // analogWrite value 0 to 1024, or 4096 for high
Serial.begin(115200);
}
void loop() {
for(int i=300;i<1023;i++) {
Serial.println(i);
analogWrite(3, i);
delay(10);
}
for(int i=1023;i>300;i--) {
analogWrite(3, i);
Serial.println(i);
delay(10);
}
}