📄 无刷0621.lst
字号:
189 3 }
190 2 else
191 2 {dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
192 3 TH1=0X3C;TL1=0X0B;TR1=0;
193 3 TH0=0X3C;TL0=0X0B;TR0=1;
194 3 }
195 2 }
196 1 else
197 1 {TR0=1;}
198 1 }
199 //********************定时器1中断函数*********************************************
200 void time1(void)interrupt 3
201 { TR1=0;TH1=0x3c;TL1=0x0b;
202 1 timejs++;
203 1 if(timejs==12) //中断次数等于给定的次数就取反LED
204 1 {if(zbyx_bz==0) //转把归0标志为0,可以闪灯
205 2 {led=~led;timejs=0;TR1=1;}
206 2 }
207 1 if(timejs==80)
208 1 {if(dz_bz1==1)
209 2 {TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
210 2 else
211 2 {dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
212 2 }
213 1 TR1=1;
214 1 }
215 //*******************电机堵转转函数***********************************************
216 //根据2S定时内一直堵转的话置DZ_BZ为1,本函数检测到该标志为1立即关闭所有输出
217 //并闪烁指示灯间隔快闪2次提示,最后监控转把归0后可以退出本函数重新启动
218 void dgdz(void)
219 {
220 1 while(dz_bz1==1)
221 1 {pwm_bls=170;he_gzjc();pwm_out();
222 2 if(dz_bz==1)
223 2 { TR0=0;TR1=0;
224 3 pca_pwm0=0x03; //关3路PWM信号
225 3 pca_pwm1=0x03; //
226 3 pca_pwm2=0x03; //
227 3 pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
228 3 set_p13_adc(); //电机进入保护后开始等待转把归零后可以重新启动
229 3 do{ledcs=2;led_k();get_ad_dy();} //间隔开闪2次提示堵转保护,测量转把电压是否归0
230 3 while(adc_data>=61); //没有归0执行DO循环体语句
231 3 led=1;dz_bz=0;dz_bz1=0; //转把归0后关指示灯清堵转标志
232 3 }
233 2 }
234 1 }
235 //********************外中断0函数限流或康铜开路************************************
236 void intt0()interrupt 0
237 {
238 1 TR0=0;TR1=0; //关PWM频率
239 1 pca_pwm0=0x03; //关3路PWM信号
240 1 pca_pwm1=0x03; //
241 1 pca_pwm2=0x03; //
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 5
242 1 pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
243 1 set_p13_adc();
244 1 get_ad_dy();
245 1 while(adc_data>=61)
246 1 {ledcs=4;led=0;get_ad_dy();}
247 1 led=1;
248 1 }
249 //********************PWM驱动桥驱动输出函数****************************************
250 void pwm_out(void) //入口:pwm_bl里有转把调速参数.出口:输出全桥驱动信号
251 {
252 1 switch(hehc) //多分支语句根据霍尔位置输出对应节拍
253 1 {case 0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
254 3 ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;break;} //第1拍ccap0h刷新参数开C下桥A上桥
255 2 //-------------------------------------------------------------
256 2 case 0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
257 3 ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;break;} //第2拍ccap1h刷新参数开C下桥b上桥
258 2 //-------------------------------------------------------------
259 2 case 0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
260 3 ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;break;} //第3拍ccap1h刷新参数开a下桥b上桥
261 2 //-------------------------------------------------------------
262 2 case 0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
263 3 ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;break;} //第4拍ccap2h刷新参数开a下桥c上桥
264 2 //-------------------------------------------------------------
265 2 case 0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
266 3 ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;break;} //第5拍ccap2h刷新参数开b下桥c上桥
267 2 //-------------------------------------------------------------
268 2 case 0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
269 3 ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;break;} //第6拍ccap0h刷新参数开b下桥a上桥
270 2 }
271 1 }
272
273 //********************上电初始化函数**********************************************
274 void sd_csh(void)
275 {P1=0xff;zb=0;P2=0xff;P3=0xff;
276 1 pwmal=0; //上电复位后首先关闭3组下桥
277 1 pwmbl=0; //
278 1 pwmcl=0; //
279 1 adc_power(); //调AD转换用初始化函数
280 1 pwm_sz(); //调PWM输出用初始化函数
281 1 time_csh(); //调两个定时器初始化函数
282 1 }
283 //********************上电防飞车函数归0后LED正常闪烁******************************
284 void sd_ffc(void)
285 {
286 1 set_p13_adc(); //调转把电压转换通道
287 1 get_ad_dy(); //上电后测量转把电压是否归零
288 1 while(adc_data>=61) //61为1.2V转换值转把如果大于1.2V执行循环体语句等待归0
289 1 {ledcs=2;led_k(); //循环体语句,2次间隔性快闪灯
290 2 get_ad_dy(); //循环体语句,重新检测电压等待归0
291 2 }
292 1 TR0=0; //关PWM频率否则干扰闪灯
293 1 timebj=12; //归0后定时器中断10次闪烁一次LED
294 1 TR1=1; //归0后开定时器1-LED闪烁
295 1 }
296 //*************刹车函数自动选择是断电还是ABS刹车功***************************
297 void sc_stop(void) //ABS刹车有外接口对地选择,对地时为ABS功能
298 {
299 1 if(shache==0) //判断语句刹车口等于0执行大语句1
300 1 { abs=1;
301 2 //大语句体1
302 2 if(abs==1) //判断ABS选择不为0就执行普通刹车断电,否则执行ABS刹车
303 2 //==========普通刹车断电==================================================
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 6
304 2 {
305 3 TR0=0;led=0; //关测速定时器,亮刹车灯
306 3 pca_pwm0=0x03; //关3路PWM信号AH
307 3 pca_pwm1=0x03; //关3路PWM信号BH
308 3 pca_pwm2=0x03; //关3路PWM信号CH
309 3 pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
310 3 //----------------------------------------------------------------------
311 3 while(shache==0) //循环语句,刹车口没松开就一直等待
312 3 {delay(500);} //语句体,延时抗干扰防止抖动
313 3 hehc_bl=0;led=1; //刹车口松开后清霍尔变量内存再关刹车灯
314 3 //----------------------------------------------------------------------
315 3 for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下两句为刹车口松开后减缓冲击
316 3 {he_gzjc();pwm_out();} //从最低速度加高到实时的转把设定速度
317 3 }
318 2 //===========EABS刹车断电=====================================================
319 2 else //ABS功能已选择进入ABS刹车
320 2 { //
321 3 TR0=0;led=0; //关测速定时器,亮刹车灯
322 3 pca_pwm0=0x03; //关3路PWM信号AH
323 3 pca_pwm1=0x03; //关3路PWM信号BH
324 3 pca_pwm2=0x03; //关3路PWM信号CH
325 3 pwmal=0;pwmbl=0;pwmcl=0; //关闭3个下桥:AL-BL-CL
326 3 //-------------------------------------------------------------------------
327 3 do //do-while语句先执行do再执行while判断表达式
328 3 {
329 4 for(h=100;h>0;h--) //每检测一次没松开就先执行1万次ABS点刹,防止刹车抖动干扰
330 4 { pwmal=0;pwmbl=0;pwmcl=0;
331 5 delay1(1);
332 5 pwmal=1;pwmbl=1;pwmcl=1; //ABS点刹
333 5 delay1(80);
334 5 }
335 4 }
336 3 while(shache==0); //内镶循环语句,只要刹车没松开就一直开ABS点刹制动
337 3 hehc_bl=0;led=1; //刹车口为1后清霍尔变量内存再关刹车灯
338 3 pwmal=0;pwmbl=0;pwmcl=0; //点刹后要关闭所有下桥防止刹车松开后车推不动
339 3 for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下几句刹车后软启动,减少刹车后高速冲击
340 3 {he_gzjc();pwm_out();}
341 3 }
342 2 //---------------
343 2 }
344 1 }
345 //*******************欠压检测函数**************************************************
346 void qy_jc(void)
347 { //连续3次测量电池电压抗干扰
348 1 set_p15_adc();
349 1 get_ad_dy(); //第1次测量电池电压
350 1 if(adc_data<=158) //电压小于等于3.1v吗,不等于直接退出
351 1 {TR0=0;TR1=0;led=1; //小于等于,电池电压过低,关PWM频率保护电池
352 2 pca_pwm0=0x03; //关3路PWM信号
353 2 pca_pwm1=0x03; //
354 2 pca_pwm2=0x03; //
355 2 pwmal=0;pwmbl=0;pwmcl=0; //关3路下桥
356 2 do{ledcs=3;led_k();get_ad_dy();} //闪灯提示重新测量电压
357 2 while(adc_data<=175); //检测是否恢复到正常电压44V
358 2 ledcs=3;led_k(); //电压恢复44V以上再闪灯做为延时用
359 2 hehc_bl=0; //清霍尔旧数据为了起动
360 2 }
361 1 }
362 //*******************霍尔故障检测函数**********************************************
363 void he_gzjc(void)
364 {
365 1 hehc=P1&0x07; //读入霍尔数据,并分离有效数据
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 7
366 1 //--查霍尔是否全1--------
367 1 while(hehc==0x07) //判断是否为3个全1,成立循环执行语句体
368 1 {pca_pwm0=0x03; //霍尔出现故障关闭所有输出
369 2 pca_pwm1=0x03; //
370 2 pca_pwm2=0x03; //
371 2 pwmal=0;pwmbl=0;pwmcl=0; //
372 2 TR0=0;zs_ds_js=0;zs_js=0; //关测速定时器,定时计数器清0,转速度计数器清0
373 2 ledcs=6;led_k(); //循环执行语句体6次闪烁,直到不成立退出
374 2 hehc=P1&0x07; //重新检测霍尔
375 2 }
376 1 //--查霍尔是否全0--------
377 1 while(hehc==0x00) //不为3个1再判断是否为3个0,成立执行循环语句体
378 1 {pca_pwm0=0x03; //霍尔出现故障关闭所有输出
379 2 pca_pwm1=0x03; //
380 2 pca_pwm2=0x03; //
381 2 pwmal=0;pwmbl=0;pwmcl=0; //
382 2 TR0=0;zs_ds_js=0;zs_js=0; //关测速定时器,定时计数器清0,转速度计数器清0
383 2 ledcs=6;led_k(); //循环执行语句体6次闪烁,直到不成立退出
384 2 hehc=P1&0x07; //重新检测霍尔
385 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -