BJX 302A BLDC驱动器——6BLDC三段启动闭环

  1 void ClosedLoop(void)
  2 {
  3   if(AccelerateStep == 1)
  4   {
  5     if(SwPointDly < SwStepSpeedTime/5)
  6     {
  7       SwPointDly++;
  8       ZeroFlg = 0;
  9     }
 10     if(SwPointDly >= SwStepSpeedTime/5)   //换相后的5ms做滤波
 11     {
 12       if(RunDir)
 13       {
 14         if(AD_ValueW >= AD_ValueCom)
 15         {
 16           //检测到过零点
 17           ZeroFlg = 1;
 18         }
 19       }
 20       else
 21       {
 22         if(AD_ValueW <= AD_ValueCom)
 23         {
 24           //检测到过零点
 25           ZeroFlg = 1;
 26         }
 27 
 28       }
 29       if(ZeroFlg)
 30       {
 31         SwStepDlyCnt ++;
 32         if(SwStepDlyCnt >= SwStepSpeedTime/2)
 33         {
 34           if(RunDir)
 35           {
 36             AccelerateStep--;
 37             if(AccelerateStep == 0)
 38             {
 39               AccelerateStep = 6;
 40             }
 41           }
 42           else
 43           {
 44             AccelerateStep++;
 45             if(AccelerateStep >= 7)
 46             {
 47               AccelerateStep = 0;
 48             }
 49           }
 50 
 51         }
 52       }
 53       else
 54       {
 55         SwStepDlyCnt = 0;
 56       }
 57     }
 58   }
 59   else if(AccelerateStep == 2)
 60   {
 61     if(SwPointDly < SwStepSpeedTime/5)
 62     {
 63       SwPointDly++;
 64       ZeroFlg = 0;
 65     }
 66     if(SwPointDly >= SwStepSpeedTime/5)   //换相后的5ms做滤波
 67     {
 68       if(RunDir)
 69       {
 70         if(AD_ValueV <= AD_ValueCom)
 71         {
 72           //检测到过零点
 73           ZeroFlg = 1;
 74         }
 75       }
 76       else
 77       {
 78         if(AD_ValueV >= AD_ValueCom)
 79         {
 80           //检测到过零点
 81           ZeroFlg = 1;
 82         }
 83 
 84       }
 85       if(ZeroFlg)
 86       {
 87         SwStepDlyCnt ++;
 88         if(SwStepDlyCnt >= SwStepSpeedTime/2)
 89         {
 90           if(RunDir)
 91           {
 92             AccelerateStep--;
 93             if(AccelerateStep == 0)
 94             {
 95               AccelerateStep = 6;
 96             }
 97           }
 98           else
 99           {
100             AccelerateStep++;
101             if(AccelerateStep >= 7)
102             {
103               AccelerateStep = 0;
104             }
105           }
106 
107         }
108       }
109       else
110       {
111         SwStepDlyCnt = 0;
112       }
113     }
114   }
115   else if(AccelerateStep == 3)
116   {
117     if(SwPointDly < SwStepSpeedTime/5)
118     {
119       SwPointDly++;
120       ZeroFlg = 0;
121     }
122     if(SwPointDly >= SwStepSpeedTime/5)   //换相后的5ms做滤波
123     {
124       if(RunDir)
125       {
126         if(AD_ValueU >= AD_ValueCom)
127         {
128           //检测到过零点
129           ZeroFlg = 1;
130         }
131       }
132       else
133       {
134         if(AD_ValueU <= AD_ValueCom)
135         {
136           //检测到过零点
137           ZeroFlg = 1;
138         }
139 
140       }
141       if(ZeroFlg)
142       {
143         SwStepDlyCnt ++;
144         if(SwStepDlyCnt >= SwStepSpeedTime/2)
145         {
146           if(RunDir)
147           {
148             AccelerateStep--;
149             if(AccelerateStep == 0)
150             {
151               AccelerateStep = 6;
152             }
153           }
154           else
155           {
156             AccelerateStep++;
157             if(AccelerateStep >= 7)
158             {
159               AccelerateStep = 0;
160             }
161           }
162 
163         }
164       }
165       else
166       {
167         SwStepDlyCnt = 0;
168       }
169     }
170   }
171   else if(AccelerateStep == 4)
172   {
173     if(SwPointDly < SwStepSpeedTime/5)
174     {
175       SwPointDly++;
176       ZeroFlg = 0;
177     }
178     if(SwPointDly >= SwStepSpeedTime/5)   //换相后的5ms做滤波
179     {
180       if(RunDir)
181       {
182         if(AD_ValueW <= AD_ValueCom)
183         {
184           //检测到过零点
185           ZeroFlg = 1;
186         }
187       }
188       else
189       {
190         if(AD_ValueW >= AD_ValueCom)
191         {
192           //检测到过零点
193           ZeroFlg = 1;
194         }
195 
196       }
197       if(ZeroFlg)
198       {
199         SwStepDlyCnt ++;
200         if(SwStepDlyCnt >= SwStepSpeedTime/2)
201         {
202           if(RunDir)
203           {
204             AccelerateStep--;
205             if(AccelerateStep == 0)
206             {
207               AccelerateStep = 6;
208             }
209           }
210           else
211           {
212             AccelerateStep++;
213             if(AccelerateStep >= 7)
214             {
215               AccelerateStep = 0;
216             }
217           }
218 
219         }
220       }
221       else
222       {
223         SwStepDlyCnt = 0;
224       }
225     }
226   }
227   else if(AccelerateStep == 5)
228   {
229     if(SwPointDly < SwStepSpeedTime/5)
230     {
231       SwPointDly++;
232       ZeroFlg = 0;
233     }
234     if(SwPointDly >= SwStepSpeedTime/5)   //换相后的5ms做滤波
235     {
236       if(RunDir)
237       {
238         if(AD_ValueV >= AD_ValueCom)
239         {
240           //检测到过零点
241           ZeroFlg = 1;
242         }
243       }
244       else
245       {
246         if(AD_ValueV <= AD_ValueCom)
247         {
248           //检测到过零点
249           ZeroFlg = 1;
250         }
251 
252       }
253       if(ZeroFlg)
254       {
255         SwStepDlyCnt ++;
256         if(SwStepDlyCnt >= SwStepSpeedTime/2)
257         {
258           if(RunDir)
259           {
260             AccelerateStep--;
261             if(AccelerateStep == 0)
262             {
263               AccelerateStep = 6;
264             }
265           }
266           else
267           {
268             AccelerateStep++;
269             if(AccelerateStep >= 7)
270             {
271               AccelerateStep = 0;
272             }
273           }
274 
275         }
276       }
277       else
278       {
279         SwStepDlyCnt = 0;
280       }
281     }
282   }
283   else if(AccelerateStep == 6)
284   {
285     if(SwPointDly < SwStepSpeedTime/5)
286     {
287       SwPointDly++;
288       ZeroFlg = 0;
289     }
290     if(SwPointDly >= SwStepSpeedTime/5)   //换相后的5ms做滤波
291     {
292       if(RunDir)
293       {
294         if(AD_ValueU <= AD_ValueCom)
295         {
296           //检测到过零点
297           ZeroFlg = 1;
298         }
299       }
300       else
301       {
302         if(AD_ValueU >= AD_ValueCom)
303         {
304           //检测到过零点
305           ZeroFlg = 1;
306         }
307 
308       }
309       if(ZeroFlg)
310       {
311         SwStepDlyCnt ++;
312         if(SwStepDlyCnt >= SwStepSpeedTime/2)
313         {
314           if(RunDir)
315           {
316             AccelerateStep--;
317             if(AccelerateStep == 0)
318             {
319               AccelerateStep = 6;
320             }
321           }
322           else
323           {
324             AccelerateStep++;
325             if(AccelerateStep >= 7)
326             {
327               AccelerateStep = 0;
328             }
329           }
330 
331         }
332       }
333       else
334       {
335         SwStepDlyCnt = 0;
336       }
337     }
338   }
339 
340   PwmDuty(PointCurVlue,PointCurVlue,PointCurVlue);
341   SixStep(AccelerateStep);
342 }

正反转切换只需要切换换相顺序即可,正转步序1到6顺序循环,反转步序6到1的顺序循环。

posted @ 2026-09-11 20:20  steven_lg  阅读(5)  评论(0)    收藏  举报