单片机控制的电动自行车驱动系统程序.docx

上传人:b****9 文档编号:25543166 上传时间:2023-06-09 格式:DOCX 页数:23 大小:20.20KB
下载 相关 举报
单片机控制的电动自行车驱动系统程序.docx_第1页
第1页 / 共23页
单片机控制的电动自行车驱动系统程序.docx_第2页
第2页 / 共23页
单片机控制的电动自行车驱动系统程序.docx_第3页
第3页 / 共23页
单片机控制的电动自行车驱动系统程序.docx_第4页
第4页 / 共23页
单片机控制的电动自行车驱动系统程序.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

单片机控制的电动自行车驱动系统程序.docx

《单片机控制的电动自行车驱动系统程序.docx》由会员分享,可在线阅读,更多相关《单片机控制的电动自行车驱动系统程序.docx(23页珍藏版)》请在冰豆网上搜索。

单片机控制的电动自行车驱动系统程序.docx

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

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

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

;程序结束

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1