|
本帖最后由 JackeyKing 于 2016-1-21 11:42 编辑
首先感谢萝丽的开源控,自己15年9月份左右才看到萝丽的贴子,然后就一发不可收拾,买了近2000的电子元器件了,做了三个控,越做越小,但是萝丽的原贴中,接收机还是太大,虽然迷你接收只有2克多点,但再加上电调与舵机,就重了,于是一直想做个迷你的集成电调与舵机的,苦于自己对单片机也是个门外汉,只好边啃书本,边四处翻贴子,直到发现了这个贴子: http://bbs.mx3g.com/thread-496612-1-1.html 受 乡村男孩 的启发,突然想明白了,对于小飞机,对舵机的控制,不一定要比例控制,可以先简陋一点,做成开关通道。估计 乡村男孩 最后没有去研究萝丽控与他的程序集成的事,我来班门弄斧,于是就有了现在的这个贴子。
既然萝丽是开源的,用了他的代码,自然也开源,先放上源程序:
- //#include
- #include
- #include
- #define u8 unsigned char
- #define u16 unsigned int
- typedef unsigned char uchar;
- typedef unsigned char uint;
- sfr T2H=0xd6;
- sfr T2L=0xd7;
- sbit LED=P1^0; //定义指示灯
- //sbit CH1=P1^1; //定义6个通道输出
- //sbit CH2=P3^7;
- //sbit CH3=P3^3;
- //sbit CH4=P3^2;
- sbit CH5=P3^1;
- sbit CH6=P3^0;
- sbit pwm1 = P3^2;
- sbit pwm2 = P3^3;
- sbit pwm3 = P3^6;
- sbit pwm4 = P3^7;
- sbit MDO= P1^3; //定义无线模块的管脚
- sbit SCK= P1^5;
- sbit CE= P5^5;
- sbit IRQ= P1^2;
- sbit MDI= P1^4;
- sbit CSN= P5^4;
- u8 rx[17]; //接收的6字节数据
- u8 tx[17]={0xc3,0x3c,12};
- u8 k,n,w,tt,m;
- u8 channel,connecting,hopping_turn;
- bit cha,chb,chc,chd,che;
- u8 missing_data[4];
- u8 address[5];
- u8 hopping[5];
- bit first;
- bit lose;
- bit jump_1,jump_2;
- bit restar;
- void delay1ms() //@12.000MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 11;
- j = 168;
- do
- {
- while (--j);
- } while (--i);
- }
- void delay4us() //@12.000MHz
- {
- unsigned char i;
- i = 8;
- while (--i);
- }
- void delay(u8 i)
- {
- while(i--)
- delay4us();
- }
- void delay_ms(u8 i)
- {
- while(i--)
- delay1ms();
- }
- u8 EEPROM_read(u8 address)
- {
- IAP_CMD=0x01;
- IAP_ADDRH=0;
- IAP_ADDRL=address;
- IAP_TRIG=0x5a; //EEPROM读写密码,不同系列单片机不同
- IAP_TRIG=0xa5;
- return IAP_DATA;
- }
- void EEPROM_write(u8 address,u8 byte)
- {
- IAP_CMD=0x02;
- IAP_DATA=byte;
- IAP_ADDRH=0;
- IAP_ADDRL=address;
- IAP_TRIG=0x5a;
- IAP_TRIG=0xa5;
- }
- void EEPROM_clean(u8 address)
- {
- IAP_CMD=0x03;
- IAP_ADDRH=0;
- IAP_ADDRL=address;
- IAP_TRIG=0x5a;
- IAP_TRIG=0xa5;
- }
- void DATA_read()
- {
- IAP_CONTR=0x82;
- if(EEPROM_read(0)!=0xf5)
- {
- first=1;
- missing_data[0]=127;
- missing_data[1]=127;
- missing_data[2]=0;
- missing_data[3]=127;
- }
- else
- {
- hopping[0]=EEPROM_read(1);
- hopping[1]=EEPROM_read(2);
- hopping[2]=EEPROM_read(3);
- hopping[3]=EEPROM_read(4);
- hopping[4]=EEPROM_read(5);
- address[0]=EEPROM_read(6);
- address[1]=EEPROM_read(7);
- address[2]=EEPROM_read(8);
- address[3]=EEPROM_read(9);
- address[4]=EEPROM_read(10);
- missing_data[0]=EEPROM_read(11);
- missing_data[1]=EEPROM_read(12);
- missing_data[2]=EEPROM_read(13);
- missing_data[3]=EEPROM_read(14);
- }
- IAP_CONTR=0;
- }
- void DATA_save()
- {
- IAP_CONTR=0x82;
- EEPROM_clean(0);
- EEPROM_write(0,0xf5);
- EEPROM_write(1,hopping[0]);
- EEPROM_write(2,hopping[1]);
- EEPROM_write(3,hopping[2]);
- EEPROM_write(4,hopping[3]);
- EEPROM_write(5,hopping[4]);
- EEPROM_write(6,address[0]);
- EEPROM_write(7,address[1]);
- EEPROM_write(8,address[2]);
- EEPROM_write(9,address[3]);
- EEPROM_write(10,address[4]);
- EEPROM_write(11,missing_data[0]);
- EEPROM_write(12,missing_data[1]);
- EEPROM_write(13,missing_data[2]);
- EEPROM_write(14,missing_data[3]);
- IAP_CONTR=0;
- }
- u8 SPI(u8 byte)
- {
- u8 i;
- for(i=0;i14)lose=0,jump_2=1; //第一跳之后仍无信号,开始第二跳
- }
- else
- {
- if(m>22)m=0,lose=0,jump_1=0; //第二跳之后仍无信号,复位重新跳。
- }
- }
- DUOJI_pwm();
- if(rx[2] > 250){
- CCAP0L=0;
- CCAP0H=0;
- }else if(rx[2] < 5){
- CCAP0L=255;
- CCAP0H=255;
- }else{
- CCAP0L=255 - rx[2];
- CCAP0H=255 - rx[2];
- }
- }
- void et2()interrupt 12 //定时器2用作信号统计,定时周期65ms
- {
- tt++;w++;
- if(w==15) //每秒统计接收到的有效信号数量,小于20个点亮LED示警,表示信号微弱
- {
- if(k30)//如果tt增长到30,表示已经有两秒未收到有效信号,执行失控保护舵量
- {
- tt=30;
- rx[0]=missing_data[0];
- rx[1]=missing_data[1];
- rx[2]=missing_data[2];
- rx[3]=missing_data[3];
- pwm1=0;
- pwm2=0;
- pwm3=0;
- pwm4=0;
- CCAP0L=255;
- CCAP0H=255;
- }
- }
复制代码
固件: test.zip
先说说目前的成果:已经在面包板上试验通过,包括失控保护部分,LED灯等,完全工作正常。
但是,在我的微型接收上,还没有成功,我是在1.27mm的洞洞板上焊的微型接收,不加电容,焊完全重2.04克(电容大约0.35克),正如 乡村男孩所说,焊这个太费神了,估计是我哪没有焊好,能对上码,对完码就失控(LED灯亮),电调输出一直是高电平,舵机为低电平。
更新:微型接收也成功了,用662K转3.3V电压时,需要在662K的输出端并上个电容。我并的是47uf的,已经更新到接线图中去了
二楼上使用方法以及硬件等
差点忘了感谢群里面的浅雪,昨天问过他问题,谢谢他的解答
|
|