📄 stc5404ad无刷控制器.c
字号:
do{ledcs=3;led_k();get_ad_dy();} //闪灯提示重新测量电压
while(adc_data<=175); //检测是否恢复到正常电压44V
ledcs=3;led_k(); //电压恢复44V以上再闪灯做为延时用
hehc_bl=0; //清霍尔旧数据为了起动
}
}
//*******************霍尔故障检测函数**********************************************
void he_gzjc(void)
{
hehc=P1&0x07; //读入霍尔数据,并分离有效数据
//--查霍尔是否全1--------
while(hehc==0x07) //判断是否为3个全1,成立循环执行语句体
{pca_pwm0=0x03; //霍尔出现故障关闭所有输出
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //
TR0=0;zs_ds_js=0;zs_js=0; //关测速定时器,定时计数器清0,转速度计数器清0
ledcs=6;led_k(); //循环执行语句体6次闪烁,直到不成立退出
hehc=P1&0x07; //重新检测霍尔
}
//--查霍尔是否全0--------
while(hehc==0x00) //不为3个1再判断是否为3个0,成立执行循环语句体
{pca_pwm0=0x03; //霍尔出现故障关闭所有输出
pca_pwm1=0x03; //
pca_pwm2=0x03; //
pwmal=0;pwmbl=0;pwmcl=0; //
TR0=0;zs_ds_js=0;zs_js=0; //关测速定时器,定时计数器清0,转速度计数器清0
ledcs=6;led_k(); //循环执行语句体6次闪烁,直到不成立退出
hehc=P1&0x07; //重新检测霍尔
}
//--查霍尔是否更新--------
if(hehc_bl!=hehc) //判断霍尔是否变化,成立执行语句1后退出
{hehc_bl=hehc; } //语句2,霍尔变化存入新的数据到变量中
}
//**********电流自动调整函数******************************************************
void dl_tz(void)
{set_p17_adc();
get_ad_dy();
while(adc_data>=20)
{pwm_bls++;if(pwm_bls>=241){pwm_bls=241;}
he_gzjc();pwm_out();dgdz();
}
// if(adc_data>=45)
// {pwm_bls=240;//adc_data*10+pwm_bl;
// }
// else
//{pwm_bls=pwm_bl;}
}
//********************转把工作状态分析函数****************************************
//函数出口--pwm_bl里有查表后数据,PWM输出程序直接读出放入PWM占空比寄存器
//ccap0h,ccap1h,ccap2h中即可
//********************************************************************************
void zb_fx(void)
{ //---连续3次测量转把电压--------
set_p13_adc(); //调转把电压转换通道
get_ad_dy(); //第一次测量转把电压
pwm_bl=pwmout[adc_data]; //在数组中查出对应的AD转换PWM值
if(pwm_bl==1) //为1成立执行大的语句1后退出,不成立执行语句2后退出
//语句1,转把电压等于1说明转把在1.3v以下或4.5v以上停止输出闪LED
{
hehc_bl=0; //霍尔存储旧数据的变量及时清0否则很难起动
pca_pwm0=0x03; //停止所有输出
pca_pwm1=0x03;
pca_pwm2=0x03;
TR0=0;zs_ds_js=0;zs_js=0; //关测速定时器,定时计数器清0,转速度计数器清0
pwmal=0;pwmbl=0;pwmcl=0; //关3个下桥
timebj=15; //定时器1中断12次闪烁一次LED
TR1=1;zbyx_bz=0; //开定时器1-LED闪烁,转把归0标志位为0,pwm输出就无效
}
else
//语句2,转把电压不等于1说明在1.3v-4.5v之间正常行驶数据
{led=1;zbyx_bz=1;TR0=1;} //关定时器1指示灯,转把有效标志位为1,pwm输出有效
}
//**********************软启动************************************
//dg_rqd()
//{dgdz();
//if(pwm_bl!=pwm_blj)
// {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
// {he_gzjc();pwm_out();}pwm_blj=pwm_bl;
// }
//else
// {if(shache_bz==1)
// {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
// {he_gzjc();pwm_out();}pwm_blj=pwm_bl;shache_bz=0;
// }
// else
// {he_gzjc();pwm_out();}
// }
//}
//********************防盗锁电机函数**********************************************
fd_dg()
{while(fd==0)
{
{int fd_he;
fd_he=P1&0X07;
if(fd_he!=fd_hej)
{fd_hej=fd_he;
//switch(fd_he) //多分支语句根据霍尔位置输出对应节拍
// {case 0x01:{
pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
ccap1h=10;pwmal=1;pca_pwm1=0x00;delay(20);
pwmal=0;pca_pwm1=0x03;
pwmal=1;pwmbl=1;pwmcl=1;delay(300);
//-------
//pwmcl=1;pca_pwm0=0x00;delay(1);
// pwmcl=0;pca_pwm0=0x03;delay(2);
// break;} //第1拍ccap0h刷新参数开C下桥A上桥
//-------------------------------------------------------------
// case 0x03:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
// ccap2h=10;pwmal=1;pca_pwm2=0x00;delay(20);
// pwmal=0;pca_pwm2=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
//--------
// pwmcl=1;pca_pwm1=0x00;delay(1);
// pwmcl=0;pca_pwm1=0x03;delay(2);
// break;} //第2拍ccap1h刷新参数开C下桥b上桥
//-------------------------------------------------------------
// case 0x02:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
// ccap2h=10;pwmbl=1;pca_pwm2=0x00;delay(20);
// pwmbl=0;pca_pwm2=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
// //--------
//pwmal=1;pca_pwm1=0x00;delay(1);
// //pwmal=0;pca_pwm1=0x03;delay(2);
// break;} //第3拍ccap1h刷新参数开a下桥b上桥
//-------------------------------------------------------------
// case 0x06:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
// ccap0h=10;pwmbl=1;pca_pwm0=0x00;delay(20);
// pwmbl=0;pca_pwm0=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
//---------
//pwmal=1;pca_pwm2=0x00;delay(1);
//pwmal=0;pca_pwm2=0x03;delay(2);
// break;} //第4拍ccap2h刷新参数开a下桥c上桥
//-------------------------------------------------------------
// case 0x04:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
// ccap0h=10;pwmcl=1;pca_pwm0=0x00;delay(20);
// pwmcl=0;pca_pwm0=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
// //---------
//pwmbl=1;pca_pwm2=0x00;delay(1);
//pwmbl=0;pca_pwm2=0x03;delay(2);
// break;} //第5拍ccap2h刷新参数开b下桥c上桥
//-------------------------------------------------------------
// case 0x05:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
// ccap1h=10;pwmcl=1;pca_pwm1=0x00;delay(20);
// pwmcl=0;pca_pwm1=0x03;
// pwmal=1;pwmbl=1;pwmcl=1;delay(200);
//----------
// pwmbl=1;pca_pwm0=0x00;delay(1);
// // pwmbl=0;pca_pwm0=0x03;delay(2);
// break;} //第6拍ccap0h刷新参数开b下桥a上桥
// }
}
}
}
}
//********************主函数******************************************************
main()
{
sd_csh(); //调上电初始化函数
qy_jc(); //调欠压检测函数
sd_ffc(); //调上电防飞车函数,等待归0后才往下执行
he_gzjc(); //调霍尔故障检测函数,无故障才往下执行
while(1)
{
qy_jc();
if(fd==0){fd_hej=P1&0x07;fd_dg();}//如果防盗口为低电平执行防盗程序
//--------------
else //否则执行正常程序
{
if(dz_bz1!=1){zb_fx();} //1>调转把分析函数
if(zbyx_bz==1) //如果转把标志位为1转把有效,就执行语句体否则不执行
{dl_tz();dgdz();
he_gzjc();pwm_out();
cs_fx=cs1&cs2&cs3;
if(cs_fx!=0x00)
{zs_js++;}
} //语句体,调霍尔分析函数,调PWM输出函数
sc_stop(); //调刹车断电检测函数
}
//-----------------------
}
}
//********************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -