新闻中心

EEPW首页>嵌入式系统>设计应用> 航模遥控器改装---PPM波形产生

航模遥控器改装---PPM波形产生

作者: 时间:2016-11-18 来源:网络 收藏
最近接触航模,很有兴趣,拆了一个航模遥控器,准备改装下。对航模不太了解,首先从遥控入手,需要了解输出信号,可以用遥控器结合电脑的模拟软件来练习调试。首先用好的遥控器来测试输出的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_data=ad_temp/2.3;
///////AD1转换
ADC_CONTR=0xe0 ; //开转换电源 设置转换速度
delay(aa);//
ADC_CONTR|=0x08; //开始AD转换(ADC_START=1)
ADC_CONTR|=0x01; //选择AD1通道
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)
ad1_data=ad_temp/2.3;
///////AD2转换
ADC_CONTR=0xe0 ; //开转换电源 设置转换速度
delay(aa);//
ADC_CONTR|=0x08; //开始AD转换(ADC_START=1)
ADC_CONTR|=0x02; //选择AD2通道
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)
ad2_data=ad_temp/2.3;
///////AD3转换
ADC_CONTR=0xe0 ; //开转换电源 设置转换速度
delay(aa);//
ADC_CONTR|=0x08; //开始AD转换(ADC_START=1)
ADC_CONTR|=0x03; //选择AD3通道
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)
ad3_data=ad_temp/2.3;
/*
///////AD4转换
ADC_CONTR=0x83 ;
delay(aa);//
ADC_CONTR|=0x08; //开始AD转换(ADC_START=1)
ADC_CONTR|=0x04; //选择AD4通道
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)
ad4_data=ad_temp/2.3;
///////AD5转换
ADC_CONTR=0x83 ;
delay(aa);//
ADC_CONTR|=0x08; //开始AD转换(ADC_START=1)
ADC_CONTR|=0x05; //选择AD5通道
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)
ad5_data=ad_temp/2.3;
*/
PPW_Sent();
}
}


关键词:航模遥控器PPM波

评论


技术专区

关闭