⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm_bldc.txt

📁 带霍尔传感器的无刷电机控制程序(PWM调速) 基于单片机编写的C程序。
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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路下桥
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&amt;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&amt;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&amt;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&amt;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&amt;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&amt;cs2&amt;cs3;
if(cs_fx!=0x00)
{zs_js++;}
} //语句体,调霍尔分析函数,调pwm输出函数
sc_stop(); //调刹车断电检测函数
}
//-----------------------
}
}
//********************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -