📄 stc5404ad无刷控制器.c
字号:
TH1=0X3C;TL1=0X0B;TR1=1;
TH0=0x3c;TL0=0x0b;TR0=1;
// pwm_bls=200;
}
else
{dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
TH1=0X3C;TL1=0X0B;TR1=0;
TH0=0X3C;TL0=0X0B;TR0=1;
}
}
else
{TR0=1;}
}
//********************定时器1中断函数*********************************************
void time1(void)interrupt 3
{ TR1=0;TH1=0x3c;TL1=0x0b;
timejs++;
if(timejs==12) //中断次数等于给定的次数就取反LED
{if(zbyx_bz==0) //转把归0标志为0,可以闪灯
{led=~led;timejs=0;TR1=1;}
}
if(timejs==80)
{if(dz_bz1==1)
{TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
else
{dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
}
TR1=1;
}
//*******************电机堵转转函数***********************************************
//根据2S定时内一直堵转的话置DZ_BZ为1,本函数检测到该标志为1立即关闭所有输出
//并闪烁指示灯间隔快闪2次提示,最后监控转把归0后可以退出本函数重新启动
void dgdz(void)
{
while(dz_bz1==1)
{pwm_bls=100;he_gzjc();pwm_out();
if(dz_bz==1)
{ TR0=0;TR1=0;
pca_pwm0=0x03; //关3路PWM信号
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
set_p13_adc(); //电机进入保护后开始等待转把归零后可以重新启动
do{ledcs=2;led_k();get_ad_dy();} //间隔开闪2次提示堵转保护,测量转把电压是否归0
while(adc_data>=61); //没有归0执行DO循环体语句
led=1;dz_bz=0;dz_bz1=0; //转把归0后关指示灯清堵转标志
}
}
}
//********************外中断0函数限流或康铜开路************************************
void intt0()interrupt 0
{
TR0=0;TR1=0; //关PWM频率
pca_pwm0=0x03; //关3路PWM信号
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
set_p13_adc();
get_ad_dy();
while(adc_data>=61)
{ledcs=4;led=0;get_ad_dy();}
led=1;
}
//********************PWM驱动桥驱动输出函数****************************************
void pwm_out(void) //入口:pwm_bl里有转把调速参数.出口:输出全桥驱动信号
{
switch(hehc) //多分支语句根据霍尔位置输出对应节拍
{case 0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;cs1=0x01;break;} //第1拍ccap0h刷新参数开C下桥A上桥
//-------------------------------------------------------------
case 0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;cs2=0x03;break;} //第2拍ccap1h刷新参数开C下桥b上桥
//-------------------------------------------------------------
case 0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;cs3=0x02;break;} //第3拍ccap1h刷新参数开a下桥b上桥
//-------------------------------------------------------------
case 0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;cs1=0x06;break;} //第4拍ccap2h刷新参数开a下桥c上桥
//-------------------------------------------------------------
case 0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;cs2=0x04;break;} //第5拍ccap2h刷新参数开b下桥c上桥
//-------------------------------------------------------------
case 0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;cs3=0x05;break;} //第6拍ccap0h刷新参数开b下桥a上桥
}
}
//********************上电初始化函数**********************************************
void sd_csh(void)
{P1=0xff;zb=0;P2=0xff;P3=0xff;
pwmal=0; //上电复位后首先关闭3组下桥
pwmbl=0; //
pwmcl=0; //
adc_power(); //调AD转换用初始化函数
pwm_sz(); //调PWM输出用初始化函数
time_csh(); //调两个定时器初始化函数
}
//********************上电防飞车函数归0后LED正常闪烁******************************
void sd_ffc(void)
{
set_p13_adc(); //调转把电压转换通道
get_ad_dy(); //上电后测量转把电压是否归零
while(adc_data>=61) //61为1.2V转换值转把如果大于1.2V执行循环体语句等待归0
{ledcs=2;led_k(); //循环体语句,2次间隔性快闪灯
get_ad_dy(); //循环体语句,重新检测电压等待归0
}
TR0=0; //关PWM频率否则干扰闪灯
timebj=12; //归0后定时器中断10次闪烁一次LED
TR1=1; //归0后开定时器1-LED闪烁
}
//*************刹车函数自动选择是断电还是ABS刹车功***************************
void sc_stop(void) //ABS刹车有外接口对地选择,对地时为ABS功能
{
if(shache==0) //判断语句刹车口等于0执行大语句1
{ abs=1;
//大语句体1
if(abs==1) //判断ABS选择不为0就执行普通刹车断电,否则执行ABS刹车
//==========普通刹车断电==================================================
{
TR0=0;led=0; //关测速定时器,亮刹车灯
pca_pwm0=0x03; //关3路PWM信号AH
pca_pwm1=0x03; //关3路PWM信号BH
pca_pwm2=0x03; //关3路PWM信号CH
pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
//----------------------------------------------------------------------
while(shache==0) //循环语句,刹车口没松开就一直等待
{delay(500);} //语句体,延时抗干扰防止抖动
hehc_bl=0;led=1; //刹车口松开后清霍尔变量内存再关刹车灯
//----------------------------------------------------------------------
for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下两句为刹车口松开后减缓冲击
{he_gzjc();pwm_out();} //从最低速度加高到实时的转把设定速度
}
//===========EABS刹车断电=====================================================
else //ABS功能已选择进入ABS刹车
{ //
TR0=0;led=0; //关测速定时器,亮刹车灯
pca_pwm0=0x03; //关3路PWM信号AH
pca_pwm1=0x03; //关3路PWM信号BH
pca_pwm2=0x03; //关3路PWM信号CH
pwmal=0;pwmbl=0;pwmcl=0; //关闭3个下桥:AL-BL-CL
//-------------------------------------------------------------------------
do //do-while语句先执行do再执行while判断表达式
{
for(h=100;h>0;h--) //每检测一次没松开就先执行1万次ABS点刹,防止刹车抖动干扰
{ pwmal=0;pwmbl=0;pwmcl=0;
delay1(1);
pwmal=1;pwmbl=1;pwmcl=1; //ABS点刹
delay1(80);
}
}
while(shache==0); //内镶循环语句,只要刹车没松开就一直开ABS点刹制动
hehc_bl=0;led=1; //刹车口为1后清霍尔变量内存再关刹车灯
pwmal=0;pwmbl=0;pwmcl=0; //点刹后要关闭所有下桥防止刹车松开后车推不动
for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下几句刹车后软启动,减少刹车后高速冲击
{he_gzjc();pwm_out();}
}
//---------------
}
}
//*******************欠压检测函数**************************************************
void qy_jc(void)
{ //连续3次测量电池电压抗干扰
set_p15_adc();
get_ad_dy(); //第1次测量电池电压
qy_1=adc_data; //保存第1次测量数据
get_ad_dy(); //第2次测量电池电压
qy_2=adc_data; //保存第2次测量数据
get_ad_dy(); //第3次测量电池电压
qy_3=adc_data; //保存第3次测量数据
//比较取舍法,只有其中两次相同才有效
if(qy_1==qy_2) //比较第1次和第2次结果是否相同,否转下一轮判断
{qy_bf=qy_1;adc_data=qy_1;} //相同的话本次测量有效有效,保存本次数据备份后直接退出IF语句
else //第1次和第2次的结果不同,
{if(qy_2==qy_3) //再判断第2次和第3次的结果相同吗,否转下一轮判断
{qy_bf=qy_2;adc_data=qy_2;} //相同的话本次测量有效有效,保存本次数据备份后直接退出IF语句
else //第1次和第2次的结果不同,
{if(qy_1==qy_3) //再判断第1次和第3次的结果相同吗,3次都不同的话取旧备份数据
{qy_bf=qy_3;adc_data=qy_3;}////相同的话本次测量有效有效,保存本次数据备份后直接退出IF语句
else //3次都不同取旧备份数据
{adc_data=qy_bf;}
}
}
if(adc_data<=158) //电压小于等于3.1v吗,不等于直接退出
{TR0=0;TR1=0;led=1; //小于等于,电池电压过低,关PWM频率保护电池
pca_pwm0=0x03; //关3路PWM信号
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -