资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第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为运算用的寄存器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.5 VCONSTANTVOLOFFL=0X4ACONSTANTVOLONH=0X02;当电池电压大于266H时,允许电机重开3V/33VCONSTANTVOLONL=0X66CONSTANTTSONH=0X01;刹车后手柄复位值低于133H,则允许电机重新启动CONSTANTTSONL=0X33;*复位矢量入口(单片机复位时,PC指针指向程序存储器0X0000单元)*ORG0X0000STARTGOTOMAIN;复位后程序进入主程序;*中断矢量入口程序(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_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;如霍尔信号为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预分频值为4MOVWFT2CONMOVLWFULLPWM;初始化PWM工作循环寄存器,使PWM占空比为1MOVWFCCPR1L;输出电压为零MOVLW0XFF;设置CCP1工作于PWM方式MOVWFCCP1CONMOVLW0X0B;CCP2工作于特殊事件触发方式,用作AD采样周期寄存MOVWFCCP2CON;器MOVLW0X081;选择AD转换时钟为32分频,选择AN0通道,并使ADMOVWFADCON0;转换允许CLRFTMR2;TMR2计数器清零CLRFTMR1H;TMR1计数器清零CLRFTMR1LCLRFT1CON;TMR1预分频为1,关闭振荡器,工作于定时工作方式MOVLW0X08;初始化AD采样周期寄存器,T=512 sMOVWFCCPR2HMOVLW0X00MOVWFCCPR2LBSFSTATUS,RP0;选择存储体1MOVLW0XEF;RB口高3位用于采样霍尔信号,RB0为刹车中断,设置为MOVWFTRISB;输入,其它未用MOVLW0XC7;初始化PWM频率为5 kHzMOVWFPR2MOVLW0X082;AD采样结果右移,RA口引脚均为模拟输入MOVWFADCON1BSFOPTION_REG,INTEDG ;选择INT在下降沿产生中断BCFSTATUS,RP0CALLSAMPLE;确定当前转子位置CALLOUTPUT;根据采得的状态值触发相应的MOSFETMOVLW0X0D8;开总中断、外围中断、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;电压采样完毕?GOTONEXT2;没有转NEXT2CALLPOWER;是,调用电压保护子程序处理数据BTFSCFLAG1,OFF;是否需要复位?GOTOMAIN;是,单片机复位NEXT2BTFSSFLAG1,SHUTDOWN;刹车中断到来?GOTORETEST;否,回转RETESTCALLBRAKEON;是,调用刹车处理子程序CLRWDTBTFSCFLAG1,OFF;OFF=0?GOTOMAIN;否,单片机复位GOTORETEST;是,回转RETEST;*刹车处理子程序*BRAKEONBCFFLAG1,OFF;清复位标志BCFFLAG1,SHUTDOWN;是,清相应标志位BTFSSPORTB,0;INT引脚仍为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;延时MOVWFCOUNTBREAK3DECFSZCOUNTGOTOBREAK3BREAK5BSFADCON0,GO;采样TS值BREAK4BTFSSPIR1,ADIF;采样完毕?GOTOBREAK4BCFPIR1,ADIFBCFSTATUS,CMOVFADRESH,0;当前TS值送被减数MOVWFACCbHIBSFSTATUS,RP0MOVFADRESL,0BCFSTATUS,RP0MOVWFACCbLOMOVLWTSONH;1.5 V所对应的采样值送减数MOVWFACCaHIMOVLWTSONLMOVWFACCaLOCALLD_sub;当前TS值减1.5VMOVLWFULLPWMMOVWFCCPR1LCLRWDTBTFSSACCbHI,7;当前电压值大于1.5V?GOTOBREAK5;是,重新采样BTFSCPORTB,0GOTOBREAK5BSFFLAG1,OFF;否,置相应的标志位RETURN;返回
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号