航模遥控器改装---PPM波形产生
于是用单片机编写了一个同样的波形,6通道的PPM波形,一个周期的总时间20ms,6个PPM波形,高电平每个波形最大1.4ms,最小0.6ms,低电平固定0.4ms。
临时焊接了一个电路,比较丑,哈哈,但是效果还是可以的。
根据遥控器内部空间结构,昨天刚画完整的PCB板子,主控单片机换成了PIC16F917,无线遥控模块先用NRF2401测试,等OK了再换成距离远一点的无线模块;最多8通道,PCB还在打样中。部分原理图和PCB如下图所示:
手头上随便找了一个单片机板子,是STC12C5410AD的,编写了一个航模遥控器AD采集和PPM发射的最简单程序,具体程序如下:
/************ STC12C5410AD学习板 ******************/
/*功能描述:STC12C5410AD内部AD使用 */
/*作者: ClimberWin */
/*外部晶振22.1184 MHZ */
/*L7805稳压在4.88-4.98V之间,根据实际测量确定电压 */
/**************************************************/
/*修改时间: */
/*修改内容: */
//2011.7.28
//AD采集产生PPM波形
//实际调试OK
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit PPM_OUT = P2^5; //温度测量,测量热敏电阻的参数?
uint ad_temp; //AD数据保存的地址
uint ad0_data; //AD数据保存的地址
uint ad1_data; //AD数据保存的地址
uint ad2_data; //AD数据保存的地址
uint ad3_data; //AD数据保存的地址
uint ad4_data; //AD数据保存的地址
uint ad5_data; //AD数据保存的地址
void Delay1ms(unsigned int count);
void STC12C5410AD_int(void); //AD初始化
void Delay1ms(unsigned int count);
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i for(j=0;j<120;j++); } void delay(unsigned int count) { unsigned int i; for(i=0;i } /*STC12C5410AD的AD初始化程序*/ // ADC_CONTR=[ADC_POWER] [SPEED1] [SPEED0] [ADC_FLAG] [ADC_START] [CHS2] [CHS1] [CHS0] // ADC_DATA 高8位 ADC_LOW2 //低2位 void STC12C5410AD_int(void) { ADC_CONTR=0x80 ; //开转换电源 设置转换速度为1080个时钟周期转换一次,选择AD0通道 Delay1ms(20); //稍做延时,大于1ms就可以 /*I/O口作为AD使用,设置漏极开路模式*/ P1M0=1; P1M1=1; } /*******************************************/ //一个波形20ms,6个PPM波形,高电平每个波形最大1.4ms,最小0.6ms,低电平固定0.4ms /* */ void PPW_Sent(uchar Channel1,Channel2,Channel3,Channel4,Channel5,Channel6) // PPM波形产生 { uint cc; cc=1000; PPM_OUT=1; //delay(5000); //20ms delay(cc-ad0_data);// delay(cc-ad1_data);// delay(cc-ad2_data);// delay(cc-ad3_data);// delay(cc-ad4_data);// delay(cc-ad5_data);// PPM_OUT=0; delay(220);//0.4ms //通道1 PPM_OUT=1; delay(330);//0.6ms delay(ad0_data);//1ms PPM_OUT=0; delay(220);//0.4ms //通道2 PPM_OUT=1; delay(330);//0.6ms delay(ad1_data);//1ms PPM_OUT=0; delay(220);//0.4ms //通道3 PPM_OUT=1; delay(330);//0.6ms delay(ad2_data);//1ms // delay(770);//1.4ms PPM_OUT=0; delay(220);//0.4ms //通道4 PPM_OUT=1; delay(330);//0.6ms delay(ad3_data);//1ms PPM_OUT=0; delay(220);//0.4ms //通道5 PPM_OUT=1; delay(330);//0.6ms delay(ad4_data);//1ms PPM_OUT=0; delay(220);//0.4ms //通道6 PPM_OUT=1; delay(330);//0.6ms delay(ad5_data);//1ms PPM_OUT=0; delay(220);//0.4ms PPM_OUT=1; } /*****************主程序************************/ main() { //main start uint aa; ad0_data=220; ad1_data=220; ad2_data=220; ad3_data=220; ad4_data=220; ad5_data=220; aa=220; STC12C5410AD_int(); //AD初始化 while(1) { ADC_CONTR=0xe0 ; //开转换电源 设置转换速度 delay(aa);// ///////AD0转换 ADC_CONTR|=0x08; //开始AD转换(ADC_START=1) ADC_CONTR|=0x00; //选择AD0通道 while(!(ADC_CONTR & 0x10)); //判断AD是否转换结束 ADC_CONTR&=0xef;//转换结束后标志位ADC_FLAG清零 ad_temp=ADC_LOW2; ad_temp=(ad_temp+ ((uint)ADC_DATA)<2); //最大0.8ms delay(440) ad0
航模遥控器PPM波 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)