【大力电子】单片机解码PPM信号-深层了解遥控-为DIY控作准备
单片机解码PPM信号--深层了解遥控----(该篇可为DIY控作准备)无线遥控就是利用高频无线电波实现对模型的控制。如天地飞的的6通道2.4 GHz遥控器,一套200多块,具有自动跳频抗干扰能力,从理论上讲可以让上百人在同一场地同时遥控自己的模型而不会相互干扰。而且在遥控距离方面也颇具优势,2.4 GHz遥控系统的功率仅仅在100 mW以下,而它的遥控距离可以达到1km以上。 遥控器发射机、接收机原理 每个通道信号脉宽0~2ms,变化范围为1~2ms之间。1帧PPM信号长度为20ms,理论上最多可以有10个通道,但是同步脉冲也需要时间,模型遥控器最多9个通道。 PPM格式 只连接了通道3(油门) arduino要测量脉宽时间很简单。有专门的库函数pulseIn( )。问题在于这个库函数使用查询方式,程序在测量期间一直陷在这里,CPU利用率太低。因此下面代码采用中断方式,效率很高。 1.//read PPM signals from 2 channels of an RC reciever2.//http://arduino.cc/forum/index.php/topic,42286.0.html3. 4.//接收机两个通道分别接arduino的数字口2、3脚5.//Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).6.//The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).7.int ppm1 = 2;8.int ppm2 = 3;9. 10. unsigned long rc1_PulseStartTicks,rc2_PulseStartTicks; 11. volatile int rc1_val, rc2_val;12.13. void setup() {14.15. Serial.begin(9600);16.17. //PPM inputs from RC receiver18. pinMode(ppm1, INPUT);19. pinMode(ppm2, INPUT);20.21. // 电平变化即触发中断22. attachInterrupt(0, rc1, CHANGE); 23. attachInterrupt(1, rc2, CHANGE); 24. }25.26. void rc1()27. {28. // did the pin change to high or low?29. if (digitalRead( ppm1 ) == HIGH)30. rc1_PulseStartTicks = micros(); // store the current micros() value31. else32. rc1_val = micros() - rc1_PulseStartTicks;33. }34.35. void rc2()36. {37. // did the pin change to high or low?38. if (digitalRead( ppm2 ) == HIGH)39. rc2_PulseStartTicks = micros(); 40. else41. rc2_val = micros() - rc2_PulseStartTicks;42. }43.44. void loop() {45.46. //print values47. Serial.print("channel 1:");48. Serial.print(rc1_val);49. Serial.print(" ");50. Serial.print("channel 2:"); 51. Serial.println(rc2_val);52. } 上述代码每个通道都要占用一个中断口。但是一般的Arduino只有数字口2、3具有中断功能,也就是说只能接两个通道。如果想使用更多的通道,就需要用mega了,mega有5个外部中断源。其实,还有一种简单办法可以用一个中断接收所有通道。这就是绕过接收机的解码电路,使用arduino直接对PPM信号解码。这种方式麻烦的地方是需要拆开接收机,把解码前的PPM信号引出来。 打开接收机后,寻找PPM信号接口有几种办法:1. 查芯片资料,如Futaba接收机使用BU4015BF移位寄存器芯片,管脚1或9焊一根线引出即可。2. 使用示波器3. 使用arduino,写入测量脉宽的程序,在电路板上找吧,直到出现一些随机数估计就是了。找到以后使用下面代码进行解码。此段代码使用查询方式,效率较低。更有效率的办法是使用两个中断。一个中断检测同步信号,另一个中断处理PPM信号。 ARDUINO 代码 1.//http://diydrones.com/profiles/blogs/705844:BlogPost:383932.#define channumber 4 //How many channels have your radio?3.int value;4. 5.void setup()6.{7. Serial.begin(57600); //Serial Begin8. pinMode(3, INPUT); //Pin 3 as input9.}10. void loop()11. {12. while(pulseIn(3, LOW) < 5000){} //Wait for the beginning of the frame13. for(int x=0; x<=channumber-1; x++)//Loop to store all the channel position14. {15. value=pulseIn(3, LOW);16. }17. for(int x=0; x<=channumber-1; x++)//Loop to print and clear all the channel readings18. {19. Serial.print(value); //Print the value20. Serial.print(" ");21. value=0; //Clear the value afeter is printed22. }23. Serial.println(""); //Start a new line24. }非常有用,学习了! 非常有用,学习了! 寻找PPM信号接口有几种办法。关注这个。谢谢分享! 好贴,非常有帮助 学习了,感谢楼主的资料 顶起
好文章...收藏{:1_1:} 非常有用,学习了!
有用,学习了,顶一下,支持支持 学习 沙发位,解析:
用微控器+数传模块做的控理论上通道数是可以达到几十上百的,主要取决于微处理器的处理能力和数传的带宽,就像现在的多核电脑和宽带网络一样的道理 有用,学习了 请教~ 如何利用PPM信号 做成通道开关?就是用单片机解码PPM信号 然后控制三极管的通断? 好形像的技术 楼主,想问下PPM信号容易被干扰吗?我想控的高频头直接输出PPM给433,433放到AAT上,为了操作方便,控到aat最好连个2-3米的线才好操作
PPM用什么线传输?普通平行电缆还是用同轴带屏蔽层的电缆好?
非常有用,学习了!
非常有用,学习了!
牛不{:1_9:}{:1_9:} 不明觉厉。 顶楼主,什么时候一起交流交流{:1_1:} 想用arduino生成4通道ppm信号,该怎么编程呢? 楼主写的是PWM 不是PPM啊 好文章...收藏 有用,学习了 {:1_1:} 你好,我试过stm32解码天地飞WFR06S,摇杆正反方向转的电平时间是一样的,如何辨别转动的方向? 有用,学习了 顶顶顶顶顶顶顶 楼主,看到你写的已从天地飞7中抓出PPM信号,想请教具体实现的方法,在接收机的什么地方接出线?我想把天7的接收机改成PPM输出。