5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 12912|回复: 36
打印 上一主题 下一主题

简单到不能相信的有刷电调(508)

[复制链接]
跳转到指定楼层
楼主
发表于 2011-9-4 19:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
看到仍有人对有刷电调感兴趣,我把自己开发的508单向有刷电调也发给大家看看,给大家一个参考。我这个电调的思路是把PPM信号检测植入PWM输出过程,不知道别人怎么设计的,请大家看后给个提示。电调已经完成,我用洞洞板做的,没任何问题。因为用在小机器人车上,4节5#电池供电,所以电源电路部分设计很简单。源程序和电路图如下。
源程序:
;508直流电机调速器。接收PPM信号,并转换成相应转速。(单向无刹车)
;508工作状态为PWM占空比输出的循环下。
;输入信号高电平期间,PWM频率约为1000Hz。
;输入信号的检测植入PWM信号输出的过程中。
;GPIO<3>为输入,GPIO<1>为输出。
;
;
;                        
;       VERSION 1.0C    20110407  12F508
;          万学斌
;
;
  processor 12C508
  INCLUDE  <P12C508.inc>
  __config  _MCLRE_OFF & _CP_ON & _WDT_ON & _IntRC_OSC
;
;----  自定义符号  ------
;
PPM_H   EQU 10H   ;PPM高电平值
PPM_L EQU 11H   ;PPM低电平值
H_OUT EQU 12H   ;输出PWM信号高电平值
L_OUT EQU 13H   ;输出PWM信号低电平值
HTMP EQU 14H   ;输入信号
LTMP EQU 15H   ;
FLAGR EQU 16H   ;标志
;
;
;----  变量 ----
;
W EQU 0           
F EQU 1
PPM EQU 0   ;FLAGR第0位为PPM信号上次状态标志位,1为H,0为L
OUT EQU 1   ;FLAGR第1位为当前输出信号状态标志位,1为PWM高,0为
PWM低
;
  org 0000
;------------
INIT MOVLW B'001100'  ;GPIO<2:3>输入
  TRIS GPIO
  CLRF GPIO
  CLRF FLAGR
  CLRF HTMP
  CLRF LTMP
;------------
START  MOVLW .1
  MOVWF HTMP
  MOVLW .99
  MOVWF LTMP
;------------
MAIN
;----- 输出高电平 -----
PWM_H  MOVF HTMP,W
  MOVWF H_OUT
  MOVF LTMP,W
  MOVWF L_OUT
  BSF FLAGR,OUT ;PWM当前输出高位标志
  BSF GPIO,1  ;输出高电平
PWM_H1  BTFSS GPIO,3  ;输入信号高电平跳
  GOTO L  ;低电平,转L
  BTFSS FLAGR,PPM ;PPM信号持续为高,则PPM_H+1
  GOTO PWM_H2  ;PPM信号由低跳高,转PWM_H2(PPM_H重新计数)
  INCF PPM_H,F
  BSF FLAGR,PPM ;置PPM电平标记位为1
  NOP
HDEC  DECFSZ H_OUT,F
  GOTO PWM_H1  ;持续高电平的计数周期为10uS
  GOTO PWM_L  ;高电平输出结束,转低电平输出
PWM_H2  CLRF PPM_H  ;PPM信号跳变为高电平,PPM_H重新计数
  BSF FLAGR,PPM ;置PPM电平标记位为1
  INCF PPM_H,F  ;PPM_H+1
  DECFSZ H_OUT,F  ;
  GOTO PWM_H1  ;PPM_H重新计数的第一个周期为11uS
;----- 输出低电平 -----
PWM_L  BCF FLAGR,OUT ;PWM当前输出低位标志
     BCF GPIO,1  ;输出低电平
PWM_L1  BTFSS GPIO,3  ;PPM信号高电平跳
  GOTO L  ;低电平,转
  BTFSS FLAGR,PPM ;PPM信号持续为高,则PPM_H+1
  GOTO PWM_L2  ;PPM信号由低跳高,转PWM_L2(PPM_H重新计数)
  INCF PPM_H,F
  BSF FLAGR,PPM ;置PPM电平标记位为1
  NOP
LDEC  DECFSZ L_OUT,F
  GOTO PWM_L1  ;持续高电平的计数周期为10uS
  CLRWDT   ;喂狗
  GOTO PWM_H  ;程序循环
PWM_L2  CLRF PPM_H  ;PPM信号跳变为高电平,PPM_H重新计数
  BSF FLAGR,PPM ;置PPM电平标记位为1
  INCF PPM_H,F  ;PPM_H+1
  DECFSZ L_OUT,F ;
  GOTO PWM_L1  ;PPM_H重新计数的第一个周期为11uS
  CLRWDT    ;喂狗
  GOTO PWM_H  ;程序循环
;----- PPM信号为低时的处理程序 -----
L  BTFSS FLAGR,PPM ;PPM信号高位向低位跳变,计算新数据
  GOTO OLD  ;PPM信号持续低位,使用原有数据
  MOVF PPM_H,W  ;
  MOVWF HTMP
  BCF FLAGR,PPM ;置PPM电平标记位为0
  MOVLW .199
  SUBWF HTMP,W  ;HTMP-199
  SKPC   ;HTMP>199,跳
  GOTO L1
  MOVLW .1
  MOVWF L_OUT
  MOVLW .99
  MOVWF H_OUT
  BTFSS FLAGR,OUT ;当前输出PWM高位,转向HDEC
  GOTO LDEC  ;当前输出PWM低位,转向LDEC,周期20uS
  GOTO HDEC  ;此分支周期为21uS
L1  MOVLW .100
  SUBWF HTMP,W  ;HTMP-100
  SKPC   ;IF HTMP>100,SKIP
  GOTO L2
  MOVLW .100
  SUBWF HTMP,F  ;HTMP-100
  MOVLW .100
  MOVWF LTMP
  MOVF HTMP,W
  SUBWF LTMP,F  ;100-HTMP
  BTFSS FLAGR,OUT ;当前输出PWM高位,转向HDEC
  GOTO LDEC  ;当前输出PWM低位,转向LDEC,周期26uS
  GOTO HDEC  ;此分支周期为27uS
L2  MOVLW .1
  MOVWF H_OUT
  MOVLW .99
  MOVWF L_OUT
  BTFSS FLAGR,OUT ;当前输出PWM高位,转向HDEC
  GOTO LDEC  ;当前输出PWM低位,转向LDEC,周期26uS
  GOTO HDEC  ;此分支周期为27uS
OLD  BTFSS FLAGR,OUT ;当前输出PWM高位,转向HDEC
  GOTO LDEC  ;当前输出PWM低位,转向LDEC,周期10uS
  GOTO HDEC  ;此分支周期为11uS
;============
  END


电路图:

508ESC(单向).JPG (11.02 KB, 下载次数: 39)

508ESC(单向).JPG

评分

参与人数 2威望 +3 收起 理由
烈日圣火 + 1 赞一个! 虽然啥也没看懂
airwolf + 2 【发贴鼓励】感谢分享,希望继续努力发更多 ...

查看全部评分

欢迎继续阅读楼主其他信息

37
发表于 2013-8-18 14:31 | 只看该作者
bldc 发表于 2011-12-26 21:45
本人汇编水平有限,除非对于非常非常感兴趣的,基本不看代码,太累,不过楼主注解挺多的,不错。

如果楼 ...

明白了,很简单

36
发表于 2013-8-18 10:10 | 只看该作者
说说原理就好了,譬如ppm信号转化成相应的pwm信号,是什么样的对应关系。

35
发表于 2013-8-1 17:40 | 只看该作者
你说的太简单了, 只是我没看懂。不懂这些代码。
34
发表于 2013-8-1 01:16 | 只看该作者
帮顶,帮顶!

33
发表于 2013-4-22 22:28 | 只看该作者
PIC单片机可以选择12F683,内置PWM模块,16位定时/计数器,外部引脚计数使能可以更加精确的获取PPM信号脉冲宽度。程序也可以简化很多。
32
发表于 2013-4-22 16:35 | 只看该作者
谢谢分享
31
发表于 2013-3-27 01:20 | 只看该作者
能否用51单片机解决这个问题 ? 哪些地方需要注意?
30
发表于 2013-3-12 21:16 | 只看该作者

29
发表于 2012-10-11 02:13 | 只看该作者
够用、适用,有刷电机还是很有用处的,不一定什么都要无刷电机,应用还是要考虑性价比
28
发表于 2012-7-27 08:09 | 只看该作者
楼住可否发一份资料给我,我想自己做,淘宝上的太贵了,程序是HEX最好。谢谢
27
 楼主| 发表于 2012-4-11 06:24 | 只看该作者
原帖由 bldc 于 2011-12-26 21:45 发表
本人汇编水平有限,除非对于非常非常感兴趣的,基本不看代码,太累,不过楼主注解挺多的,不错。

如果楼主不是PIC老手,我觉得AVR的单片机不错,1般的MEGA8才5块钱,有很多的C编译器可用,如AVRGCC,ICCAVR等。
...

受教了,茅塞顿开!我因为一直在考虑用508,根本未考虑用中断和PWM去做,所以把自己陷入了苦境,这一说可就简单多了啊!多谢多谢!

[ 本帖最后由 wxb3871 于 2012-4-12 05:55 编辑 ]
26
发表于 2012-1-23 18:52 | 只看该作者
看似简单
25
发表于 2012-1-23 16:55 | 只看该作者
看不懂:em23:
24
发表于 2012-1-19 14:24 | 只看该作者
不明白!
23
发表于 2012-1-16 23:37 | 只看该作者
好帖。。顶:em26: :em15:
22
发表于 2012-1-14 03:09 | 只看该作者
:em26:
21
发表于 2011-12-31 16:26 | 只看该作者
晕:em16:
20
发表于 2011-12-26 21:45 | 只看该作者
本人汇编水平有限,除非对于非常非常感兴趣的,基本不看代码,太累,不过楼主注解挺多的,不错。

如果楼主不是PIC老手,我觉得AVR的单片机不错,1般的MEGA8才5块钱,有很多的C编译器可用,如AVRGCC,ICCAVR等。
C相对于汇编更好理解,效率也不错。M8片内硬件也比较多。对于制作一个实用且通用的电调的话(甚至双向)都够用了。
学深了,熟悉一种芯片之后,就比较懒于花大功夫学新品的了,我就是这样,一直停在AVR上了。
一半电调的几个部分:
1,接收机信号PPM解码,1ms至2ms,以片内始终计数值表达。对于M8,可设定中断来处理这个,主程序可以不管这个过程。
2,PWM输出,可由MCU自动产生输出,程序只需改变占空比的值就可以,PPM解码中断程序里可以做这个。
3,监控动力电源电压,低于一定值需要切断,使接收机和舵机可以继续有电工作,M8自带6路模数转换。
4,失控保护,没有接收机信号,就切断动力。
19
发表于 2011-12-26 17:36 | 只看该作者
要学习一下
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表