第章单片机控制的电动自行车驱动系统_第1页
第章单片机控制的电动自行车驱动系统_第2页
第章单片机控制的电动自行车驱动系统_第3页
第章单片机控制的电动自行车驱动系统_第4页
第章单片机控制的电动自行车驱动系统_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第14章 单片机控制的电动自行车驱动系统14.4.4 各部分程序LISTP=16F876#INCLUDE P16F876.INC;以下采用块定义的方法定义单片机内部寄存器CBLOCK0X20;自定义寄存器从0X20开始FLAG1;FLAG1作为标志寄存器VOLTAGEH;电池电压高位寄存器VOLTAGEL;电池电压低位寄存器TSH;手柄电压高位寄存器TSL;手柄电压低位寄存器STATE1;霍尔信号采样暂存器1STATE2;霍尔信号采样暂存器2STATE3;霍尔信号采样暂存器3DELAY;延时计数器COUNT_VOL;低电压采样次数计数器ACCaLO ;ACCaACCd为运算用的寄存器ACCaH

2、I 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=0X

3、E0;AND用于获取有效霍尔信号CONSTANTFULLPWM=0XFF;当PWM输出全高时,输入CCPR1L中的值CONSTANTVOLOFFH=0X02;当电池电压低于24AH时, 低压保护2.86 V/31.5 VCONSTANTVOLOFFL=0X4ACONSTANTVOLONH=0X02;当电池电压大于266H时,允许电机重开3V/33VCONSTANTVOLONL=0X66CONSTANTTSONH=0X01;刹车后手柄复位值低于133H,则允许电机重新启动CONSTANTTSONL=0X33;*复位矢量入口(单片机复位时,PC指针指向程序存储器0X0000单元)*ORG0X000

4、0STARTGOTOMAIN;复位后程序进入主程序;*中断矢量入口程序(PIC单片机的中断矢量入口为0X0004)*ORG0X0004;中断矢量入口BTFSCINTCON,RBIF;是否为RB口电平变化中断?GOTOSAMPLERB;是,进入RB口电平变化中断服务程序BTFSCPIR1,ADIF;是否为AD采样中断GOTOAD;是,进入AD中断服务程序BTFSCINTCON,INTF;是否为刹车中断GOTOBRAKE;是,刹车中断处理RETFIE;如都不是,则中断返回;*逆变桥输出控制表*;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电平有;效,其中

5、RC1,RC2不作为触发电路输出口,故表中使其为高电平ORG0X0020;表程序从0X0020单元开始存放(也可以不从这开始)OUT_TABLEADDWFPCL,1RETLW0X0AF;如霍尔信号为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;如霍尔

6、信号为1、1、0则使RC3、RC5为低电平RETLW0X077;如霍尔信号为1、1、1则使RC3、RC7为低电平;*主程序*ORG0X0100;主程序从0X0100单元开始存储MAINMOVLW0X0FF;由于C口上电复位值不确定,必须先关闭所有MOS管MOVWFPORTCBSFSTATUS,RP0;选择存储体1MOVLW0X02;设置RC1为输入口,其它为输出口,其中RC2为PWM MOVWFTRISC;输出口,其它位为触发信号输出BCFSTATUS,RP0;选择存储体0CLRFPIR1;清所有中断标志位CLRFINTCON;禁止所有中断MOVLW0X01;设置TMR2预分频值为4MOVWF

7、T2CONMOVLWFULLPWM;初始化PWM工作循环寄存器,使PWM占空比为1MOVWFCCPR1L;输出电压为零MOVLW0XFF;设置CCP1工作于PWM方式MOVWFCCP1CONMOVLW0X0B;CCP2工作于特殊事件触发方式,用作AD采样周期寄存MOVWFCCP2CON;器MOVLW0X081;选择AD转换时钟为32分频,选择AN0通道,并使ADMOVWFADCON0;转换允许CLRFTMR2;TMR2计数器清零CLRFTMR1H;TMR1计数器清零CLRFTMR1LCLRFT1CON;TMR1预分频为1,关闭振荡器,工作于定时工作方式MOVLW0X08;初始化AD采样周期寄存

8、器,T=512 sMOVWFCCPR2HMOVLW0X00MOVWFCCPR2LBSFSTATUS,RP0;选择存储体1MOVLW0XEF;RB口高3位用于采样霍尔信号,RB0为刹车中断,设置为MOVWFTRISB;输入,其它未用MOVLW0XC7;初始化PWM频率为5 kHzMOVWFPR2MOVLW0X082;AD采样结果右移,RA口引脚均为模拟输入MOVWFADCON1BSFOPTION_REG,INTEDG ;选择INT在下降沿产生中断BCFSTATUS,RP0CALLSAMPLE;确定当前转子位置CALLOUTPUT;根据采得的状态值触发相应的MOSFETMOVLW0X0D8;开总中

9、断、外围中断、INT中断和RB口电平变化中断允MOVWFINTCON;许BCFPIE2,CCP2IE;CCP2中断禁止BSFPIE1,ADIE;打开AD采样中断CLRFFLAG1;清标志位寄存器CLRFCOUNT_VOL;清电池电压采样计数器BSFT1CON,TMR1ON;开CCP2,对手柄进行等间隔采样BSFT2CON,TMR2ON;开CCP1RETESTBTFSSFLAG1,PWM;TS采样完毕?GOTONEXT1;没有,转NEXT1CALLOUT_PWM;TS采样完毕,送出相应的PWM信号BCFFLAG1,PWM;清PWM允许标志NEXT1BTFSSFLAG1,LOWPOWER;电压采样

10、完毕?GOTONEXT2;没有转NEXT2CALLPOWER;是,调用电压保护子程序处理数据BTFSCFLAG1,OFF;是否需要复位?GOTOMAIN;是,单片机复位NEXT2BTFSSFLAG1,SHUTDOWN;刹车中断到来?GOTORETEST;否,回转RETESTCALLBRAKEON;是,调用刹车处理子程序CLRWDTBTFSCFLAG1,OFF;OFF=0?GOTOMAIN;否,单片机复位GOTORETEST;是,回转RETEST;*刹车处理子程序*BRAKEONBCFFLAG1,OFF;清复位标志BCFFLAG1,SHUTDOWN;是,清相应标志位BTFSSPORTB,0;IN

11、T引脚仍为1?RETURN;否,中断是由干扰引起的,返回BSFSTATUS,RP0BCFPIE1,ADIE;禁止AD采样中断BCFSTATUS,RP0BCFINTCON,INTE;关RB0中断MOVLWFULLPWM;PWM输出全高MOVWFCCPR1LBCFT1CON,TMR1ON;关闭手柄采样BREAK2BTFSCADCON0,GO;正在进行AD采样?GOTOBREAK2;是,等待AD采样完毕BCFADCON0,CHS0BCFADCON0,CHS1;选择0采样通道,准备采样手柄电压BCFPIR1,ADIF;清AD采样中断标志位MOVLW0X06;延时MOVWFCOUNTBREAK3DECF

12、SZCOUNTGOTOBREAK3BREAK5BSFADCON0,GO;采样TS值BREAK4BTFSSPIR1,ADIF;采样完毕?GOTOBREAK4BCFPIR1,ADIFBCFSTATUS,CMOVFADRESH,0;当前TS值送被减数MOVWFACCbHIBSFSTATUS,RP0MOVFADRESL,0BCFSTATUS,RP0MOVWFACCbLOMOVLWTSONH;1.5 V所对应的采样值送减数MOVWFACCaHIMOVLWTSONLMOVWFACCaLOCALLD_sub;当前TS值减1.5VMOVLWFULLPWMMOVWFCCPR1LCLRWDTBTFSSACCbHI

13、,7;当前电压值大于1.5V?GOTOBREAK5;是,重新采样BTFSCPORTB,0GOTOBREAK5BSFFLAG1,OFF;否,置相应的标志位RETURN;返回;*开环PWM输出子程序*OUT_PWMBCFFLAG1,PWM;清相应的标志位MOVFTSH,0;将调速手柄采样值送至被加数MOVWFACCaHIMOVFTSL,0MOVWFACCaLOMOVLW0XFF;FF1F补码为0XE1,即1.1 VMOVWFACCbHIMOVLW0X1FMOVWFACCbLOCALLD_addBTFSSACCbHI,7;TS1.1V?GOTOPWM1;是,转PWM1MOVLWFULLPWM;否则输

14、出全高MOVWFCCPR1LRETURNPWM1MOVLW0XFD;0X27B=3.1VMOVWFACCbHIMOVLW0X85MOVWFACCbLOCALLD_addBTFSCACCbHI,7;TS3.1V?GOTOPWM3PWM2CLRFCCPR1LBCFCCP1CON,4BCFCCP1CON,5RETURNPWM3MOVLW0X0FF;1.1 V对应的采样值补码送加数MOVWFACCbHIMOVLW0X1FMOVWFACCbLOCALLD_add;TS-1.1VCLRFACCaHI;系数K=56=38H送乘数MOVLW0X3FMOVWFACCaLOCALLD_mpy;得到放大128倍的低

15、电平时间K*(TS-1.1V)MOVFACCcHI,0;将结果取出MOVWFACCaHIMOVFACCcLO,0MOVWFACCaLOMOVLW0X64;PWM周期T减去低电平时间,得到高电平时间MOVWFACCbHICLRFACCbLO CALLD_subBTFSCACCbHI,7;低电平时间是否大于周期?GOTOPWM2;是,输出全压RLFACCbLO;否则,输出与低电平时间对应的高电平时间RLFACCbHIMOVFACCbHI,0;D10D2位送CCPR1LMOVWFCCPR1LBCFCCP1CON,5;D0位送CCP1CON5BTFSCACCbLO,7BSFCCP1CON,5BCFCC

16、P1CON,4;D.1位送CCP1CON4BTFSCACCbLO,6BSFCCP1CON,4RETURN;返回;*刹车中断服务程序*BRAKECALLPUSH;保存现场BCFSTATUS,RP0;回存储区0BSFFLAG1,SHUTDOWN;置相应标志位BCFINTCON,INTF;清中断标志位CALLPOP;恢复现场RETFIE;中断返回;*低电压保护处理子程序*POWERBCFFLAG1,LOWPOWER;清相应的标志位MOVFVOLTAGEH,0MOVWFACCaHIMOVFVOLTAGEL,0MOVWFACCaLOMOVLWVOLOFFHMOVWFACCbHIMOVLWVOLOFFLM

17、OVWFACCbLOCALLD_subBTFSCACCbLO,7;判断当前电池电压值是否低于保护电压(32V)RETURN;不是,返回BCFINTCON,INTEBCFT1CON,TMR1ON;关闭电流采样MOVLWFULLPWMMOVWFCCPR1LBSFSTATUS,RP0BCFPIE1,ADIE;禁止AD采样中断BCFSTATUS,RP0POWER3BTFSCADCON0,GO;正在进行AD采样?GOTOPOWER3;是,等待AD采样完毕BCFPIR1,ADIF;清AD采样中断标志位BCFADCON0,CHS0BSFADCON0,CHS1;选择电压采样通道MOVLW0X06;延时等待通道

18、转换完成MOVWFCOUNTPOWER4DECFSZCOUNTGOTOPOWER4POWER6BSFADCON0,GO;采样电池电压值POWER5BTFSSPIR1,ADIF;采样完毕?GOTOPOWER5BCFPIR1,ADIF;清AD中断标志位BCFSTATUS,CMOVFADRESH,0;当前电压值送被加数MOVWFACCbHIBSFSTATUS,RP0MOVFADRESL,0BCFSTATUS,RP0MOVWFACCbLOMOVLWVOLONH;35V电压值送被加数MOVWFACCaHIMOVLWVOLONLMOVWFACCaLOCALLD_sub;当前电压值减35,与重开电压进行比较

19、MOVLWFULLPWMMOVWFCCPR1LCLRWDTBTFSCACCbHI,7;当前电压值大于35?GOTOPOWER6;否,重新采样BSFFLAG1,OFF;是,置相应的标志位RETURN;返回;*电机转子位置采样子程序,状态采样子程序,出口地址:STATE1*SAMPLEMOVLWAND;读RB口ANDWFPORTB,0;分离出有效信息MOVWFSTATE1;暂存状态值MOVLW0X08MOVWFDELAYDEL1DECFSZDELAY;延时6 sGOTODEL1MOVLWAND;读RB口ANDWFPORTB,0;分离出有效信息,并暂存MOVWFSTATE2XORWFSTATE1,0

20、;与上一次状态值相异或BTFSCSTATUS,ZRETURN;两个状态值相等则返回MOVLW0X06;否则延时4 sMOVWFDELAYDEL2DECFSZDELAYGOTODEL2MOVLWAND;读RB口ANDWFPORTB,0;提取有效信息并暂存MOVWFSTATE3XORWFSTATE1,0;与第一次状态相同吗?BTFSCSTATUS,ZRETURN;相同则返回MOVFSTATE2,0;否则再与第二次状态相比较XORWFSTATE3,0BTFSSSTATUS,ZGOTOSAMPLE;三次状态均不相同则重新采样MOVFSTATE2,0;第三次状态与第二次相同,则将正确状态赋予STATE1

21、并MOVWFSTATE1;返回RETURN;* MOSFET触发信号输出子程序*OUTPUTSWAPFSTATE1,1;STATE1寄存器高低半字节互换BCFSTATUS,C;清C位,并将STATE1寄存器左移一位RRFSTATE1,0;将采样所得结果放至W低三位CALLOUT_TABLE;查表获得输出值MOVWFPORTC;将输出值输出至RC口RETURN;* RB口电平变化中断服务程序*SAMPRBCALLPUSH;现场保护 BCFSTATUS,RP0CALLSAMPLE;采样RB口状态CALLOUTPUT;根据RB口状态触发相应的MOSFETCALLPOP;恢复现场BCFINTCON,R

22、BIF;清RB口电平变化中断标志RETFIE;中断返回;* AD采样中断服务程序*ADCALLPUSH;保护现场BTFSCFLAG1,VOLTAGE;是电压采样?GOTOSET_VOL;是,作相应的处理SET_TSBCFADCON0,CHS0;AD采样值是TS,则选择1采样通道INCFCOUNT_VOL;电压采样周期寄存器值加1BTFSSSTATUS,Z;电压采样周期到?GOTOAD4BCFADCON0,CHS0;是,选择2采样通道BSFADCON0,CHS1BSFFLAG1,VOLTAGE;置相应的标志位AD4BCFPIR1,ADIF;清AD中断标志MOVFADRESH,0;采样值送寄存器暂存MOVWFTSHBSFSTATUS,RP0MOVFADRESL,0BCFSTATUS,RP0MOVWFTSLBSFFLAG1,PWMBTFSSFLAG1,VOLTAGE;是否需要进行电压采样?GOTOAD6MOVLW0X05;是,延时后采样电压MOVWFTEMP1AD5DECFSZTEMP1GOTOAD5BSFADCON0,GOAD6CALLPOP;恢复现场,中断返回RETFIESET

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论