单片机模拟RC全比例遥控收发系统
天发个我自己最近感兴趣的东西,和大家一起来学习。主要目的是用单片机系统来来做航模的全比例遥控系统。全比例遥控就它能根据你的操作手柄来实现模型控制参数的无级调节,如遥控飞机的油门舵机的变化量等,属于“量”的控制…… 并非简单的开关式的遥控。
标准的航模有它
的遥控信号格式,即发送端发出周期为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元以内!很适合一些模型爱好者自制!
发射部分如下图:
接收部分如下图:
发射板正面
接收板正面:(为了方便调试,接收板右下角做了个小“万能板”方便扩充元件)
等不急打板就先用万能板做了电路,上图先!
底面
图中那个蓝色的东西,相信模型爱好不会陌生,对了!是9克的航模舵机
附上调试通过的程序(由于315M模块发射带宽和传输率的问题,测试距离在10米以内)
已经调试好的汇编源程序。(自己写的,很乱,各位将就一下)
;==================================================================================================
; 四通道全比例遥控接收机电路源程序 BY-KLSEN WORKEROOM
;===================================================================================================
TIM1_H DATA 20H ;CH1 H buffer
TIM1_L DATA 21H ;CH1 L buffer
TIM2_H DATA 22H ;CH2 H buffer
TIM2_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.5
CH2_OUT EQU P3.4
CH3_OUT EQU P3.3
CH4_OUT EQU P3.2
DATA_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
NOP
NOP
NOP
LJMP START
;==========================================================================
; 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:
RET
NOP
NOP
NOP
LJMP START
;=================================================================
; 同步头判断程序: 输入接口 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,$
继续阅读