找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

单片机控制的电动自行车驱动系统

[复制链接]
admin 发表于 2012-9-2 08:37:17 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
单片机控制的电动自行车驱动系统
14.4.4 各部分程序
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
 楼主| admin 发表于 2012-9-2 08:37:21 | 显示全部楼层
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 ;否则再与第二次
状态相比较
XORWF STATE3,0
BTFSS STATUS,Z
GOTO SAMPLE ;三次状态均不相
同则重新采样
MOVF STATE2,0 ;第三次状态与第
二次相同,则将正确状态赋予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
;程序结束
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 12:11 , Processed in 0.055622 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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