⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 electromotionbicyclepic16f72.asm

📁 基于MICROCHIP PIC16F系列电动自行车控制源码.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;***********************************************************
;*         16F73控制的电动自行车驱动系统源程序            *
;***********************************************************
;此程序不能直接使用,只作学习参考(若要直接使用,须经修改)
;**********************************************************
; 修改联系: (调试软件:微软MPLAB)  
;***********************************************************
LIST   P=16F73
#INCLUDE P16F73.INC
;以下采用块定义的方法定义单片机内部寄存器
   CBBRCK   0X20                    ;自定义寄存器从0X20开始
   FLAG1                            ;FLAG1作为标志寄存器
   VOLTAGEH                         ;电池电压高位寄存器
   VOLTAGEL                         ;电池电压低位寄存器
   TSH                              ;手柄电压高位寄存器
   TSL                              ;手柄电压低位寄存器
   STATE1                           ;霍尔信号采样暂存器1
   STATE2                           ;霍尔信号采样暂存器2
   STATE3                           ;霍尔信号采样暂存器3
   DELAY                            ;延时计数器
   COUNT_VOL                        ;低电压采样次数计数器
   ACCaLO                           ;ACCa~ACCd为运算用的寄存器
   TEMP                             ;临时寄存器
   TEMP1                            ;临时寄存器(中断用)
   SIGN                             ;符号寄存器
   COUNT                            ;临时寄存器
   W_STACK                          ;中断时用于暂存W寄存器值
   ST_STACK                         ;中断时用于暂存STATUS寄存器值
   ENDC
;***********标志寄存器位定义以及程序中常数定义***********
   CONSTANT   VOLTAGE=0             ;采电池电压标志位
   CONSTANT   PWM=1                 ;输出下一次PWM信号标志位
   CONSTANT   LOWPOWER=2            ;低电压标志位
   CONSTANT   SHUTDOWN=3            ;刹车标志位
   CONSTANT   OFF=4                 ;复位标志位
   CONSTANT   AND=0XE0              ;AND用于获取有效霍尔信号
   CONSTANT   FULLPWM=0XFF          ;当PWM输出全高时,输入CCPR1L中的值
   CONSTANT   VOLOFFH=0X02          ;当电池电压低于24AH时, 低压保护2.86 V/31.5 V
   CONSTANT   VOLOFFL=0X4A
   CONSTANT   VOLONH=0X02           ;当电池电压大于266H时,允许电机重开3V/33V
   CONSTANT   VOLONL=0X66
   CONSTANT   TSONH=0X01            ;刹车后手柄复位值低于133H,则允许电机重新启动
   CONSTANT   TSONL=0X33
;**复位矢量入口(单片机复位时,PC指针指向程序存储器0X0000单元)
            ORG      0X0000
            GOTO     MAIN           ;复位后程序进入主程序
;***中断矢量入口程序(PIC单片机的中断矢量入口为0X0004)***
            ORG      0X0004         ;中断矢量入口
            BTFSC    INTCON,RBIF   ;是否为RB口电平变化中断?   
            GOTO     SAMPLERB       ;是,进入RB口电平变化中断服务程序
            BTFSC    PIR1,ADIF     ;是否为AD采样中断
            GOTO     AD             ;是,进入AD中断服务程序
            BTFSC    INTCON,INTF   ;是否为刹车中断
            GOTO     BRAKE          ;是,刹车中断处理
            RETFIE                  ;如都不是,则中断返回
;************逆变桥输出控制表*************
;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电平有
;效,其中RC1,RC2不作为触发电路输出口,故表中使其为高电平
           ORG      0X0020          ;表程序从0X0020单元开始存放
OUT_TABLE            
           ADDWF    PCL,1
           RETLW    0X0AF           ;如霍尔信号为0、0、0,
           RETLW    0X0BE           ;如霍尔信号为0、0、1,
           RETLW    0X0CF           ;如霍尔信号为1、0、0,
           RETLW    0X0FF           ;没有为1、0、1的霍尔信号对应电机状态
           RETLW    0X0D7           ;如霍尔信号为1、1、0
           RETLW    0X077           ;如霍尔信号为1、1、1
;***************主程序*****************
           ORG      0X0100          ;主程序从0X0100单元开始存
     MAIN  MOVLW    0X0FF           ;由于C口上电复位值不确定,必须先关闭所有MOS管
           MOVWF    PORTC
           BSF      STATUS,RP0     ;选择存储体1
           MOVLW    0X02            ;设置RC1为输入口,其它为输出口,其中RC2为PWM  
           MOVWF    TRISC           ;输出口,其它位为触发信号输出
           BCF      STATUS,RP0     ;选择存储体0
           CLRF     PIR1            ;清所有中断标志位
           CLRF     INTCON          ;禁止所有中断
           MOVLW    0X56            ;设置TMR2预分频值为4
           MOVWF    T2CON
           MOVLW    FULLPWM         ;初始化PWM工作循环寄存器,使PWM占空比为1
           MOVWF    CCPR1L          ;输出电压为零
           MOVLW    0XFF            ;设置CCP1工作于PWM方式
           MOVWF    CCP1CON
           MOVLW    0X0B            ;CCP2工作于特殊事件触发方式,用作AD采样周期寄存  
           MOVWF    CCP2CON         ;器
           CLRF     TMR2            ;TMR2计数器清零
           CLRF     TMR1H           ;TMR1计数器清零
           CLRF     TMR1L
           CLRF     T1CON           ;TMR1预分频为1,关闭振荡器,工作于定时工作方式
           MOVLW    0X08            ;初始化AD采样周期寄存器,T=512 μs
           MOVWF    CCPR2H
           MOVLW    0X00
           MOVWF    CCPR2L
           BSF      STATUS,RP0     ;选择存储体1
           MOVLW    0XEF            ;RB口高3位用于采样霍尔信号,RB0为刹车中断,设置为
           MOVWF    TRISB           ;输入,其它未用
           MOVLW    0XC7            ;初始化PWM频率为5 kHz
           MOVWF    PR2      
           MOVLW    0X082           ;AD采样结果右移,RA口引脚均为模拟输入
           MOVWF    ADCON1
           BSF      OPTION_REG,INTEDG    ;选择INT在下降沿产生中断
           BCF      STATUS,RP0
           CALL     SAMPLE          
           CALL     OUTPUT          
           MOVLW    0X0D8           ;开总中断、外围中断、INT中断和RB口电平变化中断允
           MOVWF    INTCON          ;许
           BCF      PIE2, CCP2IE   ;CCP2中断禁止
           BSF      PIE1,ADIE      ;打开AD采样中断
           CLRF     FLAG1           ;清标志位寄存器
           CLRF     COUNT_VOL       ;清电池电压采样计数器
           BSF      T1CON,TMR1ON   ;开CCP2,对手柄进行等间隔采样
           BSF      T2CON,TMR2ON   ;开CCP1
           GOTO     $               ;是,回转
;*********************************
 BRAKEON    
           BCF      FLAG1,OFF      ;清复位标志
           BCF      FLAG1,SHUTDOWN ;是,清相应标志位
           BTFSS    PORTB,0        ;INT引脚仍为1?
           RETURN                   ;否,中断是由干扰引起的,返回
           BSF      STATUS,RP0
           BCF      PIE1,ADIE      ;禁止AD采样中断
           BCF      STATUS,RP0
           BCF      INTCON,INTE    ;关RB0中断
           MOVLW    FULLPWM         ;PWM输出全高
           MOVWF    CCPR1L
           BCF      T1CON,TMR1ON   ;关闭手柄采样
  BREAK2   BTFSC    ADCON0,GO      ;正在进行AD采样?
           GOTO     BREAK2          ;是,等待AD采样完毕
           BCF      ADCON0,CHS0
           BCF      ADCON0,CHS1    ;选择0采样通道,准备采样手柄电压
           BCF      PIR1,ADIF      ;清AD采样中断标志位
           MOVLW    0X06            ;延时
           MOVWF    COUNT
   BREAK3  DECFSZ   COUNT
           GOTO     BREAK3
  BREAK5   BSF      ADCON0,GO      ;采样TS值
  BREAK4   BTFSS    PIR1,ADIF      ;采样完毕?
           GOTO     BREAK4
           BCF      PIR1,ADIF
           BCF      STATUS,C   
           MOVF     ADRESH,0       ;当前TS值送被减数
           MOVWF    ACCbHI
           MOVLW    TSONH           ;1.5 V所对应的采样值送减数
           MOVWF    ACCaHI
           MOVLW    TSONL
           MOVWF    ACCaLO
           CALL     D_sub           ;当前TS值减1.5V
           MOVLW    FULLPWM
           MOVWF    CCPR1L
           CLRWDT
           BTFSS    ACCbHI,7       ;当前电压值大于1.5V?
           GOTO     BREAK5          ;是,重新采样
           BTFSC    PORTB,0
           GOTO     BREAK5
           BSF      FLAG1,OFF      ;否,置相应的标志位
           RETURN                   ;返回   
;*******************************
 OUT_PWM   BCF      FLAG1,PWM      ;清相应的标志位
           MOVF     TSH,0          ;将调速手柄采样值送至被加数
           MOVWF    ACCaHI
           MOVF     TSL,0
           MOVWF    ACCaLO
           MOVLW    0XFF            ;FF1F补码为0XE1,即1.1 V
           MOVWF    ACCbHI
           MOVLW    0X1F         
           MOVWF    ACCbLO
           CALL     D_add
     
           BTFSS    ACCbHI,7       ;TS>1.1V?
           GOTO     PWM1            ;是,转PWM1
           MOVLW    FULLPWM         ;否则输出全高
           MOVWF    CCPR1L
           RETURN
    PWM1   MOVLW    0XFD            ;0X27B=3.1V
           MOVWF    ACCbHI
           MOVLW    0X85
           MOVWF    ACCbLO
           BTFSC    ACCbHI,7       ;TS>3.1V?
           GOTO     PWM3
    PWM2   CLRF     CCPR1L
           BCF      CCP1CON,4
           BCF      CCP1CON,5
           RETURN
    PWM3   MOVLW    0X0FF           ;1.1 V对应的采样值补码送加数   
           MOVWF    ACCbHI         
           MOVLW    0X1F
           MOVWF    ACCbLO
           CALL     D_add           ;TS-1.1V
           CLRF     ACCaHI          ;系数K=56=38H送乘数
           MOVLW    0X3F
           MOVWF    ACCaLO
           CALL     D_mpy           ;得到放大128倍的低电平时间K*(TS-1.1V)
           MOVF     ACCcHI,0       ;将结果取出
           MOVWF    ACCaHI
           MOVF     ACCcLO,0
           MOVWF    ACCaLO   
           MOVLW    0X64            ;PWM周期T减去低电平时间,得到高电平时间
           MOVWF    ACCbHI
           CLRF     ACCbLO 
           CALL     D_sub         
           BTFSC    ACCbHI,7       ;低电平时间是否大于周期?
           GOTO     PWM2            ;是,输出全压
           RLF      ACCbLO          ;否则,输出与低电平时间对应的高电平时间
           RLF      ACCbHI
           MOVF     ACCbHI,0       ;D10~D2位送CCPR1L
           MOVWF    CCPR1L
           BCF      CCP1CON,5      ;D0位送CCP1CON5
           BTFSC    ACCbLO,7
           BSF      CCP1CON,5
           BCF      CCP1CON,4      ;D.1位送CCP1CON4      
           BTFSC    ACCbLO,6
           BSF      CCP1CON,4
           RETURN                   ;返回
;*******************************
   BRAKE   CALL     PUSH            ;保存现场
           BCF      STATUS,RP0     ;回存储区0
           BSF      FLAG1,SHUTDOWN ;置相应标志位
           BCF      INTCON,INTF    ;清中断标志位
           CALL     POP             ;恢复现场
           RETFIE                   ;中断返回
;********************************
   POWER   BCF      FLAG1,LOWPOWER;清相应的标志位
           MOVF     VOLTAGEH,0
           MOVWF    ACCaHI
           MOVF     VOLTAGEL,0
           MOVWF    ACCaLO
           MOVLW    VOLOFFH
           MOVWF    ACCbHI
           MOVLW    VOLOFFL
           MOVWF    ACCbLO
           CALL     D_sub
           BTFSC    ACCbLO,7       ;判断当前电池电压值是否低于保护电压(32V)
           RETURN                   ;不是,返回
           BCF      INTCON,INTE
           BCF      T1CON,TMR1ON   ;关闭电流采样

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -