很久没有来看自己的BLOG,最近有些郁闷,看看自己以前做的一些东西,心中别有一翻风味!今天发个我自己最近感兴趣的东西,和大家一起来学习。主要目的是用单片机系统来来做航模的全比例遥控系统。全比例遥控就它能根据你的操作手柄来实现模型控制参数的无级调节,如遥控飞机的油门舵机的变化量等,属于“量”的控制…… 并非简单的开关式的遥控。
标准的航模有它规定的遥控信号格式,即发送端发出周期为15~20ms的周期信号,每个周期传送N个通道,每个通道用脉宽为1ms~2ms的正极性脉冲来控制。脉冲的宽度表示了控制量的大小,正反等。如1ms为油门全关,1.5ms为半油门,2.0ms为全油门;又如,1.0ms 后退,1.5ms停止, 2.0ms前进。当然如果是1.3ms 则是“慢速”后退,1.7则为慢速前进…… 至于它为什么要这么规定我也不是很了解 ^_^ ,反正你买个标准的舵机或者航模电调(调速器),你的信号超出这个范围它是不会动作的!
设计思路
发射部分:用ADC转换IC + 模拟切换IC(目的是用最便宜的ADC ^o^) + 单片机 +315MHZ 发射板。
接收部分:用单片机+315MHZ接收板。(接收和发射板8元一套,不是在做广告哟,我没的这个卖的……)
初步构思:4通道,由于考虑到单片机的处理适时性和315MHZ的带宽等要求选择4通 道比较合适。不多说了,上图大家看看就明白了!多通道的正确处理的关键是要准确识别每个对应通道的数据而且要输出到相对应的端口上!本设计在程序当中加了一个脉宽为4ms的同步头来识别。
测试结果:经过多次的程序调整,最终效果能达到要求,缺点采用315MHZ的频带太窄,距离过远出现抖舵的现象,估计如果重新设计发射和接收部分,会有很好的效果,一般的航模遥控6通道的最差的也在600元以上,接收机最差的也要500多,呵呵,我们这个才89C2051*2=8 元+ADC0832*1=6元+CD4051*1=1.5元+(一些其他的辅助电子元件)=10元。总成本在26元以内!很适合一些模型爱好者自制!
发射部分:
接收部分:
PCB板:(可惜没时间去打样品回来 -_-!!!)
发射板正面
发射板背面
接收板正面:(为了方便调试,接收板右下角做了个小“万能板”方便扩充元件)
接收板背面:
等不急打板就先用万能板做了电路,上图先!
底面
图中那个蓝色的东西,相信模型爱好不会陌生,对了!是9克的航模舵机,是我专门为这个
实验买的,好几十哟!
已经调试好的汇编源程序。(自己写的,很乱,各位将就一下):
请勿转载,如果转载请通知本人QQ:89750281 自己很辛苦写的,希望大家不要磨灭了这种共享精神。希望能与大家共同学习共同探讨共同提高!
;==================================================================================================; 四通道全比例遥控接收机电路源程序 BY-KLSEN WORKEROOM;===================================================================================================TIM1_H DATA 20H ;CH1 H bufferTIM1_L DATA 21H ;CH1 L buffer
TIM2_H DATA 22H ;CH2 H bufferTIM2_L DATA 23H ;
TIM3_H DATA 24H ;TIM3_L DATA 25H ;
TIM4_H DATA 26H ;TIM4_L DATA 27H ;
BUF_H DATA 28H ;BUF_L DATA 29H
BAJ DATA 30H
;SWT_C EQU P1.4;LED1 EQU P1.5;LED2 EQU P1.6;OUTPUT EQU P1.7;TES_A EQU P3.0;TES_B EQU P3.1;KEY1 EQU P3.2;KEY2 EQU P3.3;KEY3 EQU P3.4;KEY5 EQU P3.5
CH1_OUT EQU P3.5CH2_OUT EQU P3.4CH3_OUT EQU P3.3CH4_OUT EQU P3.2DATA_IN EQU P3.0
ORG 0000H AJMP START ORG 0003H ;外中断0入口 RETI ORG 000BH ;定时器T0中断入口 LJMP YT0 ORG 0013H ;外中断1入口 RETI ORG 001BH ;定时器T1中断入口 RETI ORG 0023H ;串行口中断入口 RETI
RESET:
MOV TIM1_H,#06H MOV TIM1_L,#22H
MOV TIM2_H,#06H MOV TIM2_L,#22H
MOV TIM3_H,#06H MOV TIM3_L,#22H
MOV TIM4_H,#06H MOV TIM4_L,#22H MOV R1,#00H MOV P1,#0FFH MOV P3,#0FFH MOV TMOD,#01H
RET
NOP NOP NOP LJMP START
START: LCALL RESET MOV R6,#4 SB: MOV R5,#10 CLR P3.7 SA: LCALL OUT LCALL DELAY_20 DJNZ R5,SA SETB P3.7 LCALL DELAY_20 DJNZ R6,SB
;=============================================================================; MAIN;=============================================================================MAIN: LCALL OUT ; LCALL IN_CODE LJMP MAIN
;==========================================================================; INPUT DECO;==========================================================================IN_CODE: CLR EA CLR ET0; JB DATA_IN,$ ;IN PUT =1 JIXU, OR-----QUIT MOV TH0,#00H ;定时器记数值置0 MOV TL0,#00H ; JNB DATA_IN,$ SETB TR0 ;开定时器T0 JB DATA_IN,$ ;等待输入变为高电平 IN="1-----"$本行, OR JIXU CLR TR0 ;输入转变为底电平,停止定时器T0 MOV A,TH0 ;记时高位送FUB_H 缓存 CJNE A,#0FH,IN_C ;高位0FH 低位00H--0FFH 范围(3840---4095) IN_C: JC IN_CODE ;输入小于(3840--4095)C=1 ,跳至 IN CJNE A,#10H,IN_C2 ;高位10H 低位00--0FFH 范围(4096---435) IN_C2: JC INT ;高位大于(4096---4351)C=1 判断为干扰,跳至IN_CODE重新判断 LJMP IN_CODE INT: INC R1 JNB DATA_IN,$ MOV TH0,#00H MOV TL0,#00H SETB TR0 JB DATA_IN,$ CLR TR0 CJNE R1,#1,CH2 MOV TIM1_H,TH0 MOV TIM1_L,TL0 LJMP INT CH2: CJNE R1,#2,CH3 MOV TIM2_H,TH0 MOV TIM2_L,TL0 LJMP INT CH3: CJNE R1,#3,CH4 MOV TIM3_H,TH0 MOV TIM3_L,TL0 LJMP INT CH4: CJNE R1,#4,QUIT MOV TIM4_H,TH0 MOV TIM4_L,TL0 MOV R1,#00H QUIT:
;=================================================================; 同步头判断程序: 输入接口 BUF_H 输出接口 BAJ; 思想: 通过对T0的记数值判断是否是同步或干扰 过程 :TO记时等于大于3.5ms吗?----TO的记时大于3.5ms又小于5ms吗?; 结果: 5ms>记时时间>3.5ms 是同步头. 记时时间>=3.5ms,记时时间>=5ms错误,不是同步头;=================================================================
;================================================================= ; OUT;=================================================================OUT: MOV TH0,#00H MOV TL0,#00H SETB EA SETB ET0
INC R2 ; |------ 脉冲宽度--------| MOV BUF_H,TIM1_H ; CH1脉冲宽度调整 _ _ _ _ delay _ _ _ _ _ MOV BUF_L,TIM1_L SETB CH1_OUT ;1 CH1高电平脉冲开始_ _ | |_ _ LCALL INPUT ; LCALL DELAY_LOWO ;设置最小脉宽 SETB TR0 ; TR0记时开始 (设置TRO益出范围在1ms到2ms之间? JB CH1_OUT,$
INC R2 MOV BUF_H,TIM2_H ; CH2脉冲宽度调整 MOV BUF_L,TIM2_L SETB CH2_OUT ;1 LCALL INPUT SETB TR0
INC R2 MOV BUF_H,TIM3_H ; CH3脉冲宽度调整 MOV BUF_L,TIM3_L SETB CH3_OUT ;1 LCALL INPUT SETB TR0 JB CH3_OUT,$
INC R2 MOV BUF_H,TIM4_H ; CH4脉冲宽度调整 MOV BUF_L,TIM4_L SETB CH4_OUT ;1 LCALL INPUT SETB TR0 JB CH4_OUT,$ MOV R1,#00H RET
;=================================================================; T0 SET;================================================================= INPUT: MOV A,#0FFH ;65536的底位”F "0xf SUBB A,BUF_L ;减1去输入数扩展后的底位 0x17 MOV R3,A ;相减后的底位保存到R3 = 0x17 MOV A,#0FFH ;65536的高位“F A="0x17" SUBB A,BUF_H ;减去输入数扩展后的高位 =0xfc MOV R4,A ;相减后的高位保存在R4 r4=0xfc 最终0xFC17=1ms定时参数AT 12MHZ MOV TH0,R4 MOV TL0,R3 RET
NOP NOP NOP LJMP START;=================================================================; TO INT;=================================================================YT0: CLR TR0 CJNE R2,#1,S1 CLR CH1_OUT RETI S1: CJNE R2,#2,S2 CLR CH2_OUT RETI S2: CJNE R2,#3,S3 CLR CH3_OUT RETI S3: CJNE R2,#4,S4 CLR CH4_OUT S4: MOV R2,#00H RETI NOP NOP NOP LJMP START
;=================================================================; 10MS DELAY;=================================================================DELAY_20: ;20ms (19.925ms) MOV R0,#200 E1: MOV R1,#98 DJNZ R1,$ DJNZ R0,E1
NOP NOP NOP LJMP START;===============================================================================; 2MS DELAY;===============================================================================DELAY_OUT: ;2ms (1.9925ms) MOV R0,#20 E2: MOV R1,#98 DJNZ R1,$ DJNZ R0,E2
END
;=================================================================; 四通道全比例遥控发射机电路源程序 BY- KLSEN WORKEROOM ;=================================================================H1_T DATA 0A0HCH2_T DATA 0A1HCH3_T DATA 0A2HCH4_T DATA 0A3HREAD DATA 0A4HTIME EQU R0AD_CS EQU P3.7AD_CLK EQU P1.0AD_DAT EQU P1.1SWT_A EQU P1.2SWT_B EQU P1.3SWT_C EQU P1.4LED1 EQU P1.5LED2 EQU P1.6OUTPUT EQU P1.7TES_A EQU P3.0TES_B EQU P3.1KEY1 EQU P3.2KEY2 EQU P3.3KEY3 EQU P3.4KEY5 EQU P3.5
RESET: MOV CH1_T,#50 MOV CH2_T,#100 MOV CH3_T,#150 MOV CH4_T,#200 MOV P1,#0FFH MOV P3,#0FFH MOV TMOD,#01H SETB ET0 SETB EA RET
START: LCALL RESET;=============================================================================; MAIN;=============================================================================LOOP:
LCALL RE
LCALL OUT LJMP LOOP
;=================================================================; ADC conversion;=================================================================RE: CLR SWT_A ; CLR SWT_B ; CLR SWT_C ;CH1 LCALL AD_CONV MOV CH1_T,#READ
SETB SWT_A ; CLR SWT_B ; CLR SWT_C ;CH2 LCALL AD_CONV MOV CH2_T,#READ
CLR SWT_A ; SETB SWT_B ; CLR SWT_C ;CH3 LCALL AD_CONV MOV CH3_T,#READ
CLR SWT_A ; CLR SWT_B ; SETB SWT_C ;CH4 LCALL AD_CONV MOV CH4_T,#READ RET;=================================================================; ADC CONV;=================================================================AD_CONV: ;ADC0832初始化 34us SETB AD_CS ;一个转换周期开始 CLR AD_CLK CLR AD_CS ;CS置0,片选有效 SETB AD_DAT ;DI置1,起始位 SETB AD_CLK ;第一个脉冲 CLR AD_DAT ;在负跳变之前加一个DI反转操作 CLR AD_CLK SETB AD_DAT ;DI置1,设为单通道 SETB AD_CLK ;第二个脉冲 CLR AD_DAT ;*** CLR AD_CLK ; CLR AD_DAT ;DI置0,选择通道0 SETB AD_CLK ;第三个脉冲 SETB AD_DAT ;*** CLR AD_CLK NOP SETB AD_CLK ; 第四个脉冲 MOV R1,#08H ;计数器初值,读取8位数据,
AD_READ: CLR AD_CLK ;下降沿 MOV C,AD_DAT ;读取DO端数据 RLC A ;C移入A,高位在前 SETB AD_CLK ;下一个脉冲 DJNZ R1,AD_READ ;没读完继续 SETB AD_CS MOV READ,A ;转换结果发给20H RET;=================================================================; OUT;=================================================================OUT:
SETB OUTPUT ;1 LCALL DELAY_STATE; 同步标志(4ms) CLR OUTPUT ;0 LCALL DELAY_LOW ; 同步位后第一个底电平(1ms) ; |-- 脉冲宽度---| MOV TIME,CH1_T ; CH1脉冲宽度调整 _ _ _ _ delay _ _ SETB OUTPUT ;1 CH1高电平脉冲开始_ _ | |_ _ LCALL INPUT SETB TR0 ; TR0记时开始(设置TRO益出范围在1ms到2ms之间) LCALL DELAY_OUT ; DELAY 设置最大脉冲时间(2ms) CLR OUTPUT ;0 CH1高电平脉冲结束 LCALL DELAY_LOWO ; 延时500us底电平
MOV TIME,CH2_T ; CH2脉冲宽度调整 SETB OUTPUT ;1 LCALL INPUT SETB TR0 LCALL DELAY_OUT CLR OUTPUT ;0 LCALL DELAY_LOWO ; 延时500us底电平
MOV TIME,CH3_T ; CH3脉冲宽度调整 SETB OUTPUT ;1 LCALL INPUT SETB TR0 LCALL DELAY_OUT CLR OUTPUT ;0 LCALL DELAY_LOWO ; 延时500us底电平
MOV TIME,CH4_T ; CH4脉冲宽度调整 SETB OUTPUT ;1 LCALL INPUT SETB TR0 LCALL DELAY_OUT CLR OUTPUT ;0 LCALL DELAY_LOWO ; 延时500us底电平 RET
INPUT:
MOV A,#4 ;乘数 0x04 (倍率 [1--250]x4=4--1000) MOV B,TIME ;被乘数(ADC输入,范围00H--0xff 8BIT) MUL AB ;相乘操作 0x3e8 MOV R1,B ;高位存R1 0x03 MOV R2,A ;底位存R2 0xe8 MOV A,#0FFH ;65536的底位”F "0xf SUBB A,R2 ;减1去输入数扩展后的底位 0x17 MOV R3,A ;相减后的底位保存到R3 = 0x17 MOV A,#0FFH ;65536的高位“F A="0x17" SUBB A,R1 ;减去输入数扩展后的高位 =0xfc MOV R4,A ;相减后的高位保存在R4 r4=0xfc 最终0xFC17=1ms定时参数 MOV TH0,R4 MOV TL0,R3 RET
YT0: CLR TR0 CLR OUTPUT RETI
DELAY_STATE: ;4ms (3.959ms) MOV R0,#39E1: MOV R1,#100 DJNZ R1,$ DJNZ R0,E1 RET
DELAY_OUT: ;2ms (1.9925ms) MOV R0,#20E2: MOV R1,#98 DJNZ R1,$ DJNZ R0,E2 RETDELAY_LOW: ;1ms(0.995ms) MOV R0,#9E3: MOV R1,#109 DJNZ R1,$ DJNZ R0,E3 RET
DELAY_LOWO: ;500us(497.5us) MOV R0,#2E4: MOV R1,#247 DJNZ R1,$ DJNZ R0,E4 RET
前面一阵子新做了个接收,效果不错,也拍了带无刷电机的测试视频 。 视频地址:http://v.youku.com/v_show/id_XNzg3MDk0MTY=.html
无刷电机用的是软驱上拆下来的,电调是买的。发射编码和接受解码都是用89C2051 加433M的发射和接受模块
PCM接收
PCM发射部分
发布
用户190994 2010-11-29 01:05
用户1266089 2009-4-8 11:10
用户193219 2009-4-5 16:07
用户193219 2009-4-5 16:06
用户141990 2008-9-19 22:58
用户150498 2008-5-2 01:15
用户530718 2008-4-29 16:12
用户1002586 2008-4-1 15:34
用户1266089 2008-3-26 12:26
用户1266089 2008-3-17 10:55
报名立领:瑞萨MCU/MPU/边缘AI资料集(共348页);
每场都送出40+块瑞萨MCU开发板,50元E卡/保温杯,数量多多!