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

📄 electromotionbicyclepic16f72.asm

📁 基于MICROCHIP PIC16F系列电动自行车控制源码.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
           MOVLW    FULLPWM
           MOVWF    CCPR1L
           RETURN                   ;返回
;***************************************************
  SAMPLE   MOVLW    AND             ;
           MOVWF    STATE1          ;暂存状态值
           MOVLW    0X08
           MOVWF    DELAY
    DEL1   DECFSZ   DELAY          
           GOTO     DEL1
           MOVLW    AND             ;
           MOVWF    STATE2
           MOVLW    0X06            
           MOVWF    DELAY
     DEL2  DECFSZ   DELAY
           GOTO     DEL2
           MOVLW    AND             ;
           MOVWF    STATE3
           XORWF    STATE1,0       ;与第一次状态相同吗?
           BTFSC    STATUS,Z
           RETURN                   ;相同则返回
           MOVF     STATE2,0       ;否则再与第二次状态相比较
           XORWF    STATE3,0
           BTFSS    STATUS,Z      
           GOTO     SAMPLE          ;
           MOVF     STATE2,0       ;第三次状态与第二次相同,则将正确状态赋予STATE1并
           MOVWF    STATE1          ;返回
           RETURN
;******************************************************
  OUTPUT   SWAPF    STATE1,1       ;
           BCF      STATUS,C       ;清C位,
           RRF      STATE1,0       ;
           CALL     OUT_TABLE       ;查表,
           MOVWF    PORTC           ;将输出值输出,
           RETURN
;**********************************************************
   SAMPRB  CALL     PUSH            ;现场保护 
           BCF      STATUS,RP0
           CALL     SAMPLE          ;采样RB口状态
           CALL     OUTPUT          ;根据RB口状态触发相应的MOSFET
           CALL     POP             ;恢复现场
           BCF      INTCON,RBIF    ;清RB口电平变化中断标志
           RETFIE                   ;中断返回
;************ AD采样中断服务程序***************
     AD    CALL     PUSH            ;保护现场
           BTFSC    FLAG1,VOLTAGE  ;是电压采样?
           GOTO     SET_VOL         ;是,作相应的处理
   SET_TS  BCF      ADCON0,CHS0    ;AD采样值是TS,则选择1采样通道
           INCF     COUNT_VOL       ;电压采样周期寄存器值加1
           BTFSS    STATUS,Z       ;电压采样周期到?
           GOTO     AD4
           BCF      ADCON0,CHS0    ;是,选择2采样通道
           BSF      ADCON0,CHS1
           BSF      FLAG1,VOLTAGE  ;置相应的标志位   
      AD4  BCF      PIR1,ADIF      ;清AD中断标志
           MOVF     ADRESH,0       ;采样值送寄存器暂存
           MOVWF    TSH
           BSF      STATUS,RP0
           MOVF     ADRESL,0
           BCF      STATUS,RP0
           MOVWF    TSL
           BSF      FLAG1,PWM
           BTFSS    FLAG1,VOLTAGE  ;是否需要进行电压采样?
           GOTO     AD6
           MOVLW    0X05            ;是,延时后采样电压
           MOVWF    TEMP1
      AD5  DECFSZ   TEMP1
           GOTO     AD5
           BSF      ADCON0,GO
     AD6   CALL     POP             ;恢复现场,中断返回
           RETFIE
  SET_VOL  BCF      ADCON0,CHS1    ;如果采样值为电压值,则选择0通道
           BCF      ADCON0,CHS0
           BCF      PIR1,ADIF      ;清中断标志位
           BCF      FLAG1,VOLTAGE  ;清相应标志位
           MOVF     ADRESH,0       ;将采样结果放入被减数寄存器
           MOVWF    VOLTAGEH
           BSF      STATUS,RP0
           MOVF     ADRESL,0
           BCF      STATUS,RP0
           MOVWF    VOLTAGEL
           BSF      FLAG1,LOWPOWER ;是,置相应标志位
           CALL     POP             ;中断返回
           RETFIE
;*************************************************
    PUSH   MOVWF    W_STACK         ;暂存W寄存器
           MOVF     STATUS,0       ;暂存STATUS寄存器
           MOVWF    ST_STACK
           RETURN                   ;子程序返回
;******************************************
     POP   MOVF     ST_STACK,0     ;恢复STATUS寄存器值
           MOVWF    STATUS
           MOVF     W_STACK,0      ;恢复W寄存器值
           RETURN                   ; 子程序返回
;*********************************************
   SETUP   MOVLW    .15             ;初始化TEMP      
           MOVWF    TEMP
           MOVF     ACCbHI,0       ;ACCb送ACCd
           MOVWF    ACCdHI
           CLRF     ACCbHI          ;清ACCb
           CLRF     ACCbLO
           RETLW    0
;********************************************
   S_SIGN  MOVF     ACCaHI,0       ;ACCaHI异或ACCbHI,结果送SIGN单元
           XORWF    ACCbHI,0
           MOVWF    SIGN         
           BTFSS    ACCbHI,7       ;ACCb为负?
           GOTO     CHEK_A          ;否,检查ACCa
           CALL     NEG_B
  CHEK_A   BTFSS    ACCaHI,7       ;ACCa为负?
           RETLW    0               ;ACCa和ACCb均为负,返回
           GOTO     NEG_A           ;ACCa为负,取补
           GOTO     MAIN
;***********************************************************
           END                      ;程序结束
;**********************************************************
;***********************************************************
;*         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                   ;否,中断是由干扰引起的,返回

⌨️ 快捷键说明

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