很久没有来看自己的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 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,$
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
NOP
NOP
NOP
LJMP START
;=================================================================
; 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
RET
NOP
NOP
NOP
LJMP START
;===============================================================================
; 2MS DELAY
;===============================================================================
DELAY_OUT: ;2ms (1.9925ms)
MOV R0,#20
E2:
MOV R1,#98
DJNZ R1,$
DJNZ R0,E2
RET
NOP
NOP
NOP
LJMP START
NOP
NOP
NOP
LJMP START
END
;=================================================================
; 四通道全比例遥控发射机电路源程序 BY- KLSEN WORKEROOM
;=================================================================
H1_T DATA 0A0H
CH2_T DATA 0A1H
CH3_T DATA 0A2H
CH4_T DATA 0A3H
READ DATA 0A4H
TIME EQU R0
AD_CS EQU P3.7
AD_CLK EQU P1.0
AD_DAT EQU P1.1
SWT_A EQU P1.2
SWT_B EQU P1.3
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
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 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,#39
E1:
MOV R1,#100
DJNZ R1,$
DJNZ R0,E1
RET
DELAY_OUT: ;2ms (1.9925ms)
MOV R0,#20
E2:
MOV R1,#98
DJNZ R1,$
DJNZ R0,E2
RET
DELAY_LOW: ;1ms(0.995ms)
MOV R0,#9
E3:
MOV R1,#109
DJNZ R1,$
DJNZ R0,E3
RET
DELAY_LOWO: ;500us(497.5us)
MOV R0,#2
E4:
MOV R1,#247
DJNZ R1,$
DJNZ R0,E4
RET
END
前面一阵子新做了个接收,效果不错,也拍了带无刷电机的测试视频 。 视频地址: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