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

合集下载

基于单片机的电动自行车控制器设计

基于单片机的电动自行车控制器设计

① 收 稿 日期 :2017—03—20 作者简介 :何全陆(1960一),男 ,安徽芜湖人 ,高级专利工程师 ,副教授 ,研 究方 向 :知识产权 和机械设计 。
第 3期
何 全 陆 :基 于单 片机 的 电动 自行 车控 制 器设 计
407
图 2 无刷直流电机控制系统
2 硬件 电路设计
中图分 类 号 : TP332
文献 标识 码 : A
O 引 言
随着 经济 和科技 的快 速 发展 ,人 民生 活水平 的 提 高 ,电动 自行 车逐 渐取 代人 力 自行 车 ,以其轻 巧 、 方 便 、环保 等优 点 受 到 人们 的青 睐 ,成 为 当前 社 会 人 们 主要 的代 步工具 。当前 主 流 的 电动 自行 车 ,电 动 摩托 车 大都是 通 过直 流供 电 ,对 无刷 直 流 电机 进 行 控制 ,通 过对 电源 电压 的调 节 实现对 无 刷直 流 电 机 的速 度控 制 。 电动 自行 车 主要 有 车身 、电机 、电 源和控 制 器组 成 。 电动 自行 车 控 制 器按 照功 率 的 大小 可分 为 :小 功率 、中功 率 、大 功 率 三类 ,电动 自 行 车 一般 使用 小功 率 的 ,货运 三 轮车 和 电动摩 托 车 使 用 中功 率和 大 功 率 的 。 电动 自行 车 的控 制 器 是 电动 自行 车 的大 脑 ,控 制 电 动 自行 车 各 种 运 动 状 态 ,控 制器 的好 坏 直 接 影 响 着 电 动 自行 车 的工 况 , 因此研 发 一款 高性 能 、低 耗 能 、使 用 方便 的 电动 自 行 车控 制 器是 当务 之急 。
CPU),程 序 和 数 据 分Leabharlann 别 进 行 存 储 ,速 度 可 达

基于单片机的电动车控制系统设计

基于单片机的电动车控制系统设计

图 3 无刷直流电动机控制系统功率主电路
控制器电路由微控制核心 PIC16F72 单片机、逻辑保 护门 74LS00 和 +5V 电源电路构成,附加电路包括电源滤 波电路、位置传感器信号采集电路、电池电压降压监测电 路、微控制器时钟振荡电路和上电复位电路构成;同时电 路向外提供各种输入和输出接口:助力传感器接口 fSen-
社,2006. [4]高湘.给水工程技术及工程实例 北京:化学工业
出版社,2002. [5]谌永红.给水排水工程 北京:中国环境科学出版
社,2008. (收稿日期:2008-08-27)
的调速设备价格较为昂贵,一次性投资较大,因此当管网
《湖北农机化》2008 年第 5 期 25
开发与研究
号的状态与电机的固定序列进行比较,以判断换相的正确 性;MOSFET 驱动电路由 IR2103 把上管和下管控制信号 进行放大,驱动大功率管。
年可节省电费成本支出约 94 万元。保守一点算,一年也
可节省电费成本支出约 45.3 万元。
参考文献
3 结论
[1]关醒凡.现代泵技术手册[M] .北京:航宇出版社,
怀化市一水厂送水泵站中改造费用主要是更换 5 台 水泵,即 4 台 24SAP-14B 型泵和 1 台 350S44A 型泵。购 买 5 台泵所需费用约为 35 ̄40 万元,也就是说,改造一年 时间内节省的电费成本即基本可收回投入的改造费用。因 此,正确合理选择送水泵站的水泵和供水方式,采取最大 限度的节能措施,可以大幅度地降低电力消耗,最直接的 节约生产成本。
sor、速度传感器接口 SP、速度限定接口 SE,a 相位传感 器输入接口 aSensor,b 相位传感器输入接口 bSensor,c 相 位传感器输入接口 cSensor、一个模式开关接口 KMOD、 刹车开关接口 kBRK、面板接口 Panel。本系统还设置了过 压、欠压、过流、过热等保护环节,并根据简单可靠原则 设计了系统具体的保护电路。

C语言程序单片机控制的电动自行车驱动系统

C语言程序单片机控制的电动自行车驱动系统

第14章单片机控制的电动自行车驱动系统14.4.4 C语言程序#include <pic.h>//电动车双闭环程序,采用双闭环方式控制电机,以得到最好的zh转速性能,并且可以//限制电机的最大电流。

本应用程序用到两个CCP部件,其中CCP1用于PWM输出,以控//制电机电压;CCP2用于触发AD,定时器TMR2、TMR1,INT中断,RB口电平变化中断,//看门狗以及6个通用I/O口#define AND 0xe0 //状态采集5,6,7位#define CURA 0X0a //电流环比例和积分系数之和#define CURB 0X09 //电流环比例系数#define THL 0X6400 //电流环最大输出#define FULLDUTY 0X0FF //占空比为1时的高电平时间#define SPEA 0X1d //转速环比例和积分系数之和#define SPEB 0X1c //转速环比例系数#define GCURHILO 0X0330 //转速环最大输出#define GCURH 0X33 //最大给定电流#define GSPEH 0X67 //最大转速给定#define TSON 0X38 //手柄开启电压1.1 V,TSON*2为刹车后手柄开启电压,即 //2.2 V#define VOLON 0X4c //低电压保护重开电压3.0 V即33 V#define VOLOFF 0X49 //低电压保护关断电压2.86 V即31.5 Vvolatile unsigned char DELAYH,DELAYL,oldstate,speed,speedcount,tsh,count_ts,count_vol,gcur,currenth,voltage; //寄存器定义static bit sp1,spe,ts,volflag,spepid,lowpower,off,shutdown,curpid; //标志位定义static volatile unsigned char new[10]={0xaf,0xbe,0xff,0x7e,0xcf, 0xff,0xd7,0x77,0xff,0xff}; //状态寄存器表//------------PIC16F877初始化子程序------------void INIT877(){PORTC=0X0FF; //关断所有MOSFETTRISC=0X02; //设置C口输出PIE1=0X00; //中断寄存器初始化,关断所有中断TRISA=0XCF; //设置RA4,RA5 输出TRISB=0XEF; //RB 口高三位输入,采集电机三相的霍尔信号PORTC=new[(PORTB&AND)>>5]; //采集第一次霍尔信号,并输出相应的信号,导通//两个MOS管T2CON=0X01; //TMR2 4分频CCPR1L=0X0FF; //初始时PWM输出全高CCP1CON=0X0FF; //CCP1设置为PWM方式CCP2CON=0X0B; //CCP2设置为特殊方式,以触发ADADCON0=0X81; //AD时钟为32分频,且AD使能,选择AN0通道采集手//柄电压TMR2=0X00; //TMR2寄存器初始化TMR1H=0X00; //TMR1寄存器初始化TMR1L=0X00;T1CON=0X00; //TMR1为1分频CCPR2H=0X08;CCPR2L=0X00; //电流采样周期设置为T AD=512 μsPR2=0XC7; //PWM频率设置为5 kHzADCON1=0X02; //AD结果左移OPTION=0XFB; //INT上升沿触发TMR2ON=1; //PWM开始工作INTCON=0XD8; //中断设置GIE=1,PEIE=1,RBIE=1ADIE=1; //AD中断使能speedcount=0x00; //转速计数寄存器speed=0x7f; //转速保持寄存器spe=1; //低速标志位sp1=1; //低速标志位oldstate=0x0ff; //初始状态设置,区别于其他状态count_ts=0x08; //电流采样8次,采集1次手柄count_vol=0x00; //采样256次手柄,采集1次电池电压ts=1; //可以采集手柄值的标志位ADGO=1; //AD采样使能TMR1ON=1; //CCP2部件开始工作}//------------延时子程序---------------#pragma interrupt_level 1void DELAY1(x)char x;{DELAYH=x; //延时参数设置#asmDELAY2 MOVLW 0X06MOVWF _DELAYLDELAY1 DECFSZ _DELAYLGOTO DELAY1DECFSZ _DELAYHGOTO DELAY2#endasm}//-----------状态采集子程序----------------------void sample(){char state1,state2,state3,x;do {x=1;state1=(PORTB&AND); //霍尔信号采集DELAY1(x);state2=(PORTB&AND);}while(state1-state2); //当三次采样结果不相同时继续采集状态if(state1-oldstate!=0) //看本次采样结果是否与上次相同,不同//则执行{oldstate=state1; //将本次状态设置为旧状态state1=(oldstate>>5);PORTC=new[state1]; //C口输出相应的信号触发两个MOS管 if(sp1==1){spe=1;sp1=0;}else { //如果转速很低,则spe置1spe=0;sp1=0;speedcount<<=1;state3=(TMR1H>>2); //否则,spe=0,计转速speed=speedcount+state3; //speed寄存器为每256 μs加1}speedcount=0;}}//-----------------AD采样子程序----------------------void AD(){char x;ADIF=0; //清AD中断标志位if(ts==1){ //如果为手柄采样,则采样手柄值CHS0=1; //选择电流采样通道count_vol=count_vol+1; //电池采样计数寄存器spepid=1; //置转速闭环运算标志ts=0;tsh=ADRESH; //存手柄值if(count_vol==0) { //如果电池采样时间到,则选择AN2通道,采集电池电压CHS0=0;CHS1=1;volflag=1;x=1;DELAY1(x);ADGO=1;}}else if(volflag==1) { //电池采样完毕,进行相应的处理CHS1=0;CHS0=1;volflag=0;voltage=ADRESH;lowpower=1;}else { //否则,中断为采样电流中断speedcount=speedcount+1; //speedcount寄存器加1,作为测量转速用if(speedcount>0x3d) sp1=1; //如果转速低于1 000 000 μ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;}}}//-------------刹车处理子程序------------------void BREAKON(){char x;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);do {ADGO=1;for(;ADIF==0;)continue;ADIF=0;CCPR1L=FULLDUTY;asm("CLRWDT");tsh=(ADRESH>>1);}while(tsh>TSON||RB0==1); //当手柄值大于2.2 V或刹车仍旧继续时,执行以 //上语句off=1; //置复位标志}}//---------欠保护子程序-------------------void POWER(){char x;lowpower=0;voltage>>=1; //电压值换为7位,以利于单字节运算if(voltage<VOLOFF) { //电池电压小于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);do{ADGO=1;for(;ADIF==0;)continue;ADIF=0;voltage=(ADRESH>>1);CCPR1L=FULLDUTY;asm("CLRWDT");}while(voltage<VOLON); //电池电压小于35 V时继续保护off=1; //置复位标志}}//------------电流环运算子程序-----------------void CURPI(){ static int curep=0x00,curek=0x00,curuk=0x00;union data{int pwm;char a[2];}b; //定义电流环运算寄存器curpid=0; //清电流运算标志curep=curek*CURB; //计算上一次偏差与比例系数的积if(currenth<2)currenth=2; //如果采样电流为零,则认为有一个小电流以利于//使转速下降currenth>>=1;curek=gcur-currenth; //计算本次偏差curuk=curuk+curek*CURA-curep; //按闭环PI运算方式得到本次输出结果,下//面对结果进行处理if(curuk<0x00) { //如果输出小于零,则认为输出为零curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0;}else if(curuk-THL>=0) {//如果输出大于限幅值,则输出最大电压curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;}else { //否则,按比例输出相应的高电平时间到CCPR1寄存器b.pwm=THL-curuk;b.pwm<<=1;CCPR1L=b.a[1]; //CCPR1L=(b.pwm>>8)&0x0ff;将PWM寄存器的高半字节if(b.pwm&0x80!=0) CCP1X=1;else CCP1X=0;if(b.pwm&0x40!=0) CCP1Y=1;else CCP1Y=0;}}//---------------转速环运算子程序-----------------------void SPEPI(){ static int speep=0x00,speek=0x00,speuk=0x00;int tsh1,speed1; //转速寄存器定义spepid=0; //清转速运算标志if(spe==1) speed1=0x00; //若转速太低,则认为转速为零else speed1=0x7f-speed; //否则计算实际转速if(speed1<0) speed1=0;speep=speek*SPEB;tsh1=tsh-0x38; //得到计算用的手柄值speek=tsh1-speed1;if(tsh1<0) {speuk=0;gcur=0;} //当手柄值低于1.1 V时,则认为手柄给定为零else { //否则,计算相应的转速环输出if(tsh1>=GSPEH) //限制最大转速tsh1=GSPEH;speuk=speuk+speek*SPEA-speep; //计算得转速环输出if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//转速环输出处理else if(speuk>GCURHILO) { //转速环输出限制,即限制最大电流约12 A speuk=GCURHILO;gcur=GCURH;}else { //调速状态时的输出gcur=(speuk>>4)&0x0ff;}}}//-----------主程序-------------------------main(){for(;;){INIT877(); //单片机复位后,先对其进行初始化off=0; //清复位标志for(;off==0;) { //复位标志为零,则执行下面程序,否则复位if(curpid==1) CURPI(); //电流PI运算else if(spepid==1) SPEPI(); //转速PI运算else if(lowpower==1) POWER();else if(shutdown==1) BREAKON();asm("CLRWDT");}}}//---------中断服务子程序---------------------#pragma interrupt_level 1void interrupt INTS(void){if(RBIF==1) {RBIF=0;sample();}else if(ADIF==1) AD();else if(INTF==1) {shutdown=1;INTF=0;} //刹车中断来,置刹车标志}。

基于单片机电动自行车调速系统的

基于单片机电动自行车调速系统的

aaaaaa学院高等教育本科毕业论文基于单片机电动自行车调速系统的设计考生姓名: aaaaaa 准考证号: aaaaaaaaaaaaa 专业层次:本科院(系):机械与动力工程学院指导教师: aaaaaaaa 职称: aaaaaaaaaaaaaa学院二Oaa年a月aa日aaaaa学院高等教育自学考试本科毕业论文基于单片机电动自行车调速系统的设计考生姓名: aaaaaaaaaaa准考证号: aaaaaaaaaaaaa专业层次:本科指导教师: aaaaaaaaaaaaaa院(系):aaaaaaaaaaaaaaaaaaaaaaa学院二Oaaa年a月aaa日整个论文页面设置不完全符合规范。

摘要近年来,随着人们生活水平的改善,摩托车、燃油助力车得到迅速发展,其排放的尾气已造成城市空气严重污染,一些城市相继制定法规限制摩托车、燃油助力车的使用来保护环境。

发展短距离绿色交通工具替代摩托车、燃油助力车成为一些国家的经济和社会课题。

电动自行车具有“零排放”,是一种比较好的短距离绿色交通工具。

由于电池问题,限制了电动自行车的行驶距离,但可以通过提高系统的效率来改善其性能。

本课题研制的电动自行车用无位置传感器直流无刷永磁电动机来驱动,用PIC16C74单片机作为主控芯片,它不仅克服了有刷直流电机的噪音、换向火花等缺点,而且避免了有位置传感器直流无刷电机因位置传感器带来的不足;同时,它降低了制造和使用过程中的成本,提高了使用和维护的方便性,具有效率高、环保、经济和方便的特点以及具有良好运行性能和巨大的市场潜力。

关键词:单片机,脉宽调速系统,三端式稳压器,无刷直流电动机,八段数码管动态显示,蓄电池(关键词不完全准确,只需3-5个)Electric bike speed control system designABSTRACTIn recent years, with the improvement of people's living standard, motorcycle, fuel ZhuLiChe rapidly developing, the exhaust gas has caused urban air pollution, and some cities have set rules to limit the use of motorcycle, fuel ZhuLiChe to protect the environment. The development of green transportation short alternative motorcycle, fuel ZhuLiChe become some the country's economic and social issues.This paper deals with an electric motor driven bike (EB) and its control stratagem. Without fail,EB 15 very helpful to environment protection. Nevertheless EB has its disadvantages,especially the too weak continuous run distance. Except the battery problem,the efficiency of the whole system 15 also one of the most important problems to be solved.A permanent brush-less and sensor-less DC motor and its control set are specially designed for this developed EB.A study on control stratagem and electronic resorts are given in this paper.A microchip PIC16C74 used as CPU and corresponding software developed by author 15 introduced in this control system. The experiments of the prototype show that the performance,including system efficiency,noise,spark,maintenance-free and its cost are obviously improved. It may be expected,that this EB driving system has really huge market potential.Keywords: Single-chip, pulse width adjustable-speed system, three-terminal regulator, permanent magnet brushless DC motor,the eiehth of dynamic display,battery目录格式需修改。

【完整版】电动自行车驱动控制系统_毕业论文设计

【完整版】电动自行车驱动控制系统_毕业论文设计

目录1、概述 (1)1.1 电动自行车驱动控制系统设计的意义 (4)1.2 研究现状综述 (1)1.3 研究方法 (2)1.3.1直流电机调速原理 (2)1.3.2直流调速系统实现方式 (3)2、系统总体方案论证 (5)2.1 系统方案比较与选择 (5)2.2 系统方案描述 (6)3、硬件电路的模块设计 (6)3.1控制电路设计 (6)3.2信号处理电路设计 (7)3.3驱动电路方案及参数描述 (8)3.3.1 IR2110驱动电路中IGBT抗干扰设计 (9)3.3.2 IR2110功率驱动介绍 (10)3.3.3 H桥驱动电路原理 (11)3.4 稳压电源设计 (12)3.5 光电测速电路 (13)4、系统软件设计 (14)4.1电动机驱动和速度控制程序设计 (14)4.2PWM调速与测速程序设计 .......................................... 错误!未定义书签。

4.2.1 PCA捕获模式 ..................................................... 错误!未定义书签。

4.2.2 PCA脉宽调节模式 ....................................... 错误!未定义书签。

4.2.3 PWM调制信号接收模块 .................................. 错误!未定义书签。

5.系统调试 .................................................................................. 错误!未定义书签。

6、结束语 ................................................................................... 错误!未定义书签。

参考文献 ..................................................................................... 错误!未定义书签。

基于单片机的自行车智能辅助系统

基于单片机的自行车智能辅助系统
通过 分 析我 们知 道 ,在a=0.1状 态下 ,航 迹 的滤波 值 以0.9的 仪 蕈对 上 次 预测 值 加 权 , 以0.1的权 重 对 本 次测 量 值 _ JJIJ权 。 于 七次 预测 值发 生 了突 跳 ,且外 推速 度 也随 之突 变 ,导致 本 次的 颅测 值琳 续变 大 。而 且 ,由于 本次 测量 的信 息 权重0L=0.1,使 得即 使 出现 正 确 的 点迹 ,也 因 为 影 响过 小 无 法 产 生 应 有 的 纠偏 作 用 。 导致 目标 预测 值 越 偏越 远 。而 在 权蘑 不 变 的情 况 , 至少 需 要重 新 获得 2个 有 效点 迹才 能 完成 纠偏 。而 在(I=0l3 ̄I1o.=0.8时, 由 于本次 测量 值权 重较 大 ,虽 然有 数据 丢 失 ,但 …现舆值后滤波 值就迅 速向真值方 向收 敛,保证 了滤 波的有 效忡 。
提 醒 的情 况 下 , 自行 车 驾驶者 可 能能 会 因为转 弯或 者 急停 被 电动车 速 。转速 为 测量 传感 器输 出 的脉冲 信号 的频 率再 乘 以6O。电路 图如
所撞 到 。所 以打算 做一 个集 警报 和灯 光一体 化 的装 置 。
图 l所示 。
2 总 体 设 计 方 案
图 1电 路 图
距 离报 警系统 等 。主 要通 过对 各传 感器 信 息的采 集 与处 理 ,实现 测 3.3 光敏 电 阻模块
速 ,测 距 ,智 能灯 光等 。
通 过 光敏 电 阻实现 根据 光 照强 度 自动开 关灯 光 。若灯 光暗 淡 ,
则开 启灯 光反之 不开 启灯 光 。
3 硬件电路设计
该 设 计是 以MSP430fl49单 片 机 为控 制 芯 片 ,通 过 12V电源 供 电。 系 统结 构从 交流输 入 ,整 流滤 波 ,驱动 电路 再 到主 控 电路 。各

电动车C语言讲解

电动车C语言讲解

第14章单片机控制的电动自行车驱动系统14.4.4 C语言程序#include <pic.h>//电动车双闭环程序,采用双闭环方式控制电机,以得到最好的zh转速性能,并且可以//限制电机的最大电流。

本应用程序用到两个CCP部件,其中CCP1用于PWM输出,以控//制电机电压;CCP2用于触发AD,定时器TMR2、TMR1,INT中断,RB口电平变化中断,//看门狗以及6个通用I/O口#define AND 0xe0 //状态采集5,6,7位#define CURA 0X0a //电流环比例和积分系数之和#define CURB 0X09 //电流环比例系数#define THL 0X6400 //电流环最大输出#define FULLDUTY 0X0FF //占空比为1时的高电平时间#define SPEA 0X1d //转速环比例和积分系数之和#define SPEB 0X1c //转速环比例系数#define GCURHILO 0X0330 //转速环最大输出#define GCURH 0X33 //最大给定电流#define GSPEH 0X67 //最大转速给定#define TSON 0X38 //手柄开启电压1.1 V,TSON*2为刹车后手柄开启电压,即 //2.2 V#define VOLON 0X4c //低电压保护重开电压3.0 V即33 V#define VOLOFF 0X49 //低电压保护关断电压2.86 V即31.5 Vvolatile unsigned char DELAYH,DELAYL,oldstate,speed,speedcount,tsh,count_ts,count_vol,gcur,currenth,voltage; //寄存器定义static bit sp1,spe,ts,volflag,spepid,lowpower,off,shutdown,curpid; //标志位定义static volatile unsigned char new[10]={0xaf,0xbe,0xff,0x7e,0xcf, 0xff,0xd7,0x77,0xff,0xff}; //状态寄存器表//------------PIC16F877初始化子程序------------void INIT877(){PORTC=0X0FF; //关断所有MOSFETTRISC=0X02; //设置C口输出PIE1=0X00; //中断寄存器初始化,关断所有中断TRISA=0XCF; //设置RA4,RA5 输出TRISB=0XEF; //RB 口高三位输入,采集电机三相的霍尔信号PORTC=new[(PORTB&AND)>>5]; //采集第一次霍尔信号,并输出相应的信号,导通//两个MOS管T2CON=0X01; //TMR2 4分频CCPR1L=0X0FF; //初始时PWM输出全高CCP1CON=0X0FF; //CCP1设置为PWM方式CCP2CON=0X0B; //CCP2设置为特殊方式,以触发ADADCON0=0X81; //AD时钟为32分频,且AD使能,选择AN0通道采集手//柄电压TMR2=0X00; //TMR2寄存器初始化TMR1H=0X00; //TMR1寄存器初始化TMR1L=0X00;T1CON=0X00; //TMR1为1分频CCPR2H=0X08;CCPR2L=0X00; //电流采样周期设置为T AD=512 μsPR2=0XC7; //PWM频率设置为5 kHzADCON1=0X02; //AD结果左移OPTION=0XFB; //INT上升沿触发TMR2ON=1; //PWM开始工作INTCON=0XD8; //中断设置GIE=1,PEIE=1,RBIE=1ADIE=1; //AD中断使能speedcount=0x00; //转速计数寄存器speed=0x7f; //转速保持寄存器spe=1; //低速标志位sp1=1; //低速标志位oldstate=0x0ff; //初始状态设置,区别于其他状态count_ts=0x08; //电流采样8次,采集1次手柄count_vol=0x00; //采样256次手柄,采集1次电池电压ts=1; //可以采集手柄值的标志位ADGO=1; //AD采样使能TMR1ON=1; //CCP2部件开始工作}//------------延时子程序---------------#pragma interrupt_level 1void DELAY1(x)char x;{DELAYH=x; //延时参数设置#asmDELAY2 MOVLW 0X06MOVWF _DELAYLDELAY1 DECFSZ _DELAYLGOTO DELAY1DECFSZ _DELAYHGOTO DELAY2#endasm}//-----------状态采集子程序----------------------void sample(){char state1,state2,state3,x;do {x=1;state1=(PORTB&AND); //霍尔信号采集DELAY1(x);state2=(PORTB&AND);}while(state1-state2); //当三次采样结果不相同时继续采集状态if(state1-oldstate!=0) //看本次采样结果是否与上次相同,不同//则执行{oldstate=state1; //将本次状态设置为旧状态state1=(oldstate>>5);PORTC=new[state1]; //C口输出相应的信号触发两个MOS管 if(sp1==1){spe=1;sp1=0;}else { //如果转速很低,则spe置1spe=0;sp1=0;speedcount<<=1;state3=(TMR1H>>2); //否则,spe=0,计转速speed=speedcount+state3; //speed寄存器为每256 μs加1}speedcount=0;}}//-----------------AD采样子程序----------------------void AD(){char x;ADIF=0; //清AD中断标志位if(ts==1){ //如果为手柄采样,则采样手柄值CHS0=1; //选择电流采样通道count_vol=count_vol+1; //电池采样计数寄存器spepid=1; //置转速闭环运算标志ts=0;tsh=ADRESH; //存手柄值if(count_vol==0) { //如果电池采样时间到,则选择AN2通道,采集电池电压CHS0=0;CHS1=1;volflag=1;x=1;DELAY1(x);ADGO=1;}}else if(volflag==1) { //电池采样完毕,进行相应的处理CHS1=0;CHS0=1;volflag=0;voltage=ADRESH;lowpower=1;}else { //否则,中断为采样电流中断speedcount=speedcount+1; //speedcount寄存器加1,作为测量转速用if(speedcount>0x3d) sp1=1; //如果转速低于1 000 000 μ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;}}}//-------------刹车处理子程序------------------void BREAKON(){char x;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);do {ADGO=1;for(;ADIF==0;)continue;ADIF=0;CCPR1L=FULLDUTY;asm("CLRWDT");tsh=(ADRESH>>1);}while(tsh>TSON||RB0==1); //当手柄值大于2.2 V或刹车仍旧继续时,执行以 //上语句off=1; //置复位标志}}//---------欠保护子程序-------------------void POWER(){char x;lowpower=0;voltage>>=1; //电压值换为7位,以利于单字节运算if(voltage<VOLOFF) { //电池电压小于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);do{ADGO=1;for(;ADIF==0;)continue;ADIF=0;voltage=(ADRESH>>1);CCPR1L=FULLDUTY;asm("CLRWDT");}while(voltage<VOLON); //电池电压小于35 V时继续保护off=1; //置复位标志}}//------------电流环运算子程序-----------------void CURPI(){ static int curep=0x00,curek=0x00,curuk=0x00;union data{int pwm;char a[2];}b; //定义电流环运算寄存器curpid=0; //清电流运算标志curep=curek*CURB; //计算上一次偏差与比例系数的积if(currenth<2)currenth=2; //如果采样电流为零,则认为有一个小电流以利于//使转速下降currenth>>=1;curek=gcur-currenth; //计算本次偏差curuk=curuk+curek*CURA-curep; //按闭环PI运算方式得到本次输出结果,下//面对结果进行处理if(curuk<0x00) { //如果输出小于零,则认为输出为零curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0;}else if(curuk-THL>=0) {//如果输出大于限幅值,则输出最大电压curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;}else { //否则,按比例输出相应的高电平时间到CCPR1寄存器b.pwm=THL-curuk;b.pwm<<=1;CCPR1L=b.a[1]; //CCPR1L=(b.pwm>>8)&0x0ff;将PWM寄存器的高半字节if(b.pwm&0x80!=0) CCP1X=1;else CCP1X=0;if(b.pwm&0x40!=0) CCP1Y=1;else CCP1Y=0;}}//---------------转速环运算子程序-----------------------void SPEPI(){ static int speep=0x00,speek=0x00,speuk=0x00;int tsh1,speed1; //转速寄存器定义spepid=0; //清转速运算标志if(spe==1) speed1=0x00; //若转速太低,则认为转速为零else speed1=0x7f-speed; //否则计算实际转速if(speed1<0) speed1=0;speep=speek*SPEB;tsh1=tsh-0x38; //得到计算用的手柄值speek=tsh1-speed1;if(tsh1<0) {speuk=0;gcur=0;} //当手柄值低于1.1 V时,则认为手柄给定为零else { //否则,计算相应的转速环输出if(tsh1>=GSPEH) //限制最大转速tsh1=GSPEH;speuk=speuk+speek*SPEA-speep; //计算得转速环输出if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//转速环输出处理else if(speuk>GCURHILO) { //转速环输出限制,即限制最大电流约12 A speuk=GCURHILO;gcur=GCURH;}else { //调速状态时的输出gcur=(speuk>>4)&0x0ff;}}}//-----------主程序-------------------------main(){for(;;){INIT877(); //单片机复位后,先对其进行初始化off=0; //清复位标志for(;off==0;) { //复位标志为零,则执行下面程序,否则复位if(curpid==1) CURPI(); //电流PI运算else if(spepid==1) SPEPI(); //转速PI运算else if(lowpower==1) POWER();else if(shutdown==1) BREAKON();asm("CLRWDT");}}}//---------中断服务子程序---------------------#pragma interrupt_level 1void interrupt INTS(void){if(RBIF==1) {RBIF=0;sample();}else if(ADIF==1) AD();else if(INTF==1) {shutdown=1;INTF=0;} //刹车中断来,置刹车标志}。

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

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

单片机控制的电动自行车驱动系统程序LIST P=16F876#INCLUDE P16F876.INC;以下采用块定义的方法定义单片机内部寄存器CBLOCK 0X20 ;自定义寄存器从0X20开始FLAG1 ;FLAG1作为标志寄存器VOLTAGEH ;电池电压高位寄存器VOLTAGEL ;电池电压低位寄存器TSH;手柄电压高位寄存器TSL;手柄电压低位寄存器STA TE1 ;霍尔信号采样暂存器1STA TE2 ;霍尔信号采样暂存器2STA TE3 ;霍尔信号采样暂存器3DELAY ;延时计数器COUNT_VOL ;低电压采样次数计数器ACCaLO ;ACCa~ACCd为运算用的寄存器ACCaHIACCbLOACCbHIACCcLOACCcHIACCdLOACCdHITEMP ;临时寄存器TEMP1 ;临时寄存器(中断用)SIGN ;符号寄存器COUNT ;临时寄存器W_STACK ;中断时用于暂存W寄存器值ST_STACK ;中断时用于暂存STATUS寄存器值ENDC;***********标志寄存器位定义以及程序中常数定义***********CONSTANT VOLTAGE=0 ;采电池电压标志位CONSTANT PWM=1 ;输出下一次PWM信号标志位CONSTANT LOWPOWER=2 ;低电压标志位CONSTANT SHUTDOWN=3 ;刹车标志位CONSTANT OFF=4 ;复位标志位CONSTANT AND=0XE0 ;AND用于获取有效霍尔信号CONSTANT FULLPWM=0XFF ;当PWM输出全高时,输入CCPR1L中的值CONSTANT VOLOFFH=0X02 ;当电池电压低于24AH时, 低压保护2.86V/31.5 VCONSTANT VOLOFFL=0X4ACONSTANT VOLONH=0X02 ;当电池电压大于266H时,允许电机重开3V/33VCONSTANT VOLONL=0X66CONSTANT TSONH=0X01 ;刹车后手柄复位值低于133H,则允许电机重新启动CONSTANT TSONL=0X33;***复位矢量入口(单片机复位时,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 ;如都不是,则中断返回;************逆变桥输出控制表*************;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电平有;效,其中RC1,RC2不作为触发电路输出口,故表中使其为高电平ORG 0X0020 ;表程序从0X0020单元开始存放(也可以不从这开始)OUT_TABLEADDWF 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 0X0CF ;如霍尔信号为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单元开始存储MAINMOVLW 0X0FF ;由于C口上电复位值不确定,必须先关闭所有MOS管MOVWF PORTCBSF STATUS,RP0 ;选择存储体1MOVLW 0X02 ;设置RC1为输入口,其它为输出口,其中RC2为PWM MOVWF TRISC ;输出口,其它位为触发信号输出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采样周期寄存MOVWF CCP2CON ;器MOVLW 0X081 ;选择AD转换时钟为32分频,选择AN0通道,并使ADMOVWF 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 PR2MOVLW 0X082 ;AD采样结果右移,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 ;开CCP2,对手柄进行等间隔采样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;刹车中断到来?GOTO 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中断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 ;采样完毕?GOTO BREAK4BCF PIR1,ADIFBCF STATUS,CMOVF 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,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 0X1FMOVWF ACCbLOCALL D_addBTFSS ACCbHI,7 ;TS>1.1V?GOTO PWM1 ;是,转PWM1MOVLW FULLPWM ;否则输出全高MOVWF CCPR1LRETURNPWM1 MOVLW 0XFD ;0X27B=3.1VMOVWF ACCbHIMOVLW 0X85MOVWF ACCbLOCALL D_addBTFSC ACCbHI,7 ;TS>3.1V?GOTO PWM3PWM2 CLRF CCPR1LBCF CCP1CON,4BCF CCP1CON,5RETURNPWM3 MOVLW 0X0FF ;1.1 V对应的采样值补码送加数MOVWF ACCbHIMOVLW 0X1FMOVWF ACCbLOCALL D_add ;TS-1.1VCLRF ACCaHI ;系数K=56=38H送乘数MOVLW 0X3FMOVWF ACCaLOCALL D_mpy ;得到放大128倍的低电平时间K*(TS-1.1V)MOVF ACCcHI,0 ;将结果取出MOVWF ACCaHIMOVF ACCcLO,0MOVWF ACCaLOMOVLW 0X64 ;PWM周期T减去低电平时间,得到高电平时间MOVWF ACCbHICLRF ACCbLOCALL D_subBTFSC ACCbHI,7 ;低电平时间是否大于周期?GOTO PWM2 ;是,输出全压RLF ACCbLO ;否则,输出与低电平时间对应的高电平时间RLF ACCbHIMOVF ACCbHI,0 ;D10~D2位送CCPR1LMOVWF CCPR1LBCF CCP1CON,5 ;D0位送CCP1CON5BTFSC ACCbLO,7BSF CCP1CON,5BCF CCP1CON,4 ;D.1位送CCP1CON4BTFSC 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 ACCaHIMOVF 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 ;是,等待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 ADRESL,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 ;分离出有效信息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 STATE3XORWF STATE1,0 ;与第一次状态相同吗?BTFSC STATUS,ZRETURN ;相同则返回MOVF STATE2,0 ;否则再与第二次状态相比较XORWF STATE3,0BTFSS STATUS,ZGOTO SAMPLE ;三次状态均不相同则重新采样MOVF STATE2,0 ;第三次状态与第二次相同,则将正确状态赋予STATE1并MOVWF STATE1 ;返回RETURN;************** MOSFET触发信号输出子程序************** OUTPUT SW APF STA TE1,1 ;STATE1寄存器高低半字节互换BCF STATUS,C ;清C位,并将STA TE1寄存器左移一位RRF STATE1,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 ;是,作相应的处理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,PWMBTFSS 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 ADRESL,0BCF STATUS,RP0MOVWF VOLTAGELBSF FLAG1,LOWPOWER;是,置相应标志位CALL POP ;中断返回RETFIE;**************中断保护现场子程序****************** PUSH MOVWF W_STACK ;暂存W寄存器MOVF STATUS,0 ;暂存STA TUS寄存器MOVWF ST_STACKRETURN ;子程序返回;**************中断恢复现场子程序************** POP MOVF ST_STACK,0 ;恢复STA TUS寄存器值MOVWF STATUSMOVF W_STACK,0 ;恢复W寄存器值RETURN ;子程序返回;**************初始化子程序**************** SETUP MOVLW .15 ;初始化TEMPMOVWF TEMPMOVF ACCbHI,0 ;ACCb送ACCdMOVWF ACCdHIMOVF ACCbLO,0MOVWF ACCdLOCLRF ACCbHI ;清ACCbCLRF ACCbLORETLW 0;**********乘除法运算确定结果符号子程序**********S_SIGN MOVF ACCaHI,0 ;ACCaHI异或ACCbHI,结果送SIGN单元XORWF ACCbHI,0MOVWF SIGNBTFSS ACCbHI,7 ;ACCb为负?GOTO CHEK_A ;否,检查ACCaCALL NEG_BCHEK_A BTFSS ACCaHI,7 ;ACCa为负?RETLW 0 ;ACCa和ACCb均为负,返回GOTO NEG_A ;ACCa为负,取补GOTO MAINEND;程序结束。

电动自行车调速系统的工作原理是什么怎么样用单片机来控

电动自行车调速系统的工作原理是什么怎么样用单片机来控

电动自行车调速系统的工作原理是什么?怎么样用单片机来控制?2008-12-30 15:102008-12-30 17:03满意回答电动自行车调速系统本质上说就是典型的电机调速系统。

现在市面上大多数电动自行车采用的是直流无刷电机。

这种电机出厂的时候内部自带有霍尔传感器可以将电机的转速信号反馈出来。

直流无刷电机本质上是调节直流电压来实现转速调节。

但是大多数情况是,出厂的时候厂家一般也会固化这类控制器在电机上,对外只留有控制端接口。

控制器开发人员不需要了解其内部升降压的机制,只需要对电机控制输入端输入控制信号即可轻松实现电机调速。

这样一来对它的调速就非常简单了。

通过单片机接收霍尔传感器信号通过计算转换得到电机当前转速,当前转速再同设定的转速进行比较,通过计算来得到控制信号的值,从控制端输出改变电机转速。

这是个负反馈的过程,控制得当最终是可以实现电机转速恒定。

控制器调速的原理。

在市场上使用的转把大都是霍耳转把它输出的调速信号是一种电压信号霍耳转把输出电压的大小,取决于霍耳元件周围的磁场强度。

转动转把,改变了霍耳元件周围的磁场强度,也就改变了霍耳转把的输出电压。

然后把这个电压输入控制器,控制器再根据这个信号的大小进行PWM脉宽调制。

从而控制功率管的导通关闭的比例以控制电机转速的大小。

〔PWM是Pulse Width Modulation缩写,中文意思就是脉冲宽度调制,简称脉宽调制。

它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域〕也就是说控制器调速的原理是控制给电机的电的通断时间。

比如电机隔0.5秒通一次电,这样电机就转的慢。

隔0.2秒通一次电这样就快些。

所以,调速根本不是在调给电机的电流。

电动车控制器原理及可靠性2010-03-16 11:48:56阅读4评论0字号:大中小一、智能型控制器能提供电动车整车的主要功能智能型电动车具有“1:1助力”、“电动”、“定速”三种骑行模式:A、“1:1助力”:当脚蹬车速大于2Km/h时,跟随骑行脚蹬力矩的大小,控制器按1:1电动力矩提供电机电流。

基于单片机的电动车速度控制系统

基于单片机的电动车速度控制系统

基于单片机的电动车速度控制系统2023-11-11•引言•单片机与电动车速度控制概述•基于单片机的电动车速度控制系统设计•实验与分析•结论与展望•参考文献01引言研究背景与意义研究内容研究方法研究内容与方法02单片机与电动车速度控制概述单片机基本原理030201电动车速度控制原理电动车的速度控制是通过调节电动机的转速来实现的,主要通过改变电动机的输入电压或电流来实现。

电动车速度控制策略根据实际需要,可以采用PID控制、模糊控制、神经网络等控制策略来调节电动机的转速。

电动车速度控制方法单片机在电动车速度控制中的应用单片机作为控制器单片机可作为电动车速度控制器的核心部件,根据电动车的速度和行驶状态,通过编程实现各种控制算法,从而实现对电动车速度的精确控制。

单片机采集传感器数据单片机还可以采集电动车的速度、行驶里程、电池电量等传感器数据,并通过算法进行数据处理和分析,以实现对电动车的优化控制。

03基于单片机的电动车速度控制系统设计系统硬件设计当速度超过设定值时,发出声音和灯光报警。

根据单片机的控制信号,驱动电机转动,实现速度调节。

采用光电编码器或霍尔传感器等速度检测元件,实时检测电动车的速度。

为整个系统提供稳定、可靠的电源,一般采用开关电源或线作为系统的控制核心,实现速度检测和控制算法。

系统软件设计实现系统的初始化、速度检测和控制主程序当速度超过设定值时,发出声音和灯报警子程序通过光电编码器或霍尔传感器读取速度信号,进行数据处理和速度值的计算。

速度检测子程序控制算法子程序根据控制算法子程序输出的控制信号,驱动电机转动,实现速度调节。

电机驱动子程序020103040504实验与分析实验设备与环境设备环境设定不同的速度控制指令,记录电动车在各个指令下的速度变化和稳定时间。

数据记录使用数据采集系统实时记录速度数据,并存储到计算机中进行分析。

实验过程实验过程与数据记录VS数据分析与结果展示数据分析结果展示05结论与展望研究结论成功设计了一种基于单片机的电动车速度控制系统,实现了对电动车速度的精确控制。

单片机控制电动自行车 已改好好

单片机控制电动自行车  已改好好

编号:商丘工学院毕业论文(设计)题目:系别:专业:班级:学生姓名:指导教师:成绩:2012 年月商丘工学院毕业论文设计目录1 绪论 (1)2 系统要求 (1)2.1电动车对电动机的基本要求 (1)2.2鉴于电动车对电动机的基本要求采用永磁无刷直流电动机 (2)2.2.1永磁无刷直流电动机的基本性能 (2)2.2.2 永磁无刷直流电动机的控制系统 (2)2.2.3永磁无刷直流电动机的不足 (2)3总体设计 (3)4 硬件选择和设计 (3)4.1MCS-51单片机内部结构 (4)4.1.1中央处理器 (4)4.1.2 数据存储器(RAM) (4)4.1.3 程序存储器(ROM) (4)4.1.5 并行输入输出(I/O)口 (4)4.1.6 全双工串行口 (4)4.1.7 中断系统 (5)4.1.8 时钟电路 (5)4.1.9 MCS-51的引脚说明 (6)4.2A/D转换芯片 (7)4.3永磁无刷直流电动机 (9)4. 3.1稀土永磁无刷直流电动机的基本工作原理 (9)4.4三端式稳压器78L05三端式稳压器78L05的工作原理 (11)4.4.1启动电路 (12)4.4.2基准电压电路 (12)4.4.3取样比较放大电路和调整电路 (12)4.4.4减流式保护电路 (12)4.4.5过热保护电路 (13)4.5集成转速传感器KMI15-1 (14)4.5.1 KMI15-1型传感器的性能特点 (15)4.5.2 KMI15-1工作原理 (16)4.5.3 KMI15-1的典型应用 (18)4.5.6 典型应用电路 (18)4.6译码器 (18)4.7电动自行车的核心蓄电池 (19)4.7.1电动车的电池的性能 (19)4.7.2电动车的电池原理是什么 (19)4.8控制器与保护功能 (20)4.8.1控制器与保护功能 (20)5 系统电路设计 (23)I电动自行车调速系统的设计5.1电源电路 (23)5.2显示电路 (23)5.3控制电路 (24)5.4驱动电路及原理 (24)结论 (29)参考文献 (30)II商丘工学院毕业论文设计1 绪论电动车的发展史比燃油汽车更长,世界上第一辆机动车就是电动车。

基于单片机的电动自行车控制系统

基于单片机的电动自行车控制系统

2009届本科毕业论文基于单片机的电动自行车控制系统姓名:系别:专业:学号:指导教师:2009年1月5日目录摘要 (II)0 引言 (1)1系统要求 (1)2总体规划及电路设计 (1)3 主要器件性能及原理 (2)3.1SPMC65P2404A单片机内部结构 (2)3.2永磁无刷直流电动机及三端式稳压器 (3)3.3系统主流程设计 (4)4结语 (6)参考文献 (6)致谢 (6)基于单片机的电动自行车控制系统摘要单片机控制的永磁无刷直流电动机调速系统适用于电动自行车等小功率的工作情况。

并能将多余的电能回溃。

该系统具有调速性能好、功率因数高、节能、体积小、重量轻等优点。

本文设计了系统的各种工况及信号的传递情况,并得到了系统各个部分在不同工况的工作状态。

系统各部分的控制电路基于凌阳公司的控制芯片SPMC65P2404A单片机。

根据永磁无刷直流电动机的特性实施脉宽PWM控制,并通过转速传感器测量转速通过八段数码管动态显示转速,通过软硬件的配合,实现了整个系统的设计要求。

关键词单片机、永磁无刷直流电动机、转速传感器Based on single-chip control system for electric bikesAbstractSinglechip-controlled permanent magnet brushless DC motor speed control system is suitable for electric bicycles and other low-power work. And can collapse redundant power back. The system has good speed, high power factor, energy saving, small size, light weight and so on.This article discussed in detail the system operating conditions and signal transmission, and get the various parts of the system in different conditions of work. System part of the control circuit to control based on Lingyang's SPMC65P2404A chip. Permanent magnet brushless DC motor in accordance with the characteristics of the implementation of PWM pulse width control and speed through the speed sensor measurement through eight digital tube dynamic display speed, through hardware and software support, the realization of the entire system design requirements.KeywordsSingle-chip, permanent magnet brushless DC motor, speed sensor0 引言人类与环境共存和全球经济的可持续发展使人们迫切希望寻求到一种既能代替人力又低排放和有效利用资源的交通工具,电动车是一种安全、经济、清洁的绿色交通工具,不仅在能源、环境方面有其独特的优越性和竞争力,因此使用电动车无疑是一种很有希望的方案。

PSoC单片机的电动自行车控制器的设计

PSoC单片机的电动自行车控制器的设计

毕业设计(论文)报告题目基于PSoC单片机的电动自行车控制器的设计系别专业班级学生姓名学号指导教师2012年4 月基于PSoC单片机的电动自行车控制器的设计摘要:电动车以零污染、高效率、低噪音等特点被认为是真正的“绿色交通工具”,而电动汽车受到电动机、电池的限制,批量进入市场还有一定的难度,电动自行车却可以得到迅速的发展。

电动自行车的主要性能取决于电池、电动机和控制器,无刷直流电动机是电动自行车的主要部件。

基于PSoC CY8C24533的电动自行车控制器,利用其模拟、数字和路由资源使整个系统只用一个PSoC芯片便实现了上述的所有控制功能,因此无需任何外围芯片,外围元件的数目也相应减少。

这充分体现了SoC的优势,同时芯片的资源也得到了充分有效的利用。

由于CY8C24533的模拟、数字和路由等资源也是可编程的,其使设计工程师的智慧和创意得到更多体现的同时,也使电动自行车控制器的性能得到更多的提升。

关键词:电动自行车、控制器、PSoC、无刷直流电机Design of electric bicycle based on PSoC microcontroller Abstract: Electric vehicles with zero pollution, high efficiency, low noise characteristics is considered to be the real "green transport", while the electric car is limited by motor power, battery, volume entering the market there is difficulty, electric bicycles can be quicklydevelopments. The electric bicycle performance depends on the battery, motor and controller, brushless DC motor is the main components of the electric bicycle.The whole system is only a PSoC chip to achieve all of the above control function based on the PSoC CY8C24533 electric bicycle controller, analog, digital and routing resources, and therefore does not require any peripheral chips, the number of external components is also a corresponding reduction. This fully demonstrates the advantage of the SoC chip resources have been fully and effectively use. CY8C24533's analog, digital, and routing resources are also programmable, so that the wisdom and creativity of the design engineers to be more embodied at the same time, electric bicycle controller performance is more improved.KeyWords:Electric bikes、Controller、PSoC、brushless DC motor目录前言 (1)第一章PSoC可编程片上系统 (3)1.1可编程片上系统(Programmable System-on-Chip, PSoC) (3)1.2 PSoC的内部资源 (3)第二章智能控制器的功能和总体方案设计 (7)2.1 控制器功能介绍 (7)2.2系统总体方案设计 (7)第三章智能控制器硬件方案设计 (10)3.1 PSoC开发环境介绍 (10)3.1.1 PSoC开发环境 (10)3.1.2 与传统单片机系统设计方案的比较 (10)3.2电动自行车智能控制器 (12)3.2.1电源电路 (12)3.2.2 触发电路 (12)3.2.3 过流保护电路 (13)3.2.4 欠压保护电路 (14)3.2.5霍尔传感器检测电路 (14)3.2.6助力 (15)3.2.7逆变电路 (16)3.2.8转把电路 (16)3.2.9调速刹车电路 (17)3.3电动车自行车控制器系统 (18)3.4PWM输出 (18)第四章系统软件设计 (20)4.1 程序整体流程图 (22)4.2具体软件设计方案 (23)4.2.1 电机调速方案 (23)4.2.2 电机及控制器保护方案 (24)4.2.3欠压保护方案 (25)4.2.4 刹车控制方案 (25)第五章计中遇到的问题及解决方法 (27)5.1 设计中遇到的问题 (27)5.2 绘制原理图中遇到的问题 (27)第六章结论 (29)谢辞 (30)参考文献 (31)附录 (32)附录1电动车控制器图 (32)附录2 PCB图 (33)附录3 源程序 (34)前言电动车作为一种新型的代步工具,已经实实在在地为人民群众所接受。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机控制的电动自行车驱动系统程序LIST P=16F876#INCLUDE P16F876.INC;以下采用块定义的方法定义单片机内部寄存器CBLOCK 0X20 ;自定义寄存器从0X20开始FLAG1 ;FLAG1作为标志寄存器VOLTAGEH ;电池电压高位寄存器VOLTAGEL ;电池电压低位寄存器TSH;手柄电压高位寄存器TSL;手柄电压低位寄存器STA TE1 ;霍尔信号采样暂存器1STA TE2 ;霍尔信号采样暂存器2STA TE3 ;霍尔信号采样暂存器3DELAY ;延时计数器COUNT_VOL ;低电压采样次数计数器ACCaLO ;ACCa~ACCd为运算用的寄存器ACCaHIACCbLOACCbHIACCcLOACCcHIACCdLOACCdHITEMP ;临时寄存器TEMP1 ;临时寄存器(中断用)SIGN ;符号寄存器COUNT ;临时寄存器W_STACK ;中断时用于暂存W寄存器值ST_STACK ;中断时用于暂存STATUS寄存器值ENDC;***********标志寄存器位定义以及程序中常数定义***********CONSTANT VOLTAGE=0 ;采电池电压标志位CONSTANT PWM=1 ;输出下一次PWM信号标志位CONSTANT LOWPOWER=2 ;低电压标志位CONSTANT SHUTDOWN=3 ;刹车标志位CONSTANT OFF=4 ;复位标志位CONSTANT AND=0XE0 ;AND用于获取有效霍尔信号CONSTANT FULLPWM=0XFF ;当PWM输出全高时,输入CCPR1L中的值CONSTANT VOLOFFH=0X02 ;当电池电压低于24AH时, 低压保护2.86V/31.5 VCONSTANT VOLOFFL=0X4ACONSTANT VOLONH=0X02 ;当电池电压大于266H时,允许电机重开3V/33VCONSTANT VOLONL=0X66CONSTANT TSONH=0X01 ;刹车后手柄复位值低于133H,则允许电机重新启动CONSTANT TSONL=0X33;***复位矢量入口(单片机复位时,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 ;如都不是,则中断返回;************逆变桥输出控制表*************;逆变桥输出控制表,其输出对应6种状态,霍尔信号来自B口RB7、RB6、RB5,C口输出低电平有;效,其中RC1,RC2不作为触发电路输出口,故表中使其为高电平ORG 0X0020 ;表程序从0X0020单元开始存放(也可以不从这开始)OUT_TABLEADDWF 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 0X0CF ;如霍尔信号为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单元开始存储MAINMOVLW 0X0FF ;由于C口上电复位值不确定,必须先关闭所有MOS管MOVWF PORTCBSF STATUS,RP0 ;选择存储体1MOVLW 0X02 ;设置RC1为输入口,其它为输出口,其中RC2为PWM MOVWF TRISC ;输出口,其它位为触发信号输出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采样周期寄存MOVWF CCP2CON ;器MOVLW 0X081 ;选择AD转换时钟为32分频,选择AN0通道,并使ADMOVWF 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 PR2MOVLW 0X082 ;AD采样结果右移,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 ;开CCP2,对手柄进行等间隔采样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;刹车中断到来?GOTO 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中断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 ;采样完毕?GOTO BREAK4BCF PIR1,ADIFBCF STATUS,CMOVF 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,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 0X1FMOVWF ACCbLOCALL D_addBTFSS ACCbHI,7 ;TS>1.1V?GOTO PWM1 ;是,转PWM1MOVLW FULLPWM ;否则输出全高MOVWF CCPR1LRETURNPWM1 MOVLW 0XFD ;0X27B=3.1VMOVWF ACCbHIMOVLW 0X85MOVWF ACCbLOCALL D_addBTFSC ACCbHI,7 ;TS>3.1V?GOTO PWM3PWM2 CLRF CCPR1LBCF CCP1CON,4BCF CCP1CON,5RETURNPWM3 MOVLW 0X0FF ;1.1 V对应的采样值补码送加数MOVWF ACCbHIMOVLW 0X1FMOVWF ACCbLOCALL D_add ;TS-1.1VCLRF ACCaHI ;系数K=56=38H送乘数MOVLW 0X3FMOVWF ACCaLOCALL D_mpy ;得到放大128倍的低电平时间K*(TS-1.1V)MOVF ACCcHI,0 ;将结果取出MOVWF ACCaHIMOVF ACCcLO,0MOVWF ACCaLOMOVLW 0X64 ;PWM周期T减去低电平时间,得到高电平时间MOVWF ACCbHICLRF ACCbLOCALL D_subBTFSC ACCbHI,7 ;低电平时间是否大于周期?GOTO PWM2 ;是,输出全压RLF ACCbLO ;否则,输出与低电平时间对应的高电平时间RLF ACCbHIMOVF ACCbHI,0 ;D10~D2位送CCPR1LMOVWF CCPR1LBCF CCP1CON,5 ;D0位送CCP1CON5BTFSC ACCbLO,7BSF CCP1CON,5BCF CCP1CON,4 ;D.1位送CCP1CON4BTFSC 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 ACCaHIMOVF 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 ;是,等待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 ADRESL,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 ;分离出有效信息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 STATE3XORWF STATE1,0 ;与第一次状态相同吗?BTFSC STATUS,ZRETURN ;相同则返回MOVF STATE2,0 ;否则再与第二次状态相比较XORWF STATE3,0BTFSS STATUS,ZGOTO SAMPLE ;三次状态均不相同则重新采样MOVF STATE2,0 ;第三次状态与第二次相同,则将正确状态赋予STATE1并MOVWF STATE1 ;返回RETURN;************** MOSFET触发信号输出子程序************** OUTPUT SW APF STA TE1,1 ;STATE1寄存器高低半字节互换BCF STATUS,C ;清C位,并将STA TE1寄存器左移一位RRF STATE1,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 ;是,作相应的处理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,PWMBTFSS 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 ADRESL,0BCF STATUS,RP0MOVWF VOLTAGELBSF FLAG1,LOWPOWER;是,置相应标志位CALL POP ;中断返回RETFIE;**************中断保护现场子程序****************** PUSH MOVWF W_STACK ;暂存W寄存器MOVF STATUS,0 ;暂存STA TUS寄存器MOVWF ST_STACKRETURN ;子程序返回;**************中断恢复现场子程序************** POP MOVF ST_STACK,0 ;恢复STA TUS寄存器值MOVWF STATUSMOVF W_STACK,0 ;恢复W寄存器值RETURN ;子程序返回;**************初始化子程序**************** SETUP MOVLW .15 ;初始化TEMPMOVWF TEMPMOVF ACCbHI,0 ;ACCb送ACCdMOVWF ACCdHIMOVF ACCbLO,0MOVWF ACCdLOCLRF ACCbHI ;清ACCbCLRF ACCbLORETLW 0;**********乘除法运算确定结果符号子程序**********S_SIGN MOVF ACCaHI,0 ;ACCaHI异或ACCbHI,结果送SIGN单元XORWF ACCbHI,0MOVWF SIGNBTFSS ACCbHI,7 ;ACCb为负?GOTO CHEK_A ;否,检查ACCaCALL NEG_BCHEK_A BTFSS ACCaHI,7 ;ACCa为负?RETLW 0 ;ACCa和ACCb均为负,返回GOTO NEG_A ;ACCa为负,取补GOTO MAINEND;程序结束。

相关文档
最新文档