原创 单片机模拟RC全比例遥控收发系统

2009-3-30 18:27 9043 13 35 分类: MCU/ 嵌入式

        很久没有来看自己的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板:(可惜没时间去打样品回来 -_-!!!)


发射板正面


点击看大图


 


发射板背面


点击看大图


 


接收板正面:(为了方便调试,接收板右下角做了个小“万能板”方便扩充元件)


点击看大图


 


接收板背面:


点击看大图


 


等不急打板就先用万能板做了电路,上图先!


90d438f5-6202-4871-8f12-6374e0aa9332.JPG


 


底面


251d0ccd-3d1f-4f7f-87b8-8e9a38800863.JPG


图中那个蓝色的东西,相信模型爱好不会陌生,对了!是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发射部分


点击看大图

PARTNER CONTENT

文章评论22条评论)

登录后参与讨论

用户190994 2010-11-29 01:05

非常好! 楼主发我一份吧?非常想学习一下? 谢谢楼主 邮箱:diangong_dianzhi@sina.com 谢谢

用户1266089 2009-4-8 11:10

这个是很久前刚学不久写的,有些乱。您是搞软件开发的,应该很厉害了。请教谈不上,不过有些东西我们可以相互讨论和学习!我的QQ:89750281 由于公司不能上Q,所以再线时间比较短。一般都是下班后到家里才能上的……

用户193219 2009-4-5 16:07

我的电话是:13098866168 QQ:393877568 我是搞软件开发的呀。这个单片机是我的业余爱好呀!有些问题想向您请教呀!!

用户193219 2009-4-5 16:06

我找了好久才找到这写内容呀!1太感谢了呀!我要和你交朋友呀

用户141990 2008-9-19 22:58

发射程序的预定义“TIME EQU R0”在伟副下编译通不过。

用户150498 2008-5-2 01:15

很不错..至于商业价值可以不说,学习嘛,我倒想哪天你用C写完了给我一份,我也试试啊!!!!33896996@163.com,共同学习一下,你也可以试试STC的芯片,完全和2051相同,带有两路PWM和几个AD,至于传送,不行就用用2.4G模块,串口传输,那样电脑也可以控制了......想像ing.............

用户530718 2008-4-29 16:12

学习了,虽然看不懂,顶

用户1002586 2008-4-1 15:34

能有这份执着很难得!支持!

用户1266089 2008-3-26 12:26

最近比较忙点,本人刚创建了个电子DIY的群,欢迎大家加入,讨论!群号:57767033

用户1266089 2008-3-17 10:55

呵呵,做这个纯属学习而已,通过这个可以学习到比例遥控的原理等等,当然不一定在模型上,还有很多地方可以应用。如果要商业化,用MCU的话不是单单模仿比例遥控的功能,那就没什么意思了。希望能在此功能的基础上做功能更强大的东西,比如智能控制无人驾驶等方面…这个只是九牛一毛,冰山一角而已!
相关推荐阅读
用户1266089 2010-06-25 12:32
数控高压脉冲电源再进化
最近在电源网上认识了不少的朋友,提了很多建议,因此对此脉动电源再改进……新增功能: 改成液晶显示的,显示频率,脉宽,输入电压状态、输出电压状态、模式状态及各种异常保护信息显示等。1.智能充电管理(恒流...
用户1266089 2010-06-20 11:45
中毒太深-已入魔(模)道!!!
知名品牌的太贵,只好上山寨的了:这图在5I上发过,所以拿回来就备强行加了水印-_-!!最近又没的场地飞了,不知道自己的魔(模)道能走多远……             遥控设备也是买的,其实有很多东西,...
用户1266089 2009-03-30 18:29
单片机遥控防盗门铃报警器的设计
      防盗,报警,是人们比较关心的话题,市面上的相关品也有不少,价格最便宜的200多好一点的多通道的(也就是探头配的多点)最少也要600多块。单其扩展功能少的可怜!      本人是电子方面的工...
用户1266089 2009-03-30 18:28
媒体音响自动关机附加电路
       一般的多媒体音响都不具备自动关机的功能,如果是晚上躺在床上听歌,电脑可以用软件设置定时关闭的功能,可音响却要自己爬起来关闭,很是麻烦,特别是东天就更郁闷,为此我设计了如下的电路,感觉非常...
用户1266089 2009-03-17 23:42
数控高压脉冲电源
最近在电源网上看到很多的朋友讨论电鱼机的一些东西,想起家里老爸经常借人的机头去电鱼,背着也很累,于是萌生了自制一款高性能小体积的鱼机给他用。(其实也是有时去娱乐一下,纯属个人爱好。至于有些朋友说电鱼会...
EE直播间
更多
我要评论
22
13
关闭 站长推荐上一条 /3 下一条