ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:20.20KB ,
资源ID:25543166      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25543166.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机控制的电动自行车驱动系统程序.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

2、Cd为运算用的寄存器ACCaHI ACCbLO ACCbHI ACCcLO ACCcHI ACCdLO ACCdHI TEMP ;临时寄存器TEMP1 ;临时寄存器(中断用)SIGN ;符号寄存器COUNT ;临时寄存器W_STACK ;中断时用于暂存W寄存器值ST_STACK ;中断时用于暂存STATUS寄存器值ENDC;*标志寄存器位定义以及程序中常数定义*CONSTANT VOLTAGE=0 ;采电池电压标志位CONSTANT PWM=1 ;输出下一次PWM信号标志位CONSTANT LOWPOWER=2 ;低电压标志位CONSTANT SHUTDOWN=3 ;刹车标志位CONSTANT

3、 OFF=4 ;复位标志位CONSTANT AND=0XE0 ;AND用于获取有效霍尔信号CONSTANT FULLPWM=0XFF ;当PWM输出全高时,输入CCPR1L中的值CONSTANT VOLOFFH=0X02 ;当电池电压低于24AH时, 低压保护2.86 V/31.5 VCONSTANT VOLOFFL=0X4ACONSTANT VOLONH=0X02 ;当电池电压大于266H时,允许电机重开3V/33VCONSTANT VOLONL=0X66CONSTANT TSONH=0X01 ;刹车后手柄复位值低于133H,则允许电机重新启动CONSTANT TSONL=0X33;*复位矢

4、量入口(单片机复位时,PC指针指向程序存储器0X0000单元)*ORG 0X0000START GOTO MAIN ;复位后程序进入主程序;*中断矢量入口程序(PIC单片机的中断矢量入口为0X0004)*ORG 0X0004 ;中断矢量入口BTFSC INTCON,RBIF ;是否为RB口电平变化中断? GOTO SAMPLERB ;是,进入RB口电平变化中断服务程序BTFSC PIR1,ADIF ;是否为AD采样中断GOTO AD ;是,进入AD中断服务程序BTFSC INTCON,INTF ;是否为刹车中断GOTO BRAKE ;是,刹车中断处理RETFIE ;如都不是,则中断返回;*逆变

5、桥输出控制表*;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电平有;效,其中RC1,RC2不作为触发电路输出口,故表中使其为高电平ORG 0X0020 ;表程序从0X0020单元开始存放(也可以不从这开始)OUT_TABLE ADDWF PCL,1RETLW 0X0AF ;如霍尔信号为0、0、0,则使RC4、RC6为低电平RETLW 0X0BE ;如霍尔信号为0、0、1,则使RC0、RC6为低电平RETLW 0X0FF ;没有为0、1、0的霍尔信号对应电机状态RETLW 0X07E ;如霍尔信号为0、1、1,则使RC0、RC7为低电平RETLW 0X

6、0CF ;如霍尔信号为1、0、0,则使RC4、RC5为低电平RETLW 0X0FF ;没有为1、0、1的霍尔信号对应电机状态RETLW 0X0D7 ;如霍尔信号为1、1、0则使RC3、RC5为低电平RETLW 0X077 ;如霍尔信号为1、1、1则使RC3、RC7为低电平;*主程序*ORG 0X0100 ;主程序从0X0100单元开始存储MAIN MOVLW 0X0FF ;由于C口上电复位值不确定,必须先关闭所有MOS管MOVWF PORTCBSF STATUS,RP0 ;选择存储体1MOVLW 0X02 ;设置RC1为输入口,其它为输出口,其中RC2为PWMMOVWF TRISC ;输出口,

7、其它位为触发信号输出BCF STATUS,RP0 ;选择存储体0CLRF PIR1 ;清所有中断标志位CLRF INTCON ;禁止所有中断MOVLW 0X01 ;设置TMR2预分频值为4MOVWF T2CONMOVLW FULLPWM ;初始化PWM工作循环寄存器,使PWM占空比为1MOVWF CCPR1L ;输出电压为零MOVLW 0XFF ;设置CCP1工作于PWM方式MOVWF CCP1CONMOVLW 0X0B ;CCP2工作于特殊事件触发方式,用作AD采样周期寄存 MOVWFCCP2CON ;器MOVLW 0X081 ;选择AD转换时钟为32分频,选择AN0通道,并使ADMOVWF

8、 ADCON0 ;转换允许CLRF TMR2 ;TMR2计数器清零CLRF TMR1H ;TMR1计数器清零CLRF TMR1LCLRF T1CON ;TMR1预分频为1,关闭振荡器,工作于定时工作方式MOVLW 0X08 ;初始化AD采样周期寄存器,T=512 sMOVWF CCPR2HMOVLW 0X00MOVWF CCPR2LBSF STATUS,RP0 ;选择存储体1MOVLW 0XEF ;RB口高3位用于采样霍尔信号,RB0为刹车中断,设置为MOVWF TRISB ;输入,其它未用MOVLW 0XC7 ;初始化PWM频率为5 kHzMOVWF PR2 MOVLW 0X082 ;AD采

9、样结果右移,RA口引脚均为模拟输入MOVWF ADCON1BSF OPTION_REG,INTEDG ;选择INT在下降沿产生中断BCF STATUS,RP0CALL SAMPLE ;确定当前转子位置CALL OUTPUT ;根据采得的状态值触发相应的MOSFETMOVLW 0X0D8 ;开总中断、外围中断、INT中断和RB口电平变化中断允MOVWF INTCON ;许BCF PIE2,CCP2IE ;CCP2中断禁止BSF PIE1,ADIE ;打开AD采样中断CLRF FLAG1 ;清标志位寄存器CLRF COUNT_VOL ;清电池电压采样计数器BSF T1CON,TMR1ON ;开CC

10、P2,对手柄进行等间隔采样BSF T2CON,TMR2ON ;开CCP1RETEST BTFSS FLAG1,PWM ;TS采样完毕?GOTO NEXT1 ;没有,转NEXT1CALL OUT_PWM ;TS采样完毕,送出相应的PWM信号BCF FLAG1,PWM ;清PWM允许标志NEXT1 BTFSS FLAG1,LOWPOWER;电压采样完毕?GOTO NEXT2 ;没有转NEXT2CALL POWER ;是,调用电压保护子程序处理数据BTFSC FLAG1,OFF ;是否需要复位?GOTO MAIN ;是,单片机复位NEXT2 BTFSS FLAG1,SHUTDOWN;刹车中断到来?G

11、OTO RETEST ;否,回转RETESTCALL BRAKEON ;是,调用刹车处理子程序CLRWDTBTFSC FLAG1,OFF ;OFF=0?GOTO MAIN ;否,单片机复位GOTO RETEST ;是,回转RETEST;*刹车处理子程序*BRAKEON BCF FLAG1,OFF ;清复位标志BCF FLAG1,SHUTDOWN;是,清相应标志位BTFSS PORTB,0 ;INT引脚仍为1?RETURN ;否,中断是由干扰引起的,返回BSF STATUS,RP0BCF PIE1,ADIE ;禁止AD采样中断BCF STATUS,RP0BCF INTCON,INTE ;关RB0

12、中断MOVLW FULLPWM ;PWM输出全高MOVWF CCPR1LBCF T1CON,TMR1ON ;关闭手柄采样BREAK2 BTFSC ADCON0,GO ;正在进行AD采样?GOTO BREAK2 ;是,等待AD采样完毕BCF ADCON0,CHS0BCF ADCON0,CHS1 ;选择0采样通道,准备采样手柄电压BCF PIR1,ADIF ;清AD采样中断标志位MOVLW 0X06 ;延时MOVWF COUNTBREAK3 DECFSZ COUNTGOTO BREAK3BREAK5 BSF ADCON0,GO ;采样TS值BREAK4 BTFSS PIR1,ADIF ;采样完毕?

13、GOTO BREAK4BCF PIR1,ADIFBCF STATUS,C MOVF ADRESH,0 ;当前TS值送被减数MOVWF ACCbHIBSF STATUS,RP0MOVF ADRESL,0BCF STATUS,RP0MOVWF ACCbLOMOVLW TSONH ;1.5 V所对应的采样值送减数MOVWF ACCaHIMOVLW TSONLMOVWF ACCaLOCALL D_sub ;当前TS值减1.5VMOVLW FULLPWMMOVWF CCPR1LCLRWDTBTFSS ACCbHI,7 ;当前电压值大于1.5V?GOTO BREAK5 ;是,重新采样BTFSC PORTB

14、,0GOTO BREAK5BSF FLAG1,OFF ;否,置相应的标志位RETURN ;返回 ;*开环PWM输出子程序*OUT_PWM BCF FLAG1,PWM ;清相应的标志位MOVF TSH,0 ;将调速手柄采样值送至被加数MOVWF ACCaHIMOVF TSL,0MOVWF ACCaLOMOVLW 0XFF ;FF1F补码为0XE1,即1.1 VMOVWF ACCbHIMOVLW 0X1F MOVWF ACCbLOCALL D_addBTFSS ACCbHI,7 ;TS1.1V?GOTO PWM1 ;是,转PWM1MOVLW FULLPWM ;否则输出全高MOVWF CCPR1LR

15、ETURNPWM1 MOVLW 0XFD ;0X27B=3.1VMOVWF ACCbHIMOVLW 0X85MOVWF ACCbLOCALL D_addBTFSC ACCbHI,7 ;TS3.1V?GOTO PWM3PWM2 CLRF CCPR1LBCF CCP1CON,4BCF CCP1CON,5RETURNPWM3 MOVLW 0X0FF ;1.1 V对应的采样值补码送加数 MOVWF ACCbHI MOVLW 0X1FMOVWF ACCbLOCALL D_add ;TS-1.1VCLRF ACCaHI ;系数K=56=38H送乘数MOVLW 0X3FMOVWF ACCaLOCALL D_

16、mpy ;得到放大128倍的低电平时间K*(TS-1.1V)MOVF ACCcHI,0 ;将结果取出MOVWF ACCaHIMOVF ACCcLO,0MOVWF ACCaLO MOVLW 0X64 ;PWM周期T减去低电平时间,得到高电平时间MOVWF ACCbHICLRF ACCbLO CALL D_sub BTFSC ACCbHI,7 ;低电平时间是否大于周期?GOTO PWM2 ;是,输出全压RLF ACCbLO ;否则,输出与低电平时间对应的高电平时间RLF ACCbHIMOVF ACCbHI,0 ;D10D2位送CCPR1LMOVWF CCPR1LBCF CCP1CON,5 ;D0位

17、送CCP1CON5BTFSC ACCbLO,7BSF CCP1CON,5BCF CCP1CON,4 ;D.1位送CCP1CON4 BTFSC ACCbLO,6BSF CCP1CON,4RETURN ;返回;*刹车中断服务程序*BRAKE CALL PUSH ;保存现场BCF STATUS,RP0 ;回存储区0BSF FLAG1,SHUTDOWN;置相应标志位BCF INTCON,INTF ;清中断标志位CALL POP ;恢复现场RETFIE ;中断返回;*低电压保护处理子程序*POWER BCF FLAG1,LOWPOWER;清相应的标志位MOVF VOLTAGEH,0MOVWF ACCaH

18、IMOVF VOLTAGEL,0MOVWF ACCaLOMOVLW VOLOFFHMOVWF ACCbHIMOVLW VOLOFFLMOVWF ACCbLOCALL D_subBTFSC ACCbLO,7 ;判断当前电池电压值是否低于保护电压(32V)RETURN ;不是,返回BCF INTCON,INTEBCF T1CON,TMR1ON ;关闭电流采样MOVLW FULLPWMMOVWF CCPR1LBSF STATUS,RP0BCF PIE1,ADIE ;禁止AD采样中断BCF STATUS,RP0POWER3 BTFSC ADCON0,GO ;正在进行AD采样?GOTO POWER3 ;

19、是,等待AD采样完毕BCF PIR1,ADIF ;清AD采样中断标志位BCF ADCON0,CHS0BSF ADCON0,CHS1 ;选择电压采样通道MOVLW 0X06 ;延时等待通道转换完成MOVWF COUNTPOWER4 DECFSZ COUNTGOTO POWER4POWER6 BSF ADCON0,GO ;采样电池电压值POWER5 BTFSS PIR1,ADIF ;采样完毕?GOTO POWER5BCF PIR1,ADIF ;清AD中断标志位BCF STATUS,CMOVF ADRESH,0 ;当前电压值送被加数MOVWF ACCbHIBSF STATUS,RP0MOVF ADR

20、ESL,0BCF STATUS,RP0MOVWF ACCbLOMOVLW VOLONH ;35V电压值送被加数MOVWF ACCaHIMOVLW VOLONLMOVWF ACCaLOCALL D_sub ;当前电压值减35,与重开电压进行比较MOVLW FULLPWMMOVWF CCPR1LCLRWDTBTFSC ACCbHI,7 ;当前电压值大于35?GOTO POWER6 ;否,重新采样BSF FLAG1,OFF ;是,置相应的标志位RETURN ;返回;*电机转子位置采样子程序,状态采样子程序,出口地址:STATE1*SAMPLE MOVLW AND ;读RB口ANDWF PORTB,0

21、 ;分离出有效信息MOVWF STATE1 ;暂存状态值MOVLW 0X08MOVWF DELAYDEL1 DECFSZ DELAY ;延时6 sGOTO DEL1MOVLW AND ;读RB口ANDWF PORTB,0 ;分离出有效信息,并暂存MOVWF STATE2XORWF STATE1,0 ;与上一次状态值相异或BTFSC STATUS,ZRETURN ;两个状态值相等则返回MOVLW 0X06 ;否则延时4 sMOVWF DELAYDEL2 DECFSZ DELAYGOTO DEL2MOVLW AND ;读RB口ANDWF PORTB,0 ;提取有效信息并暂存MOVWF STATE3

22、XORWF STATE1,0 ;与第一次状态相同吗?BTFSC STATUS,ZRETURN ;相同则返回MOVF STATE2,0 ;否则再与第二次状态相比较XORWF STATE3,0BTFSS STATUS,Z GOTO SAMPLE ;三次状态均不相同则重新采样MOVF STATE2,0 ;第三次状态与第二次相同,则将正确状态赋予STATE1并MOVWF STATE1 ;返回RETURN;* MOSFET触发信号输出子程序*OUTPUT SWAPF STATE1,1 ;STATE1寄存器高低半字节互换BCF STATUS,C ;清C位,并将STATE1寄存器左移一位RRF STATE1

23、,0 ;将采样所得结果放至W低三位CALL OUT_TABLE ;查表获得输出值MOVWF PORTC ;将输出值输出至RC口RETURN;* RB口电平变化中断服务程序*SAMPRB CALL PUSH ;现场保护 BCF STATUS,RP0CALL SAMPLE ;采样RB口状态CALL OUTPUT ;根据RB口状态触发相应的MOSFETCALL POP ;恢复现场BCF INTCON,RBIF ;清RB口电平变化中断标志RETFIE ;中断返回;* AD采样中断服务程序*AD CALL PUSH ;保护现场BTFSC FLAG1,VOLTAGE ;是电压采样?GOTO SET_VOL

24、 ;是,作相应的处理SET_TS BCF ADCON0,CHS0 ;AD采样值是TS,则选择1采样通道INCF COUNT_VOL ;电压采样周期寄存器值加1BTFSS STATUS,Z ;电压采样周期到?GOTO AD4BCF ADCON0,CHS0 ;是,选择2采样通道BSF ADCON0,CHS1BSF FLAG1,VOLTAGE ;置相应的标志位AD4 BCF PIR1,ADIF ;清AD中断标志MOVF ADRESH,0 ;采样值送寄存器暂存MOVWF TSHBSF STATUS,RP0MOVF ADRESL,0BCF STATUS,RP0MOVWF TSLBSF FLAG1,PWM

25、BTFSS FLAG1,VOLTAGE ;是否需要进行电压采样?GOTO AD6MOVLW 0X05 ;是,延时后采样电压MOVWF TEMP1AD5 DECFSZ TEMP1GOTO AD5BSF ADCON0,GOAD6 CALL POP ;恢复现场,中断返回RETFIESET_VOL BCF ADCON0,CHS1 ;如果采样值为电压值,则选择0通道BCF ADCON0,CHS0BCF PIR1,ADIF ;清中断标志位BCF FLAG1,VOLTAGE ;清相应标志位MOVF ADRESH,0 ;将采样结果放入被减数寄存器MOVWF VOLTAGEHBSF STATUS,RP0MOVF

26、 ADRESL,0BCF STATUS,RP0MOVWF VOLTAGELBSF FLAG1,LOWPOWER;是,置相应标志位CALL POP ;中断返回RETFIE;*中断保护现场子程序*PUSH MOVWF W_STACK ;暂存W寄存器MOVF STATUS,0 ;暂存STATUS寄存器MOVWF ST_STACKRETURN ;子程序返回;*中断恢复现场子程序*POP MOVF ST_STACK,0 ;恢复STATUS寄存器值MOVWF STATUSMOVF W_STACK,0 ;恢复W寄存器值RETURN ;子程序返回;*初始化子程序*SETUP MOVLW .15 ;初始化TEM

27、PMOVWF TEMPMOVF ACCbHI,0 ;ACCb送ACCdMOVWF ACCdHIMOVF ACCbLO,0MOVWF ACCdLOCLRF ACCbHI ;清ACCbCLRF ACCbLORETLW 0;*乘除法运算确定结果符号子程序*S_SIGN MOVF ACCaHI,0 ;ACCaHI异或ACCbHI,结果送SIGN单元XORWF ACCbHI,0MOVWF SIGN BTFSS ACCbHI,7 ;ACCb为负?GOTO CHEK_A ;否,检查ACCaCALL NEG_BCHEK_A BTFSS ACCaHI,7 ;ACCa为负?RETLW 0 ;ACCa和ACCb均为负,返回GOTO NEG_A ;ACCa为负,取补GOTO MAINEND ;程序结束

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

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