EDN首页   博客首页

日志档案

发表于 2008-3-3 16:11:33

6

标签: 航模  RC  比例  遥控  单片机  

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

        很久没有来看自己的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

 

系统分类: 单片机   |   用户分类: 电子制作   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1956)    回复(23)  

投一票您将和博主都有获奖机会!

最新评论

  • 彩云

    2008-3-4 11:42:35

    精彩!!

  • exploer

    2008-3-4 19:59:04

    很好,很不错........

  • CBCB128

    2008-3-5 13:25:42

    用STC2052不是更好

  • luohao

    2008-3-5 19:22:55

    很好,支持原创

  • 濞佸粔鐜嬪瓙

    2008-3-6 10:17:39

    相当精彩的一篇文章! 强烈支持一下!

  • 飘飘

    2008-3-6 11:06:04

    太精彩了!

  • klsen

    2008-3-6 11:58:03

    谢谢各位的支持,如果觉的可以,别忘记在贴子开头“顶一下”哦!你们的支持就是我的动力……

  • syf20040100

    2008-3-8 13:11:21

    很不错哦。 好好学习

  • quiye

    2008-3-10 21:53:28

    厉害了

  • quiye

    2008-3-10 23:10:05

    为什么不用C写,,这样可读性更好

  • klsen

    2008-3-11 12:56:49

    本人能力有限啊,C正在学习中,C也是我的目标,还望朋友们多多指点啊!

  • qtds163

    2008-3-14 16:10:08

    顶你了。 perfect!!!~~~

  • qtds163

    2008-3-14 16:20:06

    用单片机做一个8通道的温度采集系统,硬件设计。用51做,0809A/D转换,373锁寸,也可加0405多路开关。请教你一下,有什么注意的地方,或你有这类的资料,能给我吗? 或共享,也请有心的朋友指教。我的E-mail:qtds5888@163.com

  • tase

    2008-3-14 18:13:00

    从商业角度上看,楼主的设计没有价值. 玩具的遥控多半采用EM78P458做的,2元左右. 自带8位ADC 发射接收模块,用朝外差,很便便宜. 距离,看个人功底了,从几十米到几公里都做得到.

  • klsen

    2008-3-17 10:55:08

    呵呵,做这个纯属学习而已,通过这个可以学习到比例遥控的原理等等,当然不一定在模型上,还有很多地方可以应用。如果要商业化,用MCU的话不是单单模仿比例遥控的功能,那就没什么意思了。希望能在此功能的基础上做功能更强大的东西,比如智能控制无人驾驶等方面…这个只是九牛一毛,冰山一角而已!

  • klsen

    2008-3-26 12:26:12

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

  • simenwang

    2008-4-1 15:34:14

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

  • 2928384

    2008-4-29 16:12:06

    学习了,虽然看不懂,顶

  • lxf1976

    2008-5-2 1:15:54

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

  • hefanghua

    2008-9-19 22:54:57

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

  • hefanghua

    2008-9-19 22:55:26

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

  • hefanghua

    2008-9-19 22:56:26

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

  • hefanghua

    2008-9-19 22:58:25

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