📄 无刷0621.c
字号:
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次测量电池电压
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路下桥
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,霍尔变化存入新的数据到变量中
he_cs_sj1=hehc;he_cs_bz1=1;
if(he_cs_bz1==1){he_cs_sj2=hehc;he_cs_bz2=1;}
if(he_cs_bz2==1){he_cs_sj3=hehc;he_cs_bz3=1;}
//----------------------------------------
if(he_cs_bz1==1)
{if(he_cs_bz2==1)
{if(he_cs_bz3==1)
{if(he_cs_sj1&he_cs_sj2&he_cs_sj3!=0x00)
{zs_js++;he_cs_bz1=0;he_cs_bz2=0;he_cs_bz3=0;}
}
}
}
//--------------------
}
}
//**********电流自动调整函数******************************************************
void dl_tz(void)
{ set_p17_adc();
do
{get_ad_dy();}
while(adc_data>=20);
{pwm_bls=adc_data*10+pwm_bl;
if(pwm_bls>=241){pwm_bls=241;}
he_gzjc();pwm_out();zb_fx();dgdz();
}
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();
} //语句体,调霍尔分析函数,调PWM输出函数
sc_stop(); //调刹车断电检测函数
}
//-----------------------
}
}
//********************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -