航模遙控器改裝---PPM波形產(chǎn)生
于是用單片機(jī)編寫了一個(gè)同樣的波形,6通道的PPM波形,一個(gè)周期的總時(shí)間20ms,6個(gè)PPM波形,高電平每個(gè)波形最大1.4ms,最小0.6ms,低電平固定0.4ms。
臨時(shí)焊接了一個(gè)電路,比較丑,哈哈,但是效果還是可以的。
根據(jù)遙控器內(nèi)部空間結(jié)構(gòu),昨天剛畫完整的PCB板子,主控單片機(jī)換成了PIC16F917,無線遙控模塊先用NRF2401測(cè)試,等OK了再換成距離遠(yuǎn)一點(diǎn)的無線模塊;最多8通道,PCB還在打樣中。部分原理圖和PCB如下圖所示:
手頭上隨便找了一個(gè)單片機(jī)板子,是STC12C5410AD的,編寫了一個(gè)航模遙控器AD采集和PPM發(fā)射的最簡(jiǎn)單程序,具體程序如下:
/*功能描述:STC12C5410AD內(nèi)部AD使用 */
/*作者: ClimberWin */
/*外部晶振22.1184 MHZ */
/*L7805穩(wěn)壓在4.88-4.98V之間,根據(jù)實(shí)際測(cè)量確定電壓 */
/**************************************************/
/*修改時(shí)間: */
/*修改內(nèi)容: */
//2011.7.28
//AD采集產(chǎn)生PPM波形
//實(shí)際調(diào)試OK
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit PPM_OUT = P2^5; //溫度測(cè)量,測(cè)量熱敏電阻的參數(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個(gè)時(shí)鐘周期轉(zhuǎn)換一次,選擇AD0通道
Delay1ms(20); //稍做延時(shí),大于1ms就可以
/*I/O口作為AD使用,設(shè)置漏極開路模式*/
P1M0=1;
P1M1=1;
}
/*******************************************/
//一個(gè)波形20ms,6個(gè)PPM波形,高電平每個(gè)波形最大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é)束后標(biāo)志位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é)束后標(biāo)志位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é)束后標(biāo)志位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é)束后標(biāo)志位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é)束后標(biāo)志位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é)束后標(biāo)志位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波
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論