PIC16F72单片机控制的电动自行车C源程序

上传人:cn****1 文档编号:548060170 上传时间:2023-09-18 格式:DOCX 页数:4 大小:19.68KB
返回 下载 相关 举报
PIC16F72单片机控制的电动自行车C源程序_第1页
第1页 / 共4页
PIC16F72单片机控制的电动自行车C源程序_第2页
第2页 / 共4页
PIC16F72单片机控制的电动自行车C源程序_第3页
第3页 / 共4页
PIC16F72单片机控制的电动自行车C源程序_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《PIC16F72单片机控制的电动自行车C源程序》由会员分享,可在线阅读,更多相关《PIC16F72单片机控制的电动自行车C源程序(4页珍藏版)》请在金锄头文库上搜索。

1、PIC16F72单片机控制的电动自行车C源程序2008-02-2115:35第一单片机?PIC单片机?PIC16F72单片机控制的电动自行车C源程序,原理图及设计说明2007-7-1712:21mcubestPIC16F72单片机控制的电动自行车C源程序,原理图及设计说明table=98%trtdcolor=blackuPIC16F72单片机控制的电动自行车C源程序,原理图及设计说明/u/color/td/trtrtdtable=95%trtdPIC16F72单片机控制的电动自行车驱动系统C程序PIC单片机控制的电动自行车驱动系统C程序.46.#include/电动车双闭环程序,采用双闭环方式

2、控制电机,以得到最好的zh转速性能,并且可以/限制电机的最大电流。本应用程序用到两个ccp部件,其中CCP1用于pwM俞出,以控/制电机电压;CCP2用于触发AD,定时器TMR2TMR1INT中断,RB口电平变化中断,/看门狗以及6个通用I/O口#defineAND0xe0/状态采集5,6,7位#defineCURA0X0a/电流环比例和积分系数之和#defineCURB0X09/电流环比例系数#defineTHL0X6400/电流环最大输出#defineFULLDUTY0X0FF/占空比为1时的高电平时间#defineSPEA0X1d/转速环比例和积分系数之和#defineSPEB0X1c/

3、转速环比例系数#defineGCURHILO0X0330/转速环最大输出#defineGCURH0X33/最大给定电流#defineGSPEH0X67/最大转速给定#defineTSON0X38/手柄开启电压1.1V,TSON*2为刹车后手柄开启电压,即/2.2V#defineVOLON0X4c/低电压保护重开电压3.0V即33V#defineVOLOFF0X49/低电压保护关断电压2.86V即31.5VvolatileunsignedcharDELAYH,DELAYL,oldstate,speed,speedcount,tsh,count_ts,count_vol,gcur,currenth

4、,voltage;/寄存器定义staticbitsp1,spe,ts,volflag,spepid,lowpower,off,shutdown,curpid;/标志位定义staticvolatileunsignedcharnew10=0xaf,0xbe,0xff,0x7e,0xcf,0xff,0xd7,0x77,0xff,0xff;/状态寄存器表/PIC16F877初始化子程序voidINIT877()PORTC=OXOFF;/关断所有MOSFETTRISC=0X02;/设置C口输出PIE仁0X00;/中断寄存器初始化,关断所有中断TRISA=0XCF;/设置RA4,RA5输出TRISB=0X

5、EF;/RB口高三位输入,采集电机三相的霍尔信号PORTC=new(PORTB&AND)5;采集第一次霍尔信号,并输出相应的信号,导通/两个MOS管T2CON=0X01;/TMR24分频CCPR1L=0X0FF;/初始时PWM俞出全高CCP1CON=0X0FF;/CCP设置为PWM方式CCP2CON=0X0B;/CCP设置为特殊方式,以触发ADADCON0=0X81;/AD时钟为32分频,且AD使能,选择AN0通道采集手/柄电压TMR2=0X00;/TMR2寄存器初始化TMR1H=0X00;/TMR1寄存器初始化TMR1L=0X00;T1CON=0X00;/TMR1为1分频CCPR2H=0X0

6、8;CCPR2L=0X00;/电流采样周期设置为TAD=512卩sPR2=0XC7;/PWM频率设置为5kHzADCON仁0X02;/AD结果左移OPTION=0XFB;/INT上升沿触发TMR2ON=1;/PWMff始工作INTCON=0XD8;中断设置GIE=1,PEIE=1,RBIE=1ADIE=1;/AD中断使能speedcount=0x00;/转速计数寄存器speed=0x7f;/转速保持寄存器spe=1;/低速标志位sp仁1;/低速标志位oldstate=0x0ff;/初始状态设置,区别于其他状态count_ts=0x08;/电流采样8次,采集1次手柄count_vol=0x00;

7、/采样256次手柄,采集1次电池电压ts=1;/可以采集手柄值的标志位ADGO=1;/AD采样使能TMR1ON=1;/CCP2部件开始工作/延时子程序#pragmainterrupt_level1voidDELAY1(x)charx;DELAYH=x;/延时参数设置#asmDELAY2MOVLW0X06MOVWF_DELAYLDELAY1DECFSZ_DELAYLGOTODELAY1DECFSZ_DELAYHGOTODELAY2#endasm/状态采集子程序voidsample()charstate1,state2,state3,x;dox=1;state1=(PORTB&AND);/霍尔信号

8、采集DELAY1(x);state2=(PORTB&AND);while(state1-state2);/当三次采样结果不相同时继续采集状态if(state1-oldstate!=0)/看本次采样结果是否与上次相同,不同/则执行oldstate=state1;/将本次状态设置为旧状态state1=(oldstate5);PORTC=newstate1;C口输出相应的信号触发两个MOS管if(sp1=1)spe=1;sp1=0;else/如果转速很低,则spe置1spe=0;sp1=0;speedcount2);/否则,spe=0,计转速speed=speedcount+state3;/spee

9、d寄存器为每256卩s力卩1speedcount=0;/AD采样子程序voidAD()charx;ADIF=0;/清AD中断标志位if(ts=1)/如果为手柄采样,则采样手柄值CHS0=1;/选择电流采样通道count_vol=count_vol+1;/电池采样计数寄存器spepid=1;/置转速闭环运算标志ts=O;tsh=ADRESH;/存手柄值if(count_vol=0)/如果电池采样时间到,则选择AN2通道,采集电池电压CHS0=0;CHS1=1;volflag=1;x=1;DELAY1(x);ADGO=1;elseif(volflag=1)/电池采样完毕,进行相应的处理CHS1=0

10、;CHS0=1;volflag=0;voltage=ADRESH;lowpower=1;else/否则,中断为采样电流中断speedcount=speedcount+1;/speedcount寄存器力卩1,作为测量转速用if(speedcount0x3d)sp仁1;/如果转速低于1000000卩s/(512卩s*3eh*3)/则认为为低速状态currenth=ADRESH;curpid=1;count_ts=count_ts-1;if(count_ts=0)/如果手柄时间到,则转入手柄采样通道CHS0=0;count_ts=0x08;ts=1;x=1;DELAY1(x);ADGO=1;_/刹车

11、处理子程序voidBREAKON()charx;off=0;/off清零,如果是干扰则不复位shutdown=0;if(RB0=1)/如果刹车信号为真,则停止输出电压ADIE=0;/关AD中断INTE=0;/关刹车中断CCPR1L=FULLDUTY;输出电压0TMR1ON=0;关CCP2不再触发ADfor(;ADGO=1;)continue;/如正在采样,则等待采样结束ADIF=0;/ADIF位清零CHS0=0;/选择通道0采样手柄CHS1=0;x=1;DELAY1(x);doADGO=1;for(;ADIF=0;)continue;ADIF=0;CCPR1L=FULLDUTY;asm(CLR

12、WDT);tsh=(ADRESH1);while(tshTSON|RBO=1);/当手柄值大于2.2V或刹车仍旧继续时,执行以/上语句off=1;/置复位标志/欠保护子程序voidPOWER()charx;lowpower=0;voltage=1;/电压值换为7位,以利于单字节运算if(voltageWOLOFF)/电池电压小于3*k(V)时保护ADIE=0;INTE=0;TMR1ON=0;CCPR1L=FULLDUTY;for(;ADGO=1;)continue;ADIF=0;CHS0=0;CHS1=1;x=1;DELAY1(x);doADGO=1;for(;ADIF=0;)continue

13、;ADIF=0;voltage=(ADRESH1);CCPR1L=FULLDUTY;asm(CLRWDT);while(voltageVOLON);/电池电压小于35V时继续保护off=1;/置复位标志/电流环运算子程序voidCURPI()staticintcurep=0x00,curek=0x00,curuk=0x00;uniondataintpwm;chara2;b;/定义电流环运算寄存器curpid=0;/清电流运算标志curep=curek*CURB;/计算上一次偏差与比例系数的积if(currenth=1;curek=gcur-currenth;/计算本次偏差curuk=curuk

14、+curek*CURA-curep;/按闭环PI运算方式得到本次输出结果,下/面对结果进行处理if(curukvOxOO)/如果输出小于零,则认为输出为零curuk=O;CCPR1L=FULLDUTY;CCP1X=O;CCP1Y=O;elseif(curuk-THL=O)/如果输出大于限幅值,则输出最大电压curuk=THL;CCPR1L=O;CCP1X=O;CCP1Y=O;else/否则,按比例输出相应的高电平时间到CCPR1寄存器b.pwm=THL-curuk;b.pwm8)&OxOff;将PWM寄存器的高半字节if(b.pwm&0x80!=0)CCP1X=1;elseCCP1X=0;if

15、(b.pwm&0x40!=0)CCP1Y=1;elseCCP1Y=0;/转速环运算子程序voidSPEPI()staticintspeep=0x00,speek=0x00,speuk=0x00;inttsh1,speed1;/转速寄存器定义spepid=O;/清转速运算标志if(spe=1)speed仁0x00;/若转速太低,则认为转速为零elsespeed仁0x7f-speed;/否则计算实际转速if(speed10)speed1=0;speep=speek*SPEB;tsh仁tsh-0x38;/得到计算用的手柄值speek=tsh1-speed1;if(tsh1=GSPEH)/限制最大转速tsh1=GSPEH;speuk=speuk+speek*SPEA-speep;/计算得转速环输出if(speuk=OXOO)speuk=0x00;g

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号