16F876控制电动自行车驱动源程序.docx

上传人:b****8 文档编号:10447703 上传时间:2023-02-11 格式:DOCX 页数:18 大小:20.49KB
下载 相关 举报
16F876控制电动自行车驱动源程序.docx_第1页
第1页 / 共18页
16F876控制电动自行车驱动源程序.docx_第2页
第2页 / 共18页
16F876控制电动自行车驱动源程序.docx_第3页
第3页 / 共18页
16F876控制电动自行车驱动源程序.docx_第4页
第4页 / 共18页
16F876控制电动自行车驱动源程序.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

16F876控制电动自行车驱动源程序.docx

《16F876控制电动自行车驱动源程序.docx》由会员分享,可在线阅读,更多相关《16F876控制电动自行车驱动源程序.docx(18页珍藏版)》请在冰豆网上搜索。

16F876控制电动自行车驱动源程序.docx

16F876控制电动自行车驱动源程序

16F876控制电动自行车驱动源程序

[日期:

2010-01-30][来源:

本站原创作者:

admin][字体:

大中小](投递新闻)

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.86V/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采样周期寄存MOVWFCCP2CON;器

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

MOVWFTEMP

MOVFACCbHI,0;ACCb送ACCd

MOVWFACCdHI

MOVFACCbLO,0

MOVWFACCdLO

CLRFACCbHI;清ACCb

CLRFACCbLO

RETLW0

;**********乘除法运算确定结果符号子程序**********

S_SIGNMOVFACCaHI,0;ACCaHI异或ACCbHI,结果送SIGN单元

XORWFACCbHI,0

MOV

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

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

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

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