您的位置 首页 IC

16F876操控的电动自行车驱动体系源程序

16F876控制的电动自行车驱动系统源程序LISTP=16F876#INCLUDEP16F876.INC;以下采用块定义的方法定义单片机内部寄存器CBLOCK0X20;…

16F876操控电动自行车驱动体系源程序

LIST P=16F876

#INCLUDE P16F876.INC

;以下选用块界说的办法界说单片机内部存放器

CBLOCK 0X20 ;自界说存放器从0X20开端

FLAG1 ;FLAG1作为标志存放器

VOLTAGEH ;电池电压高位存放器

VOLTAGEL ;电池电压低位存放器

TSH ;手柄电压高位存放器

TSL ;手柄电压低位存放器

STATE1 ;霍尔信号采样暂存器1

STATE2 ;霍尔信号采样暂存器2

STATE3 ;霍尔信号采样暂存器3

DELAY ;延时计数器

COUNT_VOL ;低电压采样次数计数器

ACCaLO ;ACCa~ACCd为运算用的存放器

ACCaHI

ACCbLO

ACCbHI

ACCcLO

ACCcHI

ACCdLO

ACCdHI

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

START 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,则使RC4、RC6为低电平

RETLW 0X0BE ;如霍尔信号为0、0、1,则使RC0、RC6为低电平

RETLW 0X0FF ;没有为0、1、0的霍尔信号对应电机状况

RETLW 0X07E ;如霍尔信号为0、1、1,则使RC0、RC7为低电平

RETLW 0X0CF ;如霍尔信号为1、0、0,则使RC4、RC5为低电平

RETLW 0X0FF ;没有为1、0、1的霍尔信号对应电机状况

RETLW 0X0D7 ;如霍尔信号为1、1、0则使RC3、RC5为低电平

RETLW 0X077 ;如霍尔信号为1、1、1则使RC3、RC7为低电平

;***************主程序*****************

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 0X01 ;设置TMR2预分频值为4

MOVWF T2CON

MOVLW FULLPWM ;初始化PWM作业循环存放器,使PWM占空比为1

MOVWF CCPR1L ;输出电压为零

MOVLW 0XFF ;设置CCP1作业于PWM方法

MOVWF CCP1CON

MOVLW 0X0B ;CCP2作业于特别事情触发方法,用作AD采样周期存放 MOVWF CCP2CON ;器

MOVLW 0X081 ;挑选AD转化时钟为32分频,挑选AN0通道,并使AD

MOVWF ADCON0 ;转化答应

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 ;依据采得的状况值触发相应的MOSFET

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

RETEST BTFSS FLAG1,PWM ;TS采样完毕?

GOTO NEXT1 ;没有,转NEXT1

CALL OUT_PWM ;TS采样完毕,送出相应的PWM信号

BCF FLAG1,PWM ;清PWM答应标志

NEXT1 BTFSS FLAG1,LOWPOWER;电压采样完毕?

GOTO NEXT2 ;没有转NEXT2

CALL POWER ;是,调用电压维护子程序处理数据

BTFSC FLAG1,OFF ;是否需求复位?

GOTO MAIN ;是,单片机复位

NEXT2 BTFSS FLAG1,SHUTDOWN;刹车中止到来?

GOTO RETEST ;否,反转RETEST

CALL BRAKEON ;是,调用刹车处理子程序

CLRWDT

BTFSC FLAG1,OFF ;OFF=0?

GOTO MAIN ;否,单片机复位

GOTO RETEST ;是,反转RETEST

;***************刹车处理子程序******************

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

BSF STATUS,RP0

MOVF ADRESL,0

BCF STATUS,RP0

MOVWF ACCbLO

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 ;回来

;***************开环PWM输出子程序****************

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

CALL D_add

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 ;封闭电流采样

MOVLW FULLPWM

MOVWF CCPR1L

BSF STATUS,RP0

BCF PIE1,ADIE ;制止AD采样中止

BCF STATUS,RP0

POWER3 BTFSC ADCON0,GO ;正在进行AD采样?

GOTO POWER3 ;是,等候AD采样完毕

BCF PIR1,ADIF ;清AD采样中止标志位

BCF ADCON0,CHS0

BSF ADCON0,CHS1 ;挑选电压采样通道

MOVLW 0X06 ;延时等候通道转化完结

MOVWF COUNT

POWER4 DECFSZ COUNT

GOTO POWER4

POWER6 BSF ADCON0,GO ;采样电池电压值

POWER5 BTFSS PIR1,ADIF ;采样完毕?

GOTO POWER5

BCF PIR1,ADIF ;清AD中止标志位

BCF STATUS,C

MOVF ADRESH,0 ;当时电压值送被加数

MOVWF ACCbHI

BSF STATUS,RP0

MOVF ADRESL,0

BCF STATUS,RP0

MOVWF ACCbLO

MOVLW VOLONH ;35V电压值送被加数

MOVWF ACCaHI

MOVLW VOLONL

MOVWF ACCaLO

CALL D_sub ;当时电压值减35,与重开电压进行比较

MOVLW FULLPWM

MOVWF CCPR1L

CLRWDT

BTFSC ACCbHI,7 ;当时电压值大于35?

GOTO POWER6 ;否,从头采样

BSF FLAG1,OFF ;是,置相应的标志位

RETURN ;回来

;***电机转子方位采样子程序,状况采样子程序,出口地址:STATE1***

SAMPLE MOVLW AND ;读RB口

ANDWF PORTB,0 ;别离出有用信息

MOVWF STATE1 ;暂存状况值

MOVLW 0X08

MOVWF DELAY

DEL1 DECFSZ DELAY ;延时6 μs

GOTO DEL1

MOVLW AND ;读RB口

ANDWF PORTB,0 ;别离出有用信息,并暂存

MOVWF STATE2

XORWF STATE1,0 ;与上一次状况值相异或

BTFSC STATUS,Z

RETURN ;两个状况值持平则回来

MOVLW 0X06 ;不然延时4 μs

MOVWF DELAY

DEL2 DECFSZ DELAY

GOTO DEL2

MOVLW AND ;读RB口

ANDWF PORTB,0 ;提取有用信息并暂存

MOVWF STATE3

XORWF STATE1,0 ;与第一次状况相同吗?

BTFSC STATUS,Z

RETURN ;相同则回来

MOVF STATE2,0 ;不然再与第2次状况相比较

XORWF STATE3,0

BTFSS STATUS,Z

GOTO SAMPLE ;三次状况均不相同则从头采样

MOVF STATE2,0 ;第三次状况与第2次相同,则将正确状况赋予STATE1并

MOVWF STATE1 ;回来

RETURN

;************** MOSFET触发信号输出子程序**************

OUTPUT SWAPF STATE1,1 ;STATE1存放器凹凸半字节交换

BCF STATUS,C ;清C位,并将STATE1存放器左移一位

RRF STATE1,0 ;将采样所得成果放至W低三位

CALL OUT_TABLE ;查表取得输出值

MOVWF PORTC ;将输出值输出至RC口

RETURN

;*************** RB口电平改变中止服务程序**************

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

MOVF ACCbLO,0

MOVWF ACCdLO

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 ;程序完毕

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/272618.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部