6 通道射频遥控器采用 CC2500 射频收发器模块和 microchip 的 PIC16F1847 微控制器设计。发射器配有 6 个轻触开关、4 个...
电动单车主板源代码和电路图 (PIC16F876制作)
LISTP=16F876
#INCLUDEP16F876.INC
;以下采用块定义的方法定义 单片机 内部寄存器
CBLOCK0X20;自定义寄存器从0X20开始
FLAG1;FLAG1作为标志寄存器
VOLTAGEH;电池电压高位寄存器
VOLTAGEL;电池电压低位寄存器
TSH;手柄电压高位寄存器
TSL;手柄电压低位寄存器
STATE1;霍尔信号采样暂存器1
STATE2;霍尔信号采样暂存器2
STATE3;霍尔信号采样暂存器3
DELAY;延时计数器
COUNT_VOL;低电压采样次数计数器
ACCaLO;ACCa~ACCd为运算用的寄存器
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.86V/31.5V
CONSTANTVOLOFFL=0X4A
CONSTANTVOLONH=0X02;当电池电压大于266H时,允许电机重开3V/33V
CONSTANTVOLONL=0X66
CONSTANTTSONH=0X01;刹车后手柄复位值低于133H,则允许电机重新启动
CONSTANTTSONL=0X33
;***复位矢量入口( 单片机 复位时,PC指针指向程序存储器0X0000单元)***
ORG0X0000
STARTGOTOMAIN;复位后程序进入主程序
;***中断矢量入口程序(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_TABLE
ADDWFPCL,1
RETLW0X0AF;如霍尔信号为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单元开始存储
MAIN
MOVLW0X0FF;由于C口上电复位值不确定,必须先关闭所有MOS管
MOVWFPORTC
BSFSTATUS,RP0;选择存储体1
MOVLW0X02;设置RC1为输入口,其它为输出口,其中RC2为PWM
MOVWFTRISC;输出口,其它位为触发信号输出
BCFSTATUS,RP0;选择存储体0
CLRFPIR1;清所有中断标志位
CLRFINTCON;禁止所有中断
MOVLW0X01;设置TMR2预分频值为4
MOVWFT2CON
MOVLWFULLPWM;初始化PWM工作循环寄存器,使PWM占空比为1
MOVWFCCPR1L;输出电压为零
MOVLW0XFF;设置CCP1工作于PWM方式
MOVWFCCP1CON
MOVLW0X0B;CCP2工作于特殊事件触发方式,用作AD采样周期寄存MOVWFCCP2CON;器
MOVLW0X081;选择AD转换时钟为32分频,选择AN0通道,并使AD
MOVWFADCON0;转换允许
CLRFTMR2;TMR2计数器清零
CLRFTMR1H;TMR1计数器清零
CLRFTMR1L
CLRFT1CON;TMR1预分频为1,关闭振荡器,工作于定时工作方式
MOVLW0X08;初始化AD采样周期寄存器,T=512μs
MOVWFCCPR2H
MOVLW0X00
MOVWFCCPR2L
BSFSTATUS,RP0;选择存储体1
MOVLW0XEF;RB口高3位用于采样霍尔信号,RB0为刹车中断,设置为
MOVWFTRISB;输入,其它未用
MOVLW0XC7;初始化PWM频率为5kHz
MOVWFPR2
MOVLW0X082;AD采样结果右移,RA口引脚均为模拟输入
MOVWFADCON1
BSFOPTION_REG,INTEDG;选择INT在下降沿产生中断
BCFSTATUS,RP0
CALLSAMPLE;确定当前转子位置
CALLOUTPUT;根据采得的状态值触发相应的MOSFET
MOVLW0X0D8;开总中断、外围中断、INT中断和RB口电平变化中断允
MOVWFINTCON;许
BCFPIE2,CCP2IE;CCP2中断禁止
BSFPIE1,ADIE;打开AD采样中断
CLRFFLAG1;清标志位寄存器
CLRFCOUNT_VOL;清电池电压采样计数器
BSFT1CON,TMR1ON;开CCP2,对手柄进行等间隔采样
BSFT2CON,TMR2ON;开CCP1
RETESTBTFSSFLAG1,PWM;TS采样完毕?
GOTONEXT1;没有,转NEXT1
CALLOUT_PWM;TS采样完毕,送出相应的PWM信号
BCFFLAG1,PWM;清PWM允许标志
NEXT1BTFSSFLAG1,LOWPOWER;电压采样完毕?
GOTONEXT2;没有转NEXT2
CALLPOWER;是,调用电压保护子程序处理数据
BTFSCFLAG1,OFF;是否需要复位?
GOTOMAIN;是, 单片机 复位
NEXT2BTFSSFLAG1,SHUTDOWN;刹车中断到来?
GOTORETEST;否,回转RETEST
CALLBRAKEON;是,调用刹车处理子程序
CLRWDT
BTFSCFLAG1,OFF;OFF=0?
GOTOMAIN;否, 单片机 复位
GOTORETEST;是,回转RETEST
;***************刹车处理子程序******************
BRAKEONBCFFLAG1,OFF;清复位标志
BCFFLAG1,SHUTDOWN;是,清相应标志位
BTFSSPORTB,0;INT引脚仍为1?
RETURN;否,中断是由干扰引起的,返回
BSFSTATUS,RP0
BCFPIE1,ADIE;禁止AD采样中断
BCFSTATUS,RP0
BCFINTCON,INTE;关RB0中断
MOVLWFULLPWM;PWM输出全高
MOVWFCCPR1L
BCFT1CON,TMR1ON;关闭手柄采样
BREAK2BTFSCADCON0,GO;正在进行AD采样?
GOTOBREAK2;是,等待AD采样完毕
BCFADCON0,CHS0
BCFADCON0,CHS1;选择0采样通道,准备采样手柄电压
BCFPIR1,ADIF;清AD采样中断标志位
MOVLW0X06;延时
MOVWFCOUNT
BREAK3DECFSZCOUNT
GOTOBREAK3
BREAK5BSFADCON0,GO;采样TS值
BREAK4BTFSSPIR1,ADIF;采样完毕?
GOTOBREAK4
BCFPIR1,ADIF
BCFSTATUS,C
MOVFADRESH,0;当前TS值送被减数
MOVWFACCbHI
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFACCbLO
MOVLWTSONH;1.5V所对应的采样值送减数
MOVWFACCaHI
MOVLWTSONL
MOVWFACCaLO
CALLD_sub;当前TS值减1.5V
MOVLWFULLPWM
MOVWFCCPR1L
CLRWDT
BTFSSACCbHI,7;当前电压值大于1.5V?
GOTOBREAK5;是,重新采样
BTFSCPORTB,0
GOTOBREAK5
BSFFLAG1,OFF;否,置相应的标志位
RETURN;返回
;***************开环PWM输出子程序****************
OUT_PWMBCFFLAG1,PWM;清相应的标志位
MOVFTSH,0;将调速手柄采样值送至被加数
MOVWFACCaHI
MOVFTSL,0
MOVWFACCaLO
MOVLW0XFF;FF1F补码为0XE1,即1.1V
MOVWFACCbHI
MOVLW0X1F
MOVWFACCbLO
CALLD_add
BTFSSACCbHI,7;TS>1.1V?
GOTOPWM1;是,转PWM1
MOVLWFULLPWM;否则输出全高
MOVWFCCPR1L
RETURN
PWM1MOVLW0XFD;0X27B=3.1V
MOVWFACCbHI
MOVLW0X85
MOVWFACCbLO
CALLD_add
BTFSCACCbHI,7;TS>3.1V?
GOTOPWM3
PWM2CLRFCCPR1L
BCFCCP1CON,4
BCFCCP1CON,5
RETURN
PWM3MOVLW0X0FF;1.1V对应的采样值补码送加数
MOVWFACCbHI
MOVLW0X1F
MOVWFACCbLO
CALLD_add;TS-1.1V
CLRFACCaHI;系数K=56=38H送乘数
MOVLW0X3F
MOVWFACCaLO
CALLD_mpy;得到放大128倍的低电平时间K*(TS-1.1V)
MOVFACCcHI,0;将结果取出
MOVWFACCaHI
MOVFACCcLO,0
MOVWFACCaLO
MOVLW0X64;PWM周期T减去低电平时间,得到高电平时间
MOVWFACCbHI
CLRFACCbLO
CALLD_sub
BTFSCACCbHI,7;低电平时间是否大于周期?
GOTOPWM2;是,输出全压
RLFACCbLO;否则,输出与低电平时间对应的高电平时间
RLFACCbHI
MOVFACCbHI,0;D10~D2位送CCPR1L
MOVWFCCPR1L
BCFCCP1CON,5;D0位送CCP1CON5
BTFSCACCbLO,7
BSFCCP1CON,5
BCFCCP1CON,4;D.1位送CCP1CON4
BTFSCACCbLO,6
BSFCCP1CON,4
RETURN;返回
;****************刹车中断服务程序***************
BRAKECALLPUSH;保存现场
BCFSTATUS,RP0;回存储区0
BSFFLAG1,SHUTDOWN;置相应标志位
BCFINTCON,INTF;清中断标志位
CALLPOP;恢复现场
RETFIE;中断返回
;***************低电压保护处理子程序*****************
POWERBCFFLAG1,LOWPOWER;清相应的标志位
MOVFVOLTAGEH,0
MOVWFACCaHI
MOVFVOLTAGEL,0
MOVWFACCaLO
MOVLWVOLOFFH
MOVWFACCbHI
MOVLWVOLOFFL
MOVWFACCbLO
CALLD_sub
BTFSCACCbLO,7;判断当前电池电压值是否低于保护电压(32V)
RETURN;不是,返回
BCFINTCON,INTE
BCFT1CON,TMR1ON;关闭电流采样
MOVLWFULLPWM
MOVWFCCPR1L
BSFSTATUS,RP0
BCFPIE1,ADIE;禁止AD采样中断
BCFSTATUS,RP0
POWER3BTFSCADCON0,GO;正在进行AD采样?
GOTOPOWER3;是,等待AD采样完毕
BCFPIR1,ADIF;清AD采样中断标志位
BCFADCON0,CHS0
BSFADCON0,CHS1;选择电压采样通道
MOVLW0X06;延时等待通道转换完成
MOVWFCOUNT
POWER4DECFSZCOUNT
GOTOPOWER4
POWER6BSFADCON0,GO;采样电池电压值
POWER5BTFSSPIR1,ADIF;采样完毕?
GOTOPOWER5
BCFPIR1,ADIF;清AD中断标志位
BCFSTATUS,C
MOVFADRESH,0;当前电压值送被加数
MOVWFACCbHI
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFACCbLO
MOVLWVOLONH;35V电压值送被加数
MOVWFACCaHI
MOVLWVOLONL
MOVWFACCaLO
CALLD_sub;当前电压值减35,与重开电压进行比较
MOVLWFULLPWM
MOVWFCCPR1L
CLRWDT
BTFSCACCbHI,7;当前电压值大于35?
GOTOPOWER6;否,重新采样
BSFFLAG1,OFF;是,置相应的标志位
RETURN;返回
;***电机转子位置采样子程序,状态采样子程序,出口地址:STATE1***
SAMPLEMOVLWAND;读RB口
ANDWFPORTB,0;分离出有效信息
MOVWFSTATE1;暂存状态值
MOVLW0X08
MOVWFDELAY
DEL1DECFSZDELAY;延时6μs
GOTODEL1
MOVLWAND;读RB口
ANDWFPORTB,0;分离出有效信息,并暂存
MOVWFSTATE2
XORWFSTATE1,0;与上一次状态值相异或
BTFSCSTATUS,Z
RETURN;两个状态值相等则返回
MOVLW0X06;否则延时4μs
MOVWFDELAY
DEL2DECFSZDELAY
GOTODEL2
MOVLWAND;读RB口
ANDWFPORTB,0;提取有效信息并暂存
MOVWFSTATE3
XORWFSTATE1,0;与第一次状态相同吗?
BTFSCSTATUS,Z
RETURN;相同则返回
MOVFSTATE2,0;否则再与第二次状态相比较
XORWFSTATE3,0
BTFSSSTATUS,Z
GOTOSAMPLE;三次状态均不相同则重新采样
MOVFSTATE2,0;第三次状态与第二次相同,则将正确状态赋予STATE1并
MOVWFSTATE1;返回
RETURN
;**************MOSFET触发信号输出子程序**************
OUTPUTSWAPFSTATE1,1;STATE1寄存器高低半字节互换
BCFSTATUS,C;清C位,并将STATE1寄存器左移一位
RRFSTATE1,0;将采样所得结果放至W低三位
CALLOUT_TABLE;查表获得输出值
MOVWFPORTC;将输出值输出至RC口
RETURN
;***************RB口电平变化中断服务程序**************
SAMPRBCALLPUSH;现场保护
BCFSTATUS,RP0
CALLSAMPLE;采样RB口状态
CALLOUTPUT;根据RB口状态触发相应的MOSFET
CALLPOP;恢复现场
BCFINTCON,RBIF;清RB口电平变化中断标志
RETFIE;中断返回
;************AD采样中断服务程序***************
ADCALLPUSH;保护现场
BTFSCFLAG1,VOLTAGE;是电压采样?
GOTOSET_VOL;是,作相应的处理
SET_TSBCFADCON0,CHS0;AD采样值是TS,则选择1采样通道
INCFCOUNT_VOL;电压采样周期寄存器值加1
BTFSSSTATUS,Z;电压采样周期到?
GOTOAD4
BCFADCON0,CHS0;是,选择2采样通道
BSFADCON0,CHS1
BSFFLAG1,VOLTAGE;置相应的标志位
AD4BCFPIR1,ADIF;清AD中断标志
MOVFADRESH,0;采样值送寄存器暂存
MOVWFTSH
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFTSL
BSFFLAG1,PWM
BTFSSFLAG1,VOLTAGE;是否需要进行电压采样?
GOTOAD6
MOVLW0X05;是,延时后采样电压
MOVWFTEMP1
AD5DECFSZTEMP1
GOTOAD5
BSFADCON0,GO
AD6CALLPOP;恢复现场,中断返回
RETFIE
SET_VOLBCFADCON0,CHS1;如果采样值为电压值,则选择0通道
BCFADCON0,CHS0
BCFPIR1,ADIF;清中断标志位
BCFFLAG1,VOLTAGE;清相应标志位
MOVFADRESH,0;将采样结果放入被减数寄存器
MOVWFVOLTAGEH
BSFSTATUS,RP0
MOVFADRESL,0
BCFSTATUS,RP0
MOVWFVOLTAGEL
BSFFLAG1,LOWPOWER;是,置相应标志位
CALLPOP;中断返回
RETFIE
;**************中断保护现场子程序******************
PUSHMOVWFW_STACK;暂存W寄存器
MOVFSTATUS,0;暂存STATUS寄存器
MOVWFST_STACK
RETURN;子程序返回
;**************中断恢复现场子程序**************
POPMOVFST_STACK,0;恢复STATUS寄存器值
MOVWFSTATUS
MOVFW_STACK,0;恢复W寄存器值
RETURN;子程序返回
;**************初始化子程序****************
SETUPMOVLW.15;初始化TEMP
MOVWFTEMP
MOVFACCbHI,0;ACCb送ACCd
MOVWFACCdHI
MOVFACCbLO,0
MOVWFACCdLO
CLRFACCbHI;清ACCb
CLRFACCbLO
RETLW0
;**********乘除法运算确定结果符号子程序**********
S_SIGNMOVFACCaHI,0;ACCaHI异或ACCbHI,结果送SIGN单元
XORWFACCbHI,0
MOVWFSIGN
BTFSSACCbHI,7;ACCb为负?
GOTOCHEK_A;否,检查ACCa
CALLNEG_B
CHEK_ABTFSSACCaHI,7;ACCa为负?
RETLW0;ACCa和ACCb均为负,返回
GOTONEG_A;ACCa为负,取补
相关文章
发表评论