②单片机HT46R47的内部结构逻辑如图1-9:

③单片机HT46R47的基本功能
A、HALD和唤醒功能可降低功耗
B、在VDD=5V,系统频率为8MHZ时,指令周期为0.5μS
C、欠压监控保护、刹车关闭电路
D、终端功率斩波电路
E、一个8位的PWM(脉宽可调)输出通道,与输入/输出口共用引脚
F、位操作指令
G、查表指令,表格内容字长14位
H、63条指令
I、指令执行时间为1或2个指令周期
J、低电压复位功能
(3)单片机HT46R47各脚的定义,如图1-10:

(4)线路设计说明
HT46R47有2K×14的程序空间,比业内很多品牌的MCU多1K程序,可有更多的程序空间实现辅助功能。用A/D转换完成:转把采样、电流采样、电池电压测量、PWM输出控制电机转速、巡航定速(手动、自动)、助力功能、制动断电、故障自检、防飞车、显示故障点等诸多功能。利用内部振荡器,只要在OSCI上接电阻R11、C10即可产生8MHZ时钟。
①欠压保护:由R3、R4、C5构成分压电路,电源经R3、R4所分得的电压输入到MCUA/D口适时监控电源电压,一旦低于所设定的电压值MCU便产生中断,进入欠压保护状态。
②助力:助力脉冲信号给MCU5脚。
③转把、限速:转把电压1~4V信号,输入给MCU6脚A/D口,外部限速经一下拉电阻,将转把电压下拉一定的幅值(R5、R6分压)。
④显示电路:由MCU的2、3、4脚输出指令数据,与外设译码电路串口联结,构成显示电路,实时显示电动自行车的运行状态。
⑤刹车:MCU的18脚接刹车信号,当18脚电压为低电平时,即刹车接地,MCU产生中断,PWM输出停止。
⑥模式选择:MCU的1脚接模式选择信号,当1脚电压为低电平时,即模式选择。
⑦电流闭环控制回路
由外设IC6A、R28、R29构成的同相放大器、检测信号电阻R26、及R42、C17构成的RC滤波电路、和MCU(内部9位A/D)的8脚输入口构成电流闭环控制回路。工作过程是:从R26上获取压降,既电流检测信号,RC滤波后输入到放大电路的输入端,再经放大后为MCU(8脚)A/D提供电流检测信号,形成电流回路的闭环控制。
⑧PWM终端功率斩波电路
主要由MOS功率开关管T5、快恢复二极管D3、电机M、施密特放大器(T1、T2、T3、D2、)等构成,工作过程是:MCU的PWM信号为高电平时,经三级开关放大为MOS管栅极电压,使MOS管导通;PWM信号为低电平时,T1截止、T2导通,MOS管栅极电压为低,使MOS管关断。快恢复二极管D3的作用是:将电机关断时所产生的反电势续流。
⑨输出短路中断保护电路
由外设IC6B及R42、R43基准分压电路构成比较器与MCU的内部中断口17脚构成,检测信号从功率斩波电路中R26上取得,短路电流超过预设值后,比较器的输出由原来的低电平转为高电平到17脚,使MCU产生中断,实现输出短路保护。
⑩稳压电路
由降压电阻R1、集成稳压块IC3构成。
电源电压经R1降压后,稳压管Z1将电压钳位在15V,再经稳压块78L05稳压在5V。
3、软件设计
软件设计主要包括以下几个功能模块
(1)上电自检
(2)面板显示通讯程序
(3)助力信号测量
(4)转把控制
(5)电机速度控制
(6)电池电压测量
(7)定速刹车等控制
4.软件运行流程,如图1-11:
5.软件部分源代码(C语言)
注:单片机HT46R47资源定义部分,可结合HT46R47资料阅读。
voidInitial(){//MCU初始化
#asm
mova,40h
mov[01h],a
clrram:
clr[00h]
inc[01h]
mova,0ffh
suba,[01h]
snz[0ah].2
jmpclrram
#endasm
_pwm=0x00;
_pdc=0x00;//0000,0000
_pd=0x00;
_pac=0x78;//0111,1000
_pbc=0x0f;//0000,1111
_pa=0x00;
//_pb=0x00;
_intc=0x06;
_tmr=0x00;//初始化一下定时器0,和定时器1
_tmrc=0x83;//0x83;//1000,0011;8分频1M4US*256=2MS
}
voidisr_8()//定时哭中断
{
TMR*ptmr;//;为记时器处理*
INT8Ui;
ptmr=&TmrTbl[0];
for(i=0;i<TMR_MAX_TMR;i++){
if(ptmr->TmrEn==TRUE){
if(ptmr->TmrCtr>0){
ptmr->TmrCtr--;
if(ptmr->TmrCtr==0){
ptmr->TmrEn=FALSE;ptmr->TmrEnd=TRUE;
}
}
}
ptmr++;
}
}
voidLedScan()//74LS164显示驱动
{
INT8Uj;
if((DispSegEn[0]=1)|(DispSegEn[1]=1)){
for(DispSegTblIX=0;DispSegTblIX<2;DispSegTblIX++){
dispscan=DispSegTbl[DispSegTblIX];
for(j=0;j<8;j++){
SCL_164=0;
if(dispscan&0x80){
SDA_164=0;
}else{
SDA_164=1;
}
SCL_164=1;
dispscan<<=1;
}
}
DispSegEn[0]=0;
DispSegEn[1]=0;
}
}
voidHandCheck()//转把计算
if(HandVol>HAND_VOL_MIN){
if((HandVol-HAND_VOL_MIN)>127){
PwmValHand=0xFF;
}else{
PwmValHand=(HandVol-HAND_VOL_MIN)<<1;//PWM输出
}
if(PwmValHand>=PWM_OUT_MAX){
PwmValHand=PWM_OUT_MAX;
}
}else{
PwmValHand=0;
}
}
voidisr_4(){//短路保护
PWM_OUT_IO=0;
RunErr=TRUE;
}
voidmain()
{
_pwm=0x00;
if(_to==0){
Initial();
}
_clrwdt();
TmrInit();//记时器初始化
TmrSetT(0,0x03);//24ms测一次手柄
TmrStart(0);
TmrSetT(1,0x50);//自检时测手柄间隔
TmrStart(1);
TmrSetT(2,0x02);//4MS测助力
TmrStart(2);
while(1){
_clrwdt();
KeyMenu();
HlpPower();//助力
HandCheck();//手柄采样
BatCheck();//电池测量
PwmValCu();
……