
遥控器发射机、接收机原理
每个通道信号脉宽0~2ms,变化范围为1~2ms之间。1帧ppm信号长度为20ms,理论上最多可以有10个通道,但是同步脉冲也需要时间,模型遥控器最多9个通道。

ppm格式

只连接了通道3(油门)
arduino要测量脉宽时间很简单。有专门的库函数pulsein( )。问题在于这个库函数使用查询方式,程序在测量期间一直陷在这里,cpu利用率太低。因此下面代码采用中断方式,效率很高。
代码参考:/zixunimg/eepwimg/arduino.cc/forum/index.php/topic,42286.0.html
arduino 代码复制打印
- //read ppm signals from 2 channels of an rc reciever
- ///zixunimg/eepwimg/arduino.cc/forum/index.php/topic,42286.0.html
- //接收机两个通道分别接arduino的数字口2、3脚
- //most arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).
- //the arduino mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).
- intppm1 =2;
- intppm2 =3;
- unsignedlongrc1_pulsestartticks,rc2_pulsestartticks;
- volatileintrc1_val, rc2_val;
- voidsetup(){
serial.begin(9600); //ppm inputs from rc receiver pinmode(ppm1,input); pinmode(ppm2,input); // 电平变化即触发中断 attachinterrupt(0, rc1, change); attachinterrupt(1, rc2, change); - }
- voidrc1()
- {
// did the pin change to high or low? if(digitalread(ppm1)==high) rc1_pulsestartticks =micros(); // store the current micros() value else rc1_val =micros()- rc1_pulsestartticks; - }
- voidrc2()
- {
// did the pin change to high or low? if(digitalread(ppm2)==high) rc2_pulsestartticks =micros(); else rc2_val =micros()- rc2_pulsestartticks; - }
- voidloop(){
//print values serial.print("channel 1: "); serial.print(rc1_val); serial.print(" "); serial.print("channel 2: "); serial.println(rc2_val); - }