新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 航模遙控器改裝---PPM波形產(chǎn)生

航模遙控器改裝---PPM波形產(chǎn)生

作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
最近接觸航模,很有興趣,拆了一個航模遙控器,準備改裝下。對航模不太了解,首先從遙控入手,需要了解輸出信號,可以用遙控器結(jié)合電腦的模擬軟件來練習(xí)調(diào)試。首先用好的遙控器來測試輸出的PPM波形,連續(xù)的發(fā)射波形和部分波形如下圖所示:


于是用單片機編寫了一個同樣的波形,6通道的PPM波形,一個周期的總時間20ms,6個PPM波形,高電平每個波形最大1.4ms,最小0.6ms,低電平固定0.4ms。

臨時焊接了一個電路,比較丑,哈哈,但是效果還是可以的。

根據(jù)遙控器內(nèi)部空間結(jié)構(gòu),昨天剛畫完整的PCB板子,主控單片機換成了PIC16F917,無線遙控模塊先用NRF2401測試,等OK了再換成距離遠一點的無線模塊;最多8通道,PCB還在打樣中。部分原理圖和PCB如下圖所示:




手頭上隨便找了一個單片機板子,是STC12C5410AD的,編寫了一個航模遙控器AD采集和PPM發(fā)射的最簡單程序,具體程序如下:
/************ STC12C5410AD學(xué)習(xí)板 ******************/
/*功能描述:STC12C5410AD內(nèi)部AD使用 */
/*作者: ClimberWin */
/*外部晶振22.1184 MHZ */
/*L7805穩(wěn)壓在4.88-4.98V之間,根據(jù)實際測量確定電壓 */
/**************************************************/
/*修改時間: */
/*修改內(nèi)容: */
//2011.7.28
//AD采集產(chǎn)生PPM波形
//實際調(diào)試OK
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit PPM_OUT = P2^5; //溫度測量,測量熱敏電阻的參數(shù)?
uint ad_temp; //AD數(shù)據(jù)保存的地址
uint ad0_data; //AD數(shù)據(jù)保存的地址
uint ad1_data; //AD數(shù)據(jù)保存的地址
uint ad2_data; //AD數(shù)據(jù)保存的地址
uint ad3_data; //AD數(shù)據(jù)保存的地址
uint ad4_data; //AD數(shù)據(jù)保存的地址
uint ad5_data; //AD數(shù)據(jù)保存的地址
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 ; //開轉(zhuǎn)換電源 設(shè)置轉(zhuǎn)換速度為1080個時鐘周期轉(zhuǎn)換一次,選擇AD0通道
Delay1ms(20); //稍做延時,大于1ms就可以
/*I/O口作為AD使用,設(shè)置漏極開路模式*/
P1M0=1;
P1M1=1;
}
/*******************************************/
//一個波形20ms,6個PPM波形,高電平每個波形最大1.4ms,最小0.6ms,低電平固定0.4ms
/*
*/
void PPW_Sent(uchar Channel1,Channel2,Channel3,Channel4,Channel5,Channel6) // PPM波形產(chǎn)生
{
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 ; //開轉(zhuǎn)換電源 設(shè)置轉(zhuǎn)換速度
delay(aa);//
///////AD0轉(zhuǎn)換
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
ADC_CONTR|=0x00; //選擇AD0通道
while(!(ADC_CONTR & 0x10)); //判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位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轉(zhuǎn)換
ADC_CONTR=0xe0 ; //開轉(zhuǎn)換電源 設(shè)置轉(zhuǎn)換速度
delay(aa);//
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
ADC_CONTR|=0x01; //選擇AD1通道
while(!(ADC_CONTR & 0x10)); //判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位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轉(zhuǎn)換
ADC_CONTR=0xe0 ; //開轉(zhuǎn)換電源 設(shè)置轉(zhuǎn)換速度
delay(aa);//
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
ADC_CONTR|=0x02; //選擇AD2通道
while(!(ADC_CONTR & 0x10)); //判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位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轉(zhuǎn)換
ADC_CONTR=0xe0 ; //開轉(zhuǎn)換電源 設(shè)置轉(zhuǎn)換速度
delay(aa);//
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
ADC_CONTR|=0x03; //選擇AD3通道
while(!(ADC_CONTR & 0x10)); //判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位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轉(zhuǎn)換
ADC_CONTR=0x83 ;
delay(aa);//
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
ADC_CONTR|=0x04; //選擇AD4通道
while(!(ADC_CONTR & 0x10)); //判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位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轉(zhuǎn)換
ADC_CONTR=0x83 ;
delay(aa);//
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
ADC_CONTR|=0x05; //選擇AD5通道
while(!(ADC_CONTR & 0x10)); //判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位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();
}
}


關(guān)鍵詞: 航模遙控器PPM波

評論


技術(shù)專區(qū)

關(guān)閉