单片机控制的电动自行车驱动系统程序.docx
- 文档编号:25543166
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:23
- 大小:20.20KB
单片机控制的电动自行车驱动系统程序.docx
《单片机控制的电动自行车驱动系统程序.docx》由会员分享,可在线阅读,更多相关《单片机控制的电动自行车驱动系统程序.docx(23页珍藏版)》请在冰豆网上搜索。
单片机控制的电动自行车驱动系统程序
单片机控制的电动自行车驱动系统程序
LISTP=16F876
#INCLUDEP16F876.INC
;以下采用块定义的方法定义单片机内部寄存器
CBLOCK0X20;自
定义寄存器从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
;***********标志寄存器位定义以及程序中常数定义***********
CONSTANTVOLTAGE=0;采电池电压标志位
CONSTANTPWM=1;输出下一次PWM信号标志位
CONSTANTLOWPOWER=2;低电压标志位
CONSTANTSHUTDOWN=3;刹车标志位
CONSTANTOFF=4;复位标志位
CONSTANTAND=0XE0;AND用于获取有效霍尔信号
CONSTANTFULLPWM=0XFF;当PWM输出全高时,输入CCPR1L中的值
CONSTANTVOLOFFH=0X02;当电池电压低于24AH时,低压保护2.86
V/31.5V
CONSTANTVOLOFFL=0X4A
CONSTANTVOLONH=0X02;当电池电压大于266H时,允许电机重开
3V/33V
CONSTANTVOLONL=0X66
CONSTANTTSONH=0X01;刹车后手柄复位值低于133H,则允许电
机重新启动
CONSTANTTSONL=0X33
;***复位矢量入口(单片机复位时,PC指针指向程序存储器0X0000单元)***
ORG0X0000
STARTGOTOMAIN;复位后程序进入主程序
;***中断矢量入口程序(PIC单片机的中断矢量入口为0X0004)***
ORG0X0004;中
断矢量入口
BTFSCINTCON,RBIF;是否为RB口电平
变化中断?
GOTOSAMPLERB;是,进入RB口电平变化中断
服务程序
BTFSCPIR1,ADIF;是否为AD采样中断
GOTOAD;
是,进入AD中断服务程序
BTFSCINTCON,INTF;是否为刹车中断
GOTOBRAKE;是,刹车中断处
理
RETFIE;如
都不是,则中断返回
;************逆变桥输出控制表*************
;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电
平有
;效,其中RC1,RC2不作为触发电路输出口,故表中使其为高电平
ORG0X0020;表程序从0X0020单元开始存
放(也可以不从这开始)
OUT_TABLE
ADDWFPCL,1
RETLW0X0AF;如霍尔信号为
0、0、0,则使RC4、RC6为低电平
RETLW0X0BE;如霍尔信号为
0、0、1,则使RC0、RC6为低电平
RETLW0X0FF;没有为0、1、0
的霍尔信号对应电机状态
RETLW0X07E;如霍尔信号为
0、1、1,则使RC0、RC7为低电平
RETLW0X0CF;如霍尔信号为
1、0、0,则使RC4、RC5为低电平
RETLW0X0FF;没有为1、0、1
的霍尔信号对应电机状态
RETLW0X0D7;如霍尔信号为
1、1、0则使RC3、RC5为低电平
RETLW0X077;如霍尔信号为
1、1、1则使RC3、RC7为低电平
;***************主程序*****************
ORG0X0100;主
程序从0X0100单元开始存储
MAIN
MOVLW0X0FF;由于C口上电复
位值不确定,必须先关闭所有MOS管
MOVWFPORTC
BSFSTATUS,RP0;选
择存储体1
MOVLW0X02;设
置RC1为输入口,其它为输出口,其中RC2为PWM
MOVWFTRISC;输出口,其它位
为触发信号输出
BCFSTATUS,RP0;选
择存储体0
CLRFPIR1;清
所有中断标志位
CLRFINTCON;禁止所有中断
MOVLW0X01;设
置TMR2预分频值为4
MOVWFT2CON
MOVLWFULLPWM;初始化PWM工作循环寄存
器,使PWM占空比为1
MOVWFCCPR1L;输出电压为零
MOVLW0XFF;设
置CCP1工作于PWM方式
MOVWFCCP1CON
MOVLW0X0B;
CCP2工作于特殊事件触发方式,用作AD采样周期寄存MOVWF
CCP2CON;器
MOVLW0X081;选择AD转换时钟
为32分频,选择AN0通道,并使AD
MOVWFADCON0;转换允许
CLRFTMR2;TMR2计数器清零
CLRFTMR1H;TMR1计数器清零
CLRFTMR1L
CLRFT1CON;TMR1预分频为
1,关闭振荡器,工作于定时工作方式
MOVLW0X08;初
始化AD采样周期寄存器,T=512μs
MOVWFCCPR2H
MOVLW0X00
MOVWFCCPR2L
BSFSTATUS,RP0;选
择存储体1
MOVLW0XEF;RB
口高3位用于采样霍尔信号,RB0为刹车中断,设置为
MOVWFTRISB;输入,其它未用
MOVLW0XC7;初
始化PWM频率为5kHz
MOVWFPR2
MOVLW0X082;AD采样结果右
移,RA口引脚均为模拟输入
MOVWFADCON1
BSFOPTION_REG,INTEDG ;选择INT在下降沿产生中断
BCFSTATUS,RP0
CALLSAMPLE;确定当前转子位
置
CALLOUTPUT;根据采得的状态
值触发相应的MOSFET
MOVLW0X0D8;开总中断、外围
中断、INT中断和RB口电平变化中断允
MOVWFINTCON;许
BCFPIE2,CCP2IE;CCP2中断禁止
BSFPIE1,ADIE;打开AD采样中断
CLRFFLAG1;清标志位寄存器
CLRFCOUNT_VOL;清电池电压采样计数器
BSFT1CON,TMR1ON;开CCP2,对手柄
进行等间隔采样
BSFT2CON,TMR2ON;开CCP1
RETESTBTFSSFLAG1,PWM;TS采样完毕?
GOTONEXT1;没有,转NEXT1
CALLOUT_PWM;TS采样完毕,送出相应的
PWM信号
BCFFLAG1,PWM;清PWM允许标志
NEXT1BTFSSFLAG1,LOWPOWER;电压采样完毕?
GOTONEXT2;没有转NEXT2
CALLPOWER;是,调用电压保
护子程序处理数据
BTFSCFLAG1,OFF;是否需要复位?
GOTOMAIN;是,单片机复位
NEXT2BTFSSFLAG1,SHUTDOWN;刹车中断到来?
GOTORETEST;否,回转RETEST
CALLBRAKEON;是,调用刹车处
理子程序
CLRWDT
BTFSCFLAG1,OFF;OFF=0?
GOTOMAIN;否,单片机复位
GOTORETEST;是,回转RETEST
;***************刹车处理子程序******************
BRAKEONBCFFLAG1,OFF;清复位标志
BCFFLAG1,SHUTDOWN;是,清相应标志位
BTFSSPORTB,0;INT引脚仍为1?
RETURN;
否,中断是由干扰引起的,返回
BSFSTATUS,RP0
BCFPIE1,ADIE;禁止AD采样中断
BCFSTATUS,RP0
BCFINTCON,INTE;关
RB0中断
MOVLWFULLPWM;PWM输出全高
MOVWFCCPR1L
BCFT1CON,TMR1ON;关闭手柄采样
BREAK2BTFSCADCON0,GO;正在进行AD采样?
GOTOBREAK2;是,等待AD采样
完毕
BCFADCON0,CHS0
BCFADCON0,CHS1;选择0采样通
道,准备采样手柄电压
BCFPIR1,ADIF;清AD采样中断标
志位
MOVLW0X06;延
时
MOVWFCOUNT
BREAK3DECFSZCOUNT
GOTOBREAK3
BREAK5BSFADCON0,GO;采样TS值
BREAK4BTFSSPIR1,ADIF;采样完毕?
GOTOBREAK4
BCFPIR1,ADIF
BCFSTATUS,C
MOVFADRESH,0;当前TS值送被减数
MOVWFACCbHI
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFACCbLO
MOVLWTSONH;1.5V所对应的
采样值送减数
MOVWFACCaHI
MOVLWTSONL
MOVWFACCaLO
CALLD_sub;当前TS值减1.5V
MOVLWFULLPWM
MOVWFCCPR1L
CLRWDT
BTFSSACCbHI,7;当前电压值大于1.5V?
GOTOBREAK5;是,重新采样
BTFSCPORTB,0
GOTOBREAK5
BSFFLAG1,OFF;否,置相应的标
志位
RETURN;返
回
;***************开环PWM输出子程序****************
OUT_PWMBCFFLAG1,PWM;清相应的标志位
MOVFTSH,0;将调速手柄采样
值送至被加数
MOVWFACCaHI
MOVFTSL,0
MOVWFACCaLO
MOVLW0XFF;
FF1F补码为0XE1,即1.1V
MOVWFACCbHI
MOVLW0X1F
MOVWFACCbLO
CALLD_add
BTFSSACCbHI,7;TS>1.1V?
GOTOPWM1;是,转PWM1
MOVLWFULLPWM;否则输出全高
MOVWFCCPR1L
RETURN
PWM1MOVLW0XFD;0X27B=3.1V
MOVWFACCbHI
MOVLW0X85
MOVWFACCbLO
CALLD_add
BTFSCACCbHI,7;TS>3.1V?
GOTOPWM3
PWM2CLRFCCPR1L
BCFCCP1CON,4
BCFCCP1CON,5
RETURN
PWM3MOVLW0X0FF;1.1V对应的采样值补码送
加数
MOVWFACCbHI
MOVLW0X1F
MOVWFACCbLO
CALLD_add;TS-1.1V
CLRFACCaHI;系数K=56=38H送
乘数
MOVLW0X3F
MOVWFACCaLO
CALLD_mpy;得到放大128倍
的低电平时间K*(TS-1.1V)
MOVFACCcHI,0;将结果取出
MOVWFACCaHI
MOVFACCcLO,0
MOVWFACCaLO
MOVLW0X64;PWM
周期T减去低电平时间,得到高电平时间
MOVWFACCbHI
CLRFACCbLO
CALLD_sub
BTFSCACCbHI,7;低电平时间是否大于周期?
GOTOPWM2;是,输出全压
RLFACCbLO;否
则,输出与低电平时间对应的高电平时间
RLFACCbHI
MOVFACCbHI,0;D10~D2位送CCPR1L
MOVWFCCPR1L
BCFCCP1CON,5;D0位送CCP1CON5
BTFSCACCbLO,7
BSFCCP1CON,5
BCFCCP1CON,4;D.1位送
CCP1CON4
BTFSCACCbLO,6
BSFCCP1CON,4
RETURN;返
回
;****************刹车中断服务程序***************
BRAKECALLPUSH;保存现场
BCFSTATUS,RP0;回
存储区0
BSFFLAG1,SHUTDOWN;置相应标志位
BCFINTCON,INTF;清
中断标志位
CALLPOP;恢
复现场
RETFIE;中
断返回
;***************低电压保护处理子程序*****************
POWERBCFFLAG1,LOWPOWER;清相应的标志位
MOVFVOLTAGEH,0
MOVWFACCaHI
MOVFVOLTAGEL,0
MOVWFACCaLO
MOVLWVOLOFFH
MOVWFACCbHI
MOVLWVOLOFFL
MOVWFACCbLO
CALLD_sub
BTFSCACCbLO,7;判断当前电池电压值是否低
于保护电压(32V)
RETURN;不
是,返回
BCFINTCON,INTE
BCFT1CON,TMR1ON;关闭电流采样
MOVLWFULLPWM
MOVWFCCPR1L
BSFSTATUS,RP0
BCFPIE1,ADIE;禁止AD采样中断
BCFSTATUS,RP0
POWER3BTFSCADCON0,GO;正在进行AD采样?
GOTOPOWER3;是,等待AD采样
完毕
BCFPIR1,ADIF;清AD采样中断标
志位
BCFADCON0,CHS0
BSFADCON0,CHS1;选择电压采样通
道
MOVLW0X06;延
时等待通道转换完成
MOVWFCOUNT
POWER4DECFSZCOUNT
GOTOPOWER4
POWER6BSFADCON0,GO;采样电池电压值
POWER5BTFSSPIR1,ADIF;采样完毕?
GOTOPOWER5
BCFPIR1,ADIF;清AD中断标志位
BCFSTATUS,C
MOVFADRESH,0;当前电压值送被加数
MOVWFACCbHI
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFACCbLO
MOVLWVOLONH;35V电压值送被
加数
MOVWFACCaHI
MOVLWVOLONL
MOVWFACCaLO
CALLD_sub;当前电压值减
35,与重开电压进行比较
MOVLWFULLPWM
MOVWFCCPR1L
CLRWDT
BTFSCACCbHI,7;当前电压值大于35?
GOTOPOWER6;否,重新采样
BSFFLAG1,OFF;是,置相应的标
志位
RETURN;返
回
;***电机转子位置采样子程序,状态采样子程序,出口地址:
STATE1***
SAMPLEMOVLWAND;读RB口
ANDWFPORTB,0;分离出有效信息
MOVWFSTATE1;暂存状态值
MOVLW0X08
MOVWFDELAY
DEL1DECFSZDELAY;延时6μs
GOTODEL1
MOVLWAND;读
RB口
ANDWFPORTB,0;分离出有效信
息,并暂存
MOVWFSTATE2
XORWFSTATE1,0;与上一次状态值
相异或
BTFSCSTATUS,Z
RETURN;两
个状态值相等则返回
MOVLW0X06;否
则延时4μs
MOVWFDELAY
DEL2DECFSZDELAY
GOTODEL2
MOVLWAND;读
RB口
ANDWFPORTB,0;提取有效信息并
暂存
MOVWFSTATE3
XORWFSTATE1,0;与第一次状态相
同吗?
BTFSCSTATUS,Z
RETURN;相
同则返回
MOVFSTATE2,0;否则再与第二次
状态相比较
XORWFSTATE3,0
BTFSSSTATUS,Z
GOTOSAMPLE;三次状态均不相
同则重新采样
MOVFSTATE2,0;第三次状态与第
二次相同,则将正确状态赋予STATE1并
MOVWFSTATE1;返回
RETURN
;**************MOSFET触发信号输出子程序**************
OUTPUTSWAPFSTATE1,1;STATE1寄存器高低半字节互
换
BCFSTATUS,C;清C位,并将
STATE1寄存器左移一位
RRFSTATE1,0;将
采样所得结果放至W低三位
CALLOUT_TABLE;查表获得输出值
MOVWFPORTC;将输出值输出至
RC口
RETURN
;***************RB口电平变化中断服务程序**************
SAMPRBCALLPUSH;现场保护
BCFSTATUS,RP0
CALLSAMPLE;采样RB口状态
CALLOUTPUT;根据RB口状态触
发相应的MOSFET
CALLPOP;恢
复现场
BCFINTCON,RBIF;清
RB口电平变化中断标志
RETFIE;中
断返回
;************AD采样中断服务程序***************
ADCALLPUSH;保护现场
BTFSCFLAG1,VOLTAGE;是电压采样?
GOTOSET_VOL;是,作相应的处
理
SET_TSBCFADCON0,CHS0;AD采样值是TS,则选择1采
样通道
INCFCOUNT_VOL;电压采样周期寄
存器值加1
BTFSSSTATUS,Z;电压采样周期到?
GOTOAD4
BCFADCON0,CHS0;是,选择2采样
通道
BSFADCON0,CHS1
BSFFLAG1,VOLTAGE;置相应的标志位
AD4BCFPIR1,ADIF;清AD中断标志
MOVFADRESH,0;采样值送寄存器暂存
MOVWFTSH
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFTSL
BSFFLAG1,PWM
BTFSSFLAG1,VOLTAGE;是否需要进行电压采样?
GOTOAD6
MOVLW0X05;
是,延时后采样电压
MOVWFTEMP1
AD5DECFSZTEMP1
GOTOAD5
BSFADCON0,GO
AD6CALLPOP;恢
复现场,中断返回
RETFIE
SET_VOLBCFADCON0,CHS1;如果采样值为电
压值,则选择0通道
BCFADCON0,CHS0
BCFPIR1,ADIF;清中断标志位
BCFFLAG1,VOLTAGE;清相应标志位
MOVFADRESH,0;将采样结果放入被减数寄存
器
MOVWFVOLTAGEH
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFVOLTAGEL
BSFFLAG1,LOWPOWER;是,置相应标志位
CALLPOP;中
断返回
RETFIE
;**************中断保护现场子程序******************
PUSHMOVWFW_STACK;暂存W寄存器
MOVFSTATUS,0;暂存STATUS寄存器
MOVWFST_STACK
RETURN;子
程序返回
;**************中断恢复现场子程序**************
POPMOVFST_STACK,0;恢复STATUS寄存
器值
MOVWFSTATUS
MOVFW_STACK,0;恢复W寄存器值
RETURN;子
程序返回
;**************初始化子程序****************
SETUPMOVLW .15;初始化TEMP
MOVWF TEMP
MOVF ACCbHI,0;ACCb送ACCd
MOVWF ACCdHI
MOVF ACCbLO,0
MOVWF ACCdLO
CLRF ACCbHI;清ACCb
CLRF ACCbLO
RETLW 0
;**********乘除法运算确定结果符号子程序**********
S_SIGNMOVF ACCaHI,0;ACCaHI异或ACCbHI,结果送SIGN单元
XORWF ACCbHI,0
MOVWF SIGN
BTFSS ACCbHI,7;ACCb为负?
GOTO CHEK_A;否,检查ACCa
CALLNEG_B
CHEK_ABTFSS ACCaHI,7;ACCa为负?
RETLW 0;
ACCa和ACCb均为负,返回
GOTO NEG_A;ACCa为负,取补
GOTOMAIN
END
;程序结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 控制 电动自行车 驱动 系统 程序