版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PIC单片机控制C程序-CAL-FENGHAI-(2020YEAR-YICAI)iPIC单片机控制的电动自行车驱动系统C程序#include 电动车双闭环程序,采用双闭环方式控制电机,以得到最好的亦转速性能, 并且可以限制电机的最大电流。本应用程序用到两个CCP部件,其中CCP1用于PWM 输出,以控制电机电压;CCP2用于触发AD,定时器TMR2、TMR1, INT中 断,RB 口电平变化中断,看门狗以及6个通用I/O 口#define AND OxeO /状态采集 5, 6, 7 位#define CURA OXOa 电流环比例和积分系数之和ffdefine CURB 0X09 电流环比例
2、系数#define THL 0X6400 电流环最大输出#define FULLDUTY OXOFF /占空比为1时的高电平时间#define SPEA OXld 转速环比例和积分系数之和#define SPEB OXlc 转速环比例系数#define GCURHILO 0X0330 /转速环最大输出#define GCURH 0X33 最大给定电流#define GSPEH 0X67 最大转速给定TSON 0X38/手柄开启电压V, TSON*2为刹车后手柄开启电压,即/V#define VOLON 0X4c 低电压保护重开电压V即33 V#define VOLOFF 0X49 低电压保护关
3、断电压V即Vvolatile unsigned char DELAYHELAYUoldstatepeed,speedcountshounttsountvobgcuGCurrenth,voltage; 寄存器定义static bit splpevolflagpepidjowpower,off,shutdown,curpid; 标志位定义static volatile unsigned char nQw10=0xa0xbe,0xff*0x7日Oxcf,0xff,0xd7,0x77,0xff,0xff; 状态寄存器表/PIC16F877初始化子程序void INIT877()PORTC=OXOFF;
4、 /关断所有 MOSFETTRISC=0X02; /设置 C 口输出PIE1=OXOO; /中断寄存器初始化,关断所有中断TRISA=OXCF; /设置 RA4,RA5 输出TRISBRXEF;/RB 口高三位输入,采集电机三相的霍尔信号PORTC=new(PORTB&AND)5; /采集第一次霍尔信号,并输出相应的信号,导通两个MOS管T2CON=0X01; /TMR2 4 分频CCPR1L=OXOFF; /初始时PWM输出全高CCP1CON=OXOFF; /CCP1 设置为 PWM 方式CCP2CON=OXOB; /CCP2设置为特殊方式,以触发ADADCONO=OX81; /AD时钟为3
5、2分频,且AD使能,选择ANO通道采集手柄电压TMR2=0X00; /TMR2寄存器初始化TMR1H=OXOO; /TMR1寄存器初始化TMR1L=OXOO;T1CON=OXOO; /TMR1 为 1 分频CCPR2H=0X08;CCPR2L=0X00; /电流采样周期设置为TAD=512 RSPR2=0XC7; /PWM 频率设置为 5 kHzADCON1=OX02; /AD 结果左移OPTION=OXFB; /INT 上升沿触发TMR2ON=1; /PWM 开始工作INTCON=OXD8; 中断设置 GIE=1/PEIE=1/RBIE=1ADIE=1; /AD中断使能 speedcount
6、=OxOO; 转速计数寄存器 speed=0x7f; 转速保持寄存器 spe=l; /速标志位 spl=l; /ft速标志位 oldstate=OxOff; /始状态设置,区别于其他状态 count_ts=0x08; /电流采样8次採集1次手柄 count_vol=:OxOO; /采样256次手柄,采集1次电池电压 ts=l; /可以釆集手柄值的标志位ADGO=1; /AD采样使能TMR1ON=1; /CCP2部件开始工作/延时子程序ffpragma interruptjevel 1void DELAYl(x) char x;DELAYH=x; /延时参数设置#asmDELAY2 MOVLW
7、0X06MOVWF -DELAYLDELAY1 DECFSZ .DELAYLGOTO DELAY1DECFSZ-DELAYHGOTO DELAY2ffendasm/状态采集子程序void sample()char statel,state2,statQ3pX;do x=l;statel=(PORTB&AND); /霍尔信号采集DELAYl(x);state2=(PORTB&A ND);while(statel-state2); /当三次采样结果不相同时继续采集状态if(statel-oldstate!=0) 看本次采样结果是否与上次相同,不同则执行oldstate=statel; 将本次状态设
8、置为旧状态statel=(oldstate5);PORTC=newstatel; /C 口输出相应的信号触发两个MOS管if(spl=l)spe=l;spl=:O;else 如果转速很低,则spe置1spe=O;spl=O;speedcount=l;state3=fTIVIRlH2); /否则,spe=O,计转速speed=speedcount+state3; /speed 寄存器为每 256 ps 加 1speedcount=0;/AD采样子程序void AD()char x;ADIF=O; /清AD中断标志位if(ts=l)/如果为手柄采样,则采样手柄值CHSO=1; /选择电流采样通道c
9、ount_vol=count_vol+l; /电池采样计数寄存器spepid=l; /置转速闭环运算标志ts=O;tsh=ADRESH; /存手柄值if(count_vol=0) /如果电池采样时间到,则选择AN2通道,采集电池电压CHS0=0;CHSl=l;volflag=l;x=l;DELAYl(x);ADGO=l;else if(volflag=l) 电池采样完毕,进行相应的处理CHSl=0;CHSO=l;volflag=0;voltage=ADRESH;lowpower=l;else /否则,中断为采样电流中断speedcount=speedcount+l; /speedcount 寄
10、存器加 1 作为测量转速用 if(speedcount0x3d) spl=l; /如果转速低于 1 000 000 s/(512 ns*3eh*3) /则认为为低速状态 currenth=ADRESH;curpid=l;count ts=count ts-1;if(count_ts=0) 如果手柄时间到,则转入手柄采样通道CHS0=0;count_ts=0x08;ts=l;x=l;DELAYl(x);ADGO=l;/刹车处理子程序void BREAKONf)char x;off=0; /off清零,如果是干扰则不复位shutdown=0;if(RB0=l) /如果刹车信号为真,则停止输出电压A
11、DIE=0; /关 AD 中断INTER; 关刹车中断CCPR1L=FULLDUTY; 输出电压 0TMR10N=0; /关 CCP2,不再触发 ADfor(;ADGO=l;) continue;/如正在采样,则等待采样结束ADIF=O; /ADIF 位清零CHSO=O; /选择通道0采样手柄CHS1=O;x=l;DELAYl(x);do ADGO=1;for(;ADIF=0;)continue;ADIF=O;CCPR1L=FULLDUTY;asmCCLRWDT);tsh=(ADRESHl);while(tshTSON | RBO=1); /当手柄值大于V或刹车仍旧继续时,执行以上语句off=
12、i; /a复位标志/欠保护子程序void POWER()char x;lowpower=0;voltage=l; 电压值换为7位,以利于单字节运算 if(voltageVOLOFF) /电池电压小于3*k(V)时保护 ADIE=O;INTER;TMR10N=0;CCPR1L=FULLDUTY;for(;ADGO=l;)continue;ADIF=O;CHSO=O;CHS1=1;x=l;DELAYl(x);doADGO=l;for(;ADIF=0;)continue;ADIF=O;voltage=(ADRESHl);CCPR1L=FULLDUTY;asmCLRWDT“);while(voltag
13、eVOLON); /电池电压小于35 V时继续保护。仟“;/置复位标志/电流环运算子程序void CURPI0 static int curep=OxOO,curek=OxOO,curuk=OxOO;union dataint pwm;chara2;b;/定义电流环运算寄存器curpid=O; /清电流运算标志curep=curek*CURB; /计算上一次偏差与比例系数的积if(currenth2)currenth=2; /如果采样电流为零,则认为有一个小电流以利于使转速下降currenth=l;curek=gcur-currenth; /if*算本次偏差curuk=curuk+curek*
14、CURA-curep; /按闭环PI运算方式得到本次输出结果,下面对结果进行处理if(curuk=O) 如果输出大于限幅值,则输出最大电压 curuk=THL;CCPRlL=O;CCPlX=O;CCPlY=O;else /否则,按比例输出相应的高电平时间到CCPR1寄存器=THL-curuk;=1;CCPR1L=1; /CCPRlL=8)&0x0ff;将 PWM 寄存器的高半字节if&0x80!=0)CCP1X=1;else CCP1X=O;if&0x40!=0) CCP1Y=1;else CCP1Y=O;/转速环运算子程序void SPEPI0 static int speepOxOOpee
15、kOxOOpeukOxOO;int tshlpeedl; /转速寄存器定义spepid=O; /清转速运算标志if(spe=l) speedl=OxOO; /若转速太低,则认为转速为零else speedl=Ox7f-speed; /否则计算实际转速if(speedlO) speedl=O;speep=speek*SPEB;tshl=tsh-0x38; /得到计算用的手柄值speek=tshl-speedl;if(tshl=GSPEH) /限制最大转速tshl=GSPEH;speuk=speuk+speek*SPEA-speep; /计算得转速环输出if(speukGCURHILO)/转速环输出限制,即限制最大电流约12 Asp 皀 uk=GCURHILO;gcur=GCURH;else /调速状态时的输出gcur=(speuk4)&0x0ff;主程序imain()for(;)INIT877(); /单片机复位后,先对其进行初始化。幵=0; /清复位标志for(;off=0;) /复位标志为零,则执行下面程序,否则复位if(curpid=l) CURPI(); /电流 PI 运算else if(spepid=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理信息系统用户研究
- 食品安全管理师岗前竞争考核试卷含答案
- 流延辅助工班组安全考核试卷含答案
- 银行信贷员安全理论竞赛考核试卷含答案
- 油制气工操作安全测试考核试卷含答案
- 日用化学用品配方师安全规程评优考核试卷含答案
- 数控车工岗前核心管理考核试卷含答案
- 信息通信营业员安全行为模拟考核试卷含答案
- 铁合金火法冶炼工班组管理测试考核试卷含答案
- 糖汁过滤工安全检查竞赛考核试卷含答案
- 北京市西城区2026年中考二模英语试题(含答案)
- 2026年人教版初一政治(道德与法治)下学期期末考试试卷及答案(共四套)
- 2026眼镜镜片制造过程评估及镀膜工艺Plus偏光镜研发趋势说明
- (三模)济南市2026届高三5月针对性训练生物试卷(含答案)
- 2026宁夏电投永利能源有限公司招聘21人考试备考题库及答案解析
- 广东省湛江航运集团有限公司招聘笔试题库2026
- 成都市青白江区区属国有企业2026年春季第一批次公开招聘工作人员(17人)考试参考题库及答案解析
- 2026中国报废汽车拆解行业盈利动态与需求趋势预测报告
- 一对一党员帮扶工作制度
- 山东博政投资发展(集团)有限公司招聘笔试题库2026
- 护理带教:以人文关怀为核心
评论
0/150
提交评论