微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 航模遥控器改装---PPM波形产生

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

时间: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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top