找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2173|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)主控?zé)o刷電機(jī)BLDC程序注釋 制作資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:467203 發(fā)表于 2023-6-21 02:25 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1. #include<reg51.h>                //包含文件預(yù)處理命令</span>
  2. #define uchar unsigned char      //8位單片機(jī)習(xí)慣性定義
  3. #define uint unsigned int        //8位單片機(jī)習(xí)慣性定義
  4. //
  5. //*********AD轉(zhuǎn)換要用到的特殊寄存器地址定義*************************************
  6. sfr  adc_contr=0xc5;             //定義AD轉(zhuǎn)換控制寄存器地址   
  7. sfr  adc_data=0xc6;              //定義AD轉(zhuǎn)換結(jié)果寄存器地址
  8. sfr  p1m0=0x91;                  //帶有8路AD的P1口模式選擇寄存器0定義地址
  9. sfr  p1m1=0x92;                  //帶有8路AD的P1口模式選擇寄存器1定義地址
  10. //
  11. //*********PWM輸出要用到的特殊寄存器地址定義************************************
  12. sfr  ccap0h=0xfa;                //PCA模塊0捕捉/比較寄存器高8位
  13. sfr  ccap1h=0xfb;                //PCA模塊1捕捉/比較寄存器高8位
  14. sfr  ccap2h=0xfc;                //PCA模塊2捕捉/比較寄存器高8位
  15. sfr  ccap3h=0xfd;                //PCA模塊3捕捉/比較寄存器高8位
  16. sfr  pca_pwm0=0xf2;              //PCA模塊0-PWM寄存器
  17. sfr  pca_pwm1=0xf3;              //PCA模塊1-PWM寄存器
  18. sfr  pca_pwm2=0xf4;              //PCA模塊2-PWM寄存器
  19. sfr  pca_pwm4=0xf5;              //PCA模塊3-PWM寄存器
  20. sfr  ccapm0=0xda;                //PCA模塊0工作模式寄存器
  21. sfr  ccapm1=0xdb;                //PCA模塊1工作模式寄存器
  22. sfr  ccapm2=0xdc;                //PCA模塊2工作模式寄存器
  23. sfr  ccapm3=0xdd;                //PCA模塊3工作模式寄存器
  24. sfr  ch=0xf9;                    //PCA計(jì)數(shù)器高8位
  25. sfr  cl=0xe9;                    //PCA計(jì)數(shù)器低8位
  26. sfr  ccon=0xd8;                  //PCA控制寄存器
  27. sfr  cmod=0xd9;                  //PCA工作模式寄存器
  28. sbit cr=ccon^6;                  //PCA計(jì)數(shù)器控制位,1開0關(guān)
  29. sbit epca_lvd=IE^6;              //PCA中斷允許控制位1開0關(guān)
  30. sfr  auxr=0x8E;                  //定時器工作于1T控制位
  31. //==============================================================================
  32. sbit zb=P1^3;
  33. sbit pwmal=P2^3;                 //A相下橋驅(qū)動定義
  34. sbit pwmbl=P2^2;                 //B相下橋驅(qū)動定義
  35. sbit pwmcl=P2^1;                 //C相下橋驅(qū)動定義
  36. sbit led=P2^7;                   //指示燈定義
  37. sbit abs=P2^5;                   //ABS剎車功能選擇口,對地為ABS功能
  38. sbit shache=P3^0;                //剎車口定義,對地剎車
  39. sbit fd=P3^3;                    //防盜檢測口定義
  40. int ledcs;                       //定義一個指示燈閃燈次數(shù)變量
  41. static fd_hej;
  42. static timebj;                   //定義一個定時器計(jì)數(shù)比較變量
  43. static timejs;                   //定義一個定時器中斷計(jì)數(shù)次數(shù)變量
  44. static pwm_bl;                   //PWM輸出變量
  45. static zs_bl=20;                  //pwm舊的變量數(shù)據(jù),備份的
  46. static pwm_bls;                  //PWM軟啟動加速用變量
  47. static shache_bz;                //剎車后該標(biāo)志置1供軟啟動使用
  48. static hehc;                     //霍爾數(shù)據(jù)暫存區(qū)
  49. static hehc_bl;                  //上相霍爾數(shù)據(jù)暫存區(qū),用于檢測霍爾變化
  50. static dz_bz;                  //堵轉(zhuǎn)標(biāo)志,為1堵轉(zhuǎn)
  51. static dz_bz1;
  52. static zbyx_bz;                  //轉(zhuǎn)把有效標(biāo)志,歸0時為0,行駛時為1有效
  53. static ds_bf=10;                    //轉(zhuǎn)把上次的數(shù)據(jù)備份
  54. static zs_js;                      //轉(zhuǎn)速數(shù)據(jù)
  55. static zs_ds_js;
  56. static he_cs_bz1;
  57. static he_cs_bz2;
  58. static he_cs_bz3;
  59. static he_cs_sj1;
  60. static he_cs_sj2;
  61. static he_cs_sj3;
  62. int qy_1,qy_2,qy_3;              //欠壓測量暫存區(qū)1,2,3
  63. int cs1,cs2,cs3,cs_fx;           //電機(jī)測速全局變量
  64. static qy_bf;                    //欠壓上次的數(shù)據(jù)備份
  65. int h;                           //ABS剎車用變量
  66. int dz;
  67. int dz2;  
  68. void zb_fx(void);
  69. void he_gzjc(void);
  70. void pwm_out(void);
  71.                   
  72. //*********************AD轉(zhuǎn)換后PWM對照表*****************************************
  73. uchar code pwmout[256]=
  74. {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  75. 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//60個1為1.3v以下
  76. //------------------------------------------------------------------------------------------
  77. 241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,
  78. 201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,
  79. 161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,//60
  80. 121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,//23
  81. 75,73,71,69,67,65,63,61,59,57,55,53,51,49,47,46,45,44,43,42,41,40,39,38,37,36,//26
  82. 35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,//26
  83. 9,8,7,6,5,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,//34 //25個0為4.1--4.5v
  84. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};       //26個為4.5V以上
  85. //*********************1MS延時函數(shù)***********************************************
  86. void delay(int t)
  87. {
  88.   int i,j;
  89.   for(i=0;i<t;i++)
  90.    for(j=0;j<250;j++)
  91.    ;
  92. }
  93. //*********************ABS剎車延時函數(shù)***********************************************
  94. void delay1(int t)
  95. {
  96.   int i,j;
  97.   for(i=0;i<t;i++)
  98.    for(j=adc_data;j>0;j--)
  99.    {}
  100. }
  101. //*********************設(shè)置AD電源和開漏函數(shù)**************************************
  102. adc_power()
  103. {
  104.   adc_contr|=0x80;               //開AD電源
  105.   delay(2);                      //首次開AD電源要延時1MS左右
  106.   p1m0|=0x88;                    //設(shè)置P1.3和P1.7為開漏即AD轉(zhuǎn)換模式
  107.   p1m1|=0x88;                    //同上
  108. }
  109. //-------------------設(shè)置P1.3為轉(zhuǎn)把測量通道函------------------------------------
  110. set_p13_adc()
  111. { zb=1;
  112.   adc_contr=0xe3;                //P13口為轉(zhuǎn)換通道
  113. }
  114. //-------------------設(shè)置P17為電機(jī)超載測量通道函數(shù)--------------------------------
  115. set_p17_adc()
  116. {
  117.   adc_contr=0xe7;
  118. }
  119. //------------------設(shè)置P15為欠壓檢測測量通道-------------------------------------
  120. set_p15_adc()
  121. {adc_contr=0xe5;}
  122. //===================測量電壓函數(shù)=================================================
  123. get_ad_dy()
  124. { int adon=0;                    //定義一個整型變量用于檢測AD轉(zhuǎn)換是否結(jié)束
  125.   adc_data=0;                    //AD轉(zhuǎn)換結(jié)果寄存器清0
  126.   adc_contr|=0x08;               //轉(zhuǎn)換位置1啟動轉(zhuǎn)換
  127.   while(adon==0)                 //循環(huán)判斷表達(dá)式成立反復(fù)執(zhí)行語句,不成立退出
  128.    {adon=adc_contr&0x10;}        //循環(huán)語句體,即判斷AD轉(zhuǎn)換是否完成,完成后高第4位為1
  129.   adc_contr&=0xe7;               //循環(huán)語句退出轉(zhuǎn)換完成,清adc_flag,adc_start,停止轉(zhuǎn)換
  130. }
  131. //********************PWM初始化函數(shù)***********************************************
  132. pwm_sz()
  133. {
  134.    cmod=0x82;                    //PCA在空閑模式下停止PCA計(jì)數(shù)器工作
  135.                                  //PCA時鐘源為1/2溢出
  136.                                  //禁止PCA計(jì)數(shù)器溢出中斷
  137.    ccon=0x00;                    //禁止PCA計(jì)數(shù)器工作,清除中斷標(biāo)志和計(jì)數(shù)器溢出標(biāo)志
  138.    cl=0x00;                      //清0計(jì)數(shù)器
  139.    ch=0x00;
  140. //======================以下為4路PWM輸出設(shè)置程序=============================
  141. //設(shè)置模塊0為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.7口輸出
  142.    ccapm0=0x42;                  //***程序核心語句,-----0100,0010
  143.    pca_pwm0=0x03;                //先關(guān)閉PWM-輸出為0,寫入0x00就可開PWM輸出
  144. //設(shè)置模塊1為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.5口輸出
  145.    ccapm1=0x42;                  //***程序核心語句,-----0100,0010
  146.    pca_pwm1=0x03;                //先關(guān)閉PWM-輸出為0,寫入0x00就可開PWM輸出
  147. //設(shè)置模塊2為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P2.0口輸出
  148.    ccapm2=0x42;                  //***程序核心語句,-----0100,0010
  149.    pca_pwm2=0x03;                //先關(guān)閉PWM-輸出為0,寫入0x00就可開PWM輸出
  150. //模塊3未用
  151.    epca_lvd=1;                   //開PCA中斷
  152.    EA=1;                         //開總中斷
  153.    cr=1;                         //開PCA計(jì)數(shù)器打開
  154. }
  155. //********************快閃燈函數(shù)***********************************************
  156. led_k()
  157.    { int k;                      //定義一個臨時變量
  158.      for(k=0;k<ledcs;k++)        //表達(dá)式2條件不滿足即次數(shù)未到重復(fù)執(zhí)行循環(huán)體語句
  159.      {led=0;delay(700);
  160.       led=1;delay(700);}
  161.      delay(2000);
  162.    }
  163. //********************定時器0和1初始化函數(shù)*******************************************
  164. time_csh()
  165. {
  166.    TMOD=0x11;                   //定時器0工作于8位自動重裝,1工作于方式1
  167.    TH0=0x3c;                    //
  168.    TL0=0x0b;
  169.    TH1=0x3c;                    //12MHZ時50MS數(shù)據(jù),20次為1S
  170.    TL1=0x0b;
  171.    IT0=1;                       //設(shè)置外中斷0為下降沿觸發(fā)358第一腳
  172.    EX0=1;                       //開外中斷0
  173.    EA=1;                        //開總中斷
  174.    ET0=1;                       //開定時期0中斷
  175.    ET1=1;                       //開定時期1中斷
  176. }
  177. //********************定時器0中斷函數(shù)PWM頻率用************************************
  178. void time0(void)interrupt 1
  179. {TR0=0;TH0=0x3c;TL0=0x0b;
  180.   zs_ds_js++;
  181.   if(zs_ds_js==10)
  182.    {if(zs_js<20)
  183.     {  
  184.      dz_bz1=1;zs_ds_js=0;zs_js=0;
  185.      TH1=0X3C;TL1=0X0B;TR1=1;
  186.      TH0=0x3c;TL0=0x0b;TR0=1;
  187.     // pwm_bls=200;
  188.     }
  189.          else
  190.          {dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
  191.      TH1=0X3C;TL1=0X0B;TR1=0;
  192.      TH0=0X3C;TL0=0X0B;TR0=1;
  193.     }
  194.    }
  195.         else
  196.         {TR0=1;}
  197. }
  198. //********************定時器1中斷函數(shù)*********************************************
  199. void time1(void)interrupt 3
  200. { TR1=0;TH1=0x3c;TL1=0x0b;
  201.    timejs++;
  202.    if(timejs==12)           //中斷次數(shù)等于給定的次數(shù)就取反LED
  203.      {if(zbyx_bz==0)        //轉(zhuǎn)把歸0標(biāo)志為0,可以閃燈
  204.       {led=~led;timejs=0;TR1=1;}
  205.           }
  206.         if(timejs==80)
  207.         {if(dz_bz1==1)
  208.          {TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
  209.          else
  210.          {dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
  211.         }
  212.    TR1=1;
  213. }
  214. //*******************電機(jī)堵轉(zhuǎn)轉(zhuǎn)函數(shù)***********************************************
  215. //根據(jù)2S定時內(nèi)一直堵轉(zhuǎn)的話置DZ_BZ為1,本函數(shù)檢測到該標(biāo)志為1立即關(guān)閉所有輸出
  216. //并閃爍指示燈間隔快閃2次提示,最后監(jiān)控轉(zhuǎn)把歸0后可以退出本函數(shù)重新啟動
  217. void dgdz(void)
  218. {
  219.   while(dz_bz1==1)
  220. {pwm_bls=170;he_gzjc();pwm_out();  
  221. if(dz_bz==1)
  222. { TR0=0;TR1=0;
  223.    pca_pwm0=0x03;                 //關(guān)3路PWM信號
  224.    pca_pwm1=0x03;                 //
  225.    pca_pwm2=0x03;                 //
  226.    pwmal=0;pwmbl=0;pwmcl=0;       //關(guān)3路下橋
  227.    set_p13_adc();                 //電機(jī)進(jìn)入保護(hù)后開始等待轉(zhuǎn)把歸零后可以重新啟動
  228. do{ledcs=2;led_k();get_ad_dy();} //間隔開閃2次提示堵轉(zhuǎn)保護(hù),測量轉(zhuǎn)把電壓是否歸0
  229. while(adc_data>=61);             //沒有歸0執(zhí)行DO循環(huán)體語句
  230.    led=1;dz_bz=0;dz_bz1=0;                 //轉(zhuǎn)把歸0后關(guān)指示燈清堵轉(zhuǎn)標(biāo)志
  231. }
  232. }
  233. }
  234. //********************外中斷0函數(shù)限流或康銅開路************************************
  235. void intt0()interrupt 0
  236. {
  237.   TR0=0;TR1=0;                         //關(guān)PWM頻率
  238.   pca_pwm0=0x03;                 //關(guān)3路PWM信號
  239.   pca_pwm1=0x03;                 //
  240.   pca_pwm2=0x03;                 //
  241.   pwmal=0;pwmbl=0;pwmcl=0;       //關(guān)3路下橋
  242.   set_p13_adc();
  243.   get_ad_dy();
  244.   while(adc_data>=61)
  245.   {ledcs=4;led=0;get_ad_dy();}
  246.   led=1;
  247. }
  248. //********************PWM驅(qū)動橋驅(qū)動輸出函數(shù)****************************************
  249. void pwm_out(void)   //入口:pwm_bl里有轉(zhuǎn)把調(diào)速參數(shù).出口:輸出全橋驅(qū)動信號
  250. {
  251.   switch(hehc)                               //多分支語句根據(jù)霍爾位置輸出對應(yīng)節(jié)拍
  252.   {case  0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
  253.          ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;break;}  //第1拍ccap0h刷新參數(shù)開C下橋A上橋
  254.        //-------------------------------------------------------------
  255.    case  0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
  256.          ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;break;}  //第2拍ccap1h刷新參數(shù)開C下橋b上橋
  257.        //-------------------------------------------------------------   
  258.    case  0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
  259.          ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;break;}  //第3拍ccap1h刷新參數(shù)開a下橋b上橋
  260.        //-------------------------------------------------------------  
  261.    case  0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
  262.          ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;break;}  //第4拍ccap2h刷新參數(shù)開a下橋c上橋
  263.        //-------------------------------------------------------------  
  264.    case  0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
  265.          ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;break;}  //第5拍ccap2h刷新參數(shù)開b下橋c上橋
  266.        //-------------------------------------------------------------  
  267.    case  0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
  268.          ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;break;}  //第6拍ccap0h刷新參數(shù)開b下橋a上橋     
  269.   }
  270. }

  271. //********************上電初始化函數(shù)**********************************************
  272. void sd_csh(void)
  273. {P1=0xff;zb=0;P2=0xff;P3=0xff;
  274. pwmal=0;                        //上電復(fù)位后首先關(guān)閉3組下橋
  275. pwmbl=0;                        //
  276. pwmcl=0;                        //
  277. adc_power();                    //調(diào)AD轉(zhuǎn)換用初始化函數(shù)
  278. pwm_sz();                       //調(diào)PWM輸出用初始化函數(shù)
  279. time_csh();                     //調(diào)兩個定時器初始化函數(shù)
  280. }
  281. //********************上電防飛車函數(shù)歸0后LED正常閃爍******************************
  282. void sd_ffc(void)
  283. {
  284. set_p13_adc();                  //調(diào)轉(zhuǎn)把電壓轉(zhuǎn)換通道
  285. get_ad_dy();                    //上電后測量轉(zhuǎn)把電壓是否歸零
  286. while(adc_data>=61)              //61為1.2V轉(zhuǎn)換值轉(zhuǎn)把如果大于1.2V執(zhí)行循環(huán)體語句等待歸0
  287.     {ledcs=2;led_k();            //循環(huán)體語句,2次間隔性快閃燈
  288.      get_ad_dy();                //循環(huán)體語句,重新檢測電壓等待歸0
  289.     }
  290. TR0=0;                          //關(guān)PWM頻率否則干擾閃燈
  291. timebj=12;                      //歸0后定時器中斷10次閃爍一次LED
  292. TR1=1;                          //歸0后開定時器1-LED閃爍
  293. }
  294. //*************剎車函數(shù)自動選擇是斷電還是ABS剎車功***************************
  295. void sc_stop(void)    //ABS剎車有外接口對地選擇,對地時為ABS功能
  296. {
  297.   if(shache==0)                     //判斷語句剎車口等于0執(zhí)行大語句1
  298.   {  abs=1;                           
  299.     //大語句體1
  300.     if(abs==1)                      //判斷ABS選擇不為0就執(zhí)行普通剎車斷電,否則執(zhí)行ABS剎車
  301. //==========普通剎車斷電==================================================
  302.     {
  303.      TR0=0;led=0;                   //關(guān)測速定時器,亮剎車燈
  304.      pca_pwm0=0x03;                 //關(guān)3路PWM信號AH
  305.      pca_pwm1=0x03;                 //關(guān)3路PWM信號BH
  306.      pca_pwm2=0x03;                 //關(guān)3路PWM信號CH
  307.      pwmal=0;pwmbl=0;pwmcl=0;       //關(guān)3路下橋
  308.      //----------------------------------------------------------------------
  309.      while(shache==0)               //循環(huán)語句,剎車口沒松開就一直等待
  310.       {delay(500);}                 //語句體,延時抗干擾防止抖動
  311.      hehc_bl=0;led=1;               //剎車口松開后清霍爾變量內(nèi)存再關(guān)剎車燈
  312.      //----------------------------------------------------------------------
  313.      for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下兩句為剎車口松開后減緩沖擊
  314.            {he_gzjc();pwm_out();}                    //從最低速度加高到實(shí)時的轉(zhuǎn)把設(shè)定速度  
  315.     }
  316. //===========EABS剎車斷電=====================================================
  317.     else                            //ABS功能已選擇進(jìn)入ABS剎車
  318.     {                               //
  319.             TR0=0;led=0;                 //關(guān)測速定時器,亮剎車燈
  320.        pca_pwm0=0x03;               //關(guān)3路PWM信號AH
  321.        pca_pwm1=0x03;               //關(guān)3路PWM信號BH
  322.        pca_pwm2=0x03;               //關(guān)3路PWM信號CH
  323.        pwmal=0;pwmbl=0;pwmcl=0;     //關(guān)閉3個下橋:AL-BL-CL
  324.     //-------------------------------------------------------------------------
  325.      do                             //do-while語句先執(zhí)行do再執(zhí)行while判斷表達(dá)式
  326.       {
  327.         for(h=100;h>0;h--)         //每檢測一次沒松開就先執(zhí)行1萬次ABS點(diǎn)剎,防止剎車抖動干擾
  328.          { pwmal=0;pwmbl=0;pwmcl=0;
  329.            delay1(1);
  330.            pwmal=1;pwmbl=1;pwmcl=1; //ABS點(diǎn)剎
  331.            delay1(80);
  332.          }
  333.       }
  334.      while(shache==0);               //內(nèi)鑲循環(huán)語句,只要剎車沒松開就一直開ABS點(diǎn)剎制動               
  335.          hehc_bl=0;led=1;               //剎車口為1后清霍爾變量內(nèi)存再關(guān)剎車燈
  336.          pwmal=0;pwmbl=0;pwmcl=0;       //點(diǎn)剎后要關(guān)閉所有下橋防止剎車松開后車推不動
  337.     for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下幾句剎車后軟啟動,減少剎車后高速沖擊
  338.            {he_gzjc();pwm_out();}
  339.          }
  340.    //---------------
  341.   }
  342. }
  343. //*******************欠壓檢測函數(shù)**************************************************
  344. void qy_jc(void)
  345. { //連續(xù)3次測量電池電壓抗干擾
  346.   set_p15_adc();
  347.   get_ad_dy();                   //第1次測量電池電壓
  348.   if(adc_data<=158)                //電壓小于等于3.1v嗎,不等于直接退出
  349.    {TR0=0;TR1=0;led=1;             //小于等于,電池電壓過低,關(guān)PWM頻率保護(hù)電池
  350.     pca_pwm0=0x03;                 //關(guān)3路PWM信號
  351.     pca_pwm1=0x03;                 //
  352.     pca_pwm2=0x03;                 //
  353.     pwmal=0;pwmbl=0;pwmcl=0;       //關(guān)3路下橋
  354.   do{ledcs=3;led_k();get_ad_dy();} //閃燈提示重新測量電壓
  355.     while(adc_data<=175);          //檢測是否恢復(fù)到正常電壓44V
  356.     ledcs=3;led_k();               //電壓恢復(fù)44V以上再閃燈做為延時用     
  357.     hehc_bl=0;                     //清霍爾舊數(shù)據(jù)為了起動
  358.    }
  359. }
  360. //*******************霍爾故障檢測函數(shù)**********************************************
  361. void he_gzjc(void)
  362. {  
  363. hehc=P1&0x07;               //讀入霍爾數(shù)據(jù),并分離有效數(shù)據(jù)
  364. //--查霍爾是否全1--------
  365. while(hehc==0x07)           //判斷是否為3個全1,成立循環(huán)執(zhí)行語句體
  366.   {pca_pwm0=0x03;           //霍爾出現(xiàn)故障關(guān)閉所有輸出
  367.    pca_pwm1=0x03;           //
  368.    pca_pwm2=0x03;           //
  369.    pwmal=0;pwmbl=0;pwmcl=0; //
  370.    TR0=0;zs_ds_js=0;zs_js=0;    //關(guān)測速定時器,定時計(jì)數(shù)器清0,轉(zhuǎn)速度計(jì)數(shù)器清0
  371.         ledcs=6;led_k();   //循環(huán)執(zhí)行語句體6次閃爍,直到不成立退出
  372.    hehc=P1&0x07;            //重新檢測霍爾
  373.   }
  374. //--查霍爾是否全0--------
  375. while(hehc==0x00)           //不為3個1再判斷是否為3個0,成立執(zhí)行循環(huán)語句體
  376.   {pca_pwm0=0x03;           //霍爾出現(xiàn)故障關(guān)閉所有輸出
  377.    pca_pwm1=0x03;           //
  378.    pca_pwm2=0x03;           //
  379.    pwmal=0;pwmbl=0;pwmcl=0; //
  380.    TR0=0;zs_ds_js=0;zs_js=0;    //關(guān)測速定時器,定時計(jì)數(shù)器清0,轉(zhuǎn)速度計(jì)數(shù)器清0
  381.         ledcs=6;led_k();   //循環(huán)執(zhí)行語句體6次閃爍,直到不成立退出
  382.    hehc=P1&0x07;            //重新檢測霍爾
  383.   }
  384. //--查霍爾是否更新--------   
  385.   if(hehc_bl!=hehc)           //判斷霍爾是否變化,成立執(zhí)行語句1后退出
  386.   {hehc_bl=hehc;              //語句2,霍爾變化存入新的數(shù)據(jù)到變量中
  387.    he_cs_sj1=hehc;he_cs_bz1=1;
  388.    if(he_cs_bz1==1){he_cs_sj2=hehc;he_cs_bz2=1;}
  389.    if(he_cs_bz2==1){he_cs_sj3=hehc;he_cs_bz3=1;}
  390.   //----------------------------------------
  391.    if(he_cs_bz1==1)
  392.      {if(he_cs_bz2==1)
  393.        {if(he_cs_bz3==1)
  394.          {if(he_cs_sj1&he_cs_sj2&he_cs_sj3!=0x00)
  395.             {zs_js++;he_cs_bz1=0;he_cs_bz2=0;he_cs_bz3=0;}
  396.          }
  397.        }
  398.      }
  399. //--------------------
  400.   }

  401. }
  402. //**********電流自動調(diào)整函數(shù)******************************************************
  403. void dl_tz(void)
  404. { set_p17_adc();
  405.   do
  406.    {get_ad_dy();}
  407.   while(adc_data>=20);
  408.    {pwm_bls=adc_data*10+pwm_bl;
  409.     if(pwm_bls>=241){pwm_bls=241;}
  410.     he_gzjc();pwm_out();zb_fx();dgdz();
  411.    }
  412.   pwm_bls=pwm_bl;
  413. }
  414. //********************轉(zhuǎn)把工作狀態(tài)分析函數(shù)****************************************
  415. //函數(shù)出口--pwm_bl里有查表后數(shù)據(jù),PWM輸出程序直接讀出放入PWM占空比寄存器
  416. //ccap0h,ccap1h,ccap2h中即可
  417. //********************************************************************************
  418. void zb_fx(void)
  419. {  //---連續(xù)3次測量轉(zhuǎn)把電壓--------
  420.    set_p13_adc();                  //調(diào)轉(zhuǎn)把電壓轉(zhuǎn)換通道
  421.    get_ad_dy();                    //第一次測量轉(zhuǎn)把電壓                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
  422.    pwm_bl=pwmout[adc_data];        //在數(shù)組中查出對應(yīng)的AD轉(zhuǎn)換PWM值
  423.    if(pwm_bl==1)                   //為1成立執(zhí)行大的語句1后退出,不成立執(zhí)行語句2后退出
  424.    //語句1,轉(zhuǎn)把電壓等于1說明轉(zhuǎn)把在1.3v以下或4.5v以上停止輸出閃LED
  425.      {
  426.       hehc_bl=0;                   //霍爾存儲舊數(shù)據(jù)的變量及時清0否則很難起動
  427.       pca_pwm0=0x03;               //停止所有輸出            
  428.       pca_pwm1=0x03;
  429.       pca_pwm2=0x03;
  430.       TR0=0;zs_ds_js=0;zs_js=0;    //關(guān)測速定時器,定時計(jì)數(shù)器清0,轉(zhuǎn)速度計(jì)數(shù)器清0
  431.       pwmal=0;pwmbl=0;pwmcl=0;     //關(guān)3個下橋
  432.       timebj=15;                   //定時器1中斷12次閃爍一次LED
  433.       TR1=1;zbyx_bz=0;             //開定時器1-LED閃爍,轉(zhuǎn)把歸0標(biāo)志位為0,pwm輸出就無效
  434.      }
  435.    else
  436.    //語句2,轉(zhuǎn)把電壓不等于1說明在1.3v-4.5v之間正常行駛數(shù)據(jù)
  437.      {led=1;zbyx_bz=1;TR0=1;}      //關(guān)定時器1指示燈,轉(zhuǎn)把有效標(biāo)志位為1,pwm輸出有效
  438. }
  439. //**********************軟啟動************************************
  440. //dg_rqd()
  441. //{dgdz();
  442. //if(pwm_bl!=pwm_blj)                             
  443.   // {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
  444.         // {he_gzjc();pwm_out();}pwm_blj=pwm_bl;
  445. //        }
  446. //else
  447. //  {if(shache_bz==1)
  448.   //   {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
  449. //           {he_gzjc();pwm_out();}pwm_blj=pwm_bl;shache_bz=0;
  450. //          }
  451. //         else
  452. //          {he_gzjc();pwm_out();}
  453. //        }
  454. //}
  455. //********************防盜鎖電機(jī)函數(shù)**********************************************
  456. fd_dg()
  457. {while(fd==0)
  458. {
  459. {int fd_he;
  460. fd_he=P1&0X07;
  461. if(fd_he!=fd_hej)
  462. {fd_hej=fd_he;
  463.     //switch(fd_he)                               //多分支語句根據(jù)霍爾位置輸出對應(yīng)節(jié)拍
  464.       // {case  0x01:{
  465.       pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
  466.       ccap1h=10;pwmal=1;pca_pwm1=0x00;delay(20);
  467.       pwmal=0;pca_pwm1=0x03;
  468.       pwmal=1;pwmbl=1;pwmcl=1;delay(300);
  469.                              //-------
  470.                              //pwmcl=1;pca_pwm0=0x00;delay(1);
  471.                             // pwmcl=0;pca_pwm0=0x03;delay(2);
  472.                 // break;}  //第1拍ccap0h刷新參數(shù)開C下橋A上橋
  473.        //-------------------------------------------------------------
  474.        // case  0x03:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
  475.         //           ccap2h=10;pwmal=1;pca_pwm2=0x00;delay(20);
  476.          //                    pwmal=0;pca_pwm2=0x03;
  477.          //                    pwmal=1;pwmbl=1;pwmcl=1;delay(200);
  478.                             //--------
  479.                             // pwmcl=1;pca_pwm1=0x00;delay(1);
  480.                             // pwmcl=0;pca_pwm1=0x03;delay(2);
  481.          //          break;}  //第2拍ccap1h刷新參數(shù)開C下橋b上橋
  482.        //-------------------------------------------------------------   
  483.        // case  0x02:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
  484.             //       ccap2h=10;pwmbl=1;pca_pwm2=0x00;delay(20);
  485.              //                pwmbl=0;pca_pwm2=0x03;
  486.               //               pwmal=1;pwmbl=1;pwmcl=1;delay(200);
  487.              //               //--------
  488.                              //pwmal=1;pca_pwm1=0x00;delay(1);
  489.               //               //pwmal=0;pca_pwm1=0x03;delay(2);
  490.               //     break;}  //第3拍ccap1h刷新參數(shù)開a下橋b上橋
  491.        //-------------------------------------------------------------  
  492.       //  case  0x06:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
  493.         //           ccap0h=10;pwmbl=1;pca_pwm0=0x00;delay(20);
  494.         //                     pwmbl=0;pca_pwm0=0x03;
  495.         //                     pwmal=1;pwmbl=1;pwmcl=1;delay(200);
  496.                             //---------
  497.                              //pwmal=1;pca_pwm2=0x00;delay(1);
  498.                              //pwmal=0;pca_pwm2=0x03;delay(2);
  499.          //          break;}  //第4拍ccap2h刷新參數(shù)開a下橋c上橋
  500.        //-------------------------------------------------------------  
  501.        // case  0x04:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
  502.        //            ccap0h=10;pwmcl=1;pca_pwm0=0x00;delay(20);
  503.        //                      pwmcl=0;pca_pwm0=0x03;
  504.         //                     pwmal=1;pwmbl=1;pwmcl=1;delay(200);
  505.         //                    //---------
  506.                              //pwmbl=1;pca_pwm2=0x00;delay(1);
  507.                              //pwmbl=0;pca_pwm2=0x03;delay(2);
  508.         //           break;}  //第5拍ccap2h刷新參數(shù)開b下橋c上橋
  509.        //-------------------------------------------------------------  
  510.        // case  0x05:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
  511.          //          ccap1h=10;pwmcl=1;pca_pwm1=0x00;delay(20);
  512.         //                     pwmcl=0;pca_pwm1=0x03;
  513.         //                     pwmal=1;pwmbl=1;pwmcl=1;delay(200);
  514.                             //----------
  515.                             // pwmbl=1;pca_pwm0=0x00;delay(1);
  516.         //                    // pwmbl=0;pca_pwm0=0x03;delay(2);
  517.         //           break;}  //第6拍ccap0h刷新參數(shù)開b下橋a上橋     
  518.       // }
  519.   }
  520. }
  521. }
  522. }
  523. //********************主函數(shù)******************************************************
  524. main()
  525. {
  526.   sd_csh();                     //調(diào)上電初始化函數(shù)
  527.   qy_jc();                      //調(diào)欠壓檢測函數(shù)
  528.   sd_ffc();                     //調(diào)上電防飛車函數(shù),等待歸0后才往下執(zhí)行
  529.   he_gzjc();                    //調(diào)霍爾故障檢測函數(shù),無故障才往下執(zhí)行
  530. while(1)               
  531.   {
  532.     qy_jc();
  533.    if(fd==0){fd_hej=P1&0x07;fd_dg();}//如果防盜口為低電平執(zhí)行防盜程序
  534.    //--------------
  535.   else                               //否則執(zhí)行正常程序
  536.   {
  537.    if(dz_bz1!=1){zb_fx();}           //1>調(diào)轉(zhuǎn)把分析函數(shù)
  538.    if(zbyx_bz==1)                    //如果轉(zhuǎn)把標(biāo)志位為1轉(zhuǎn)把有效,就執(zhí)行語句體否則不執(zhí)行
  539.      {dl_tz();dgdz();
  540.       he_gzjc();pwm_out();
  541.      }     //語句體,調(diào)霍爾分析函數(shù),調(diào)PWM輸出函數(shù)
  542.    sc_stop();                   //調(diào)剎車斷電檢測函數(shù)
  543.   }
  544.   //-----------------------
  545. }
復(fù)制代碼
出自:http://www.torrancerestoration.com/bbs/dpj-178970-1.html
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:641483 發(fā)表于 2023-6-21 11:43 | 只看該作者
謝謝樓主 注解很詳細(xì) 樓主辛苦了 ,照例先收藏后學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:276663 發(fā)表于 2023-6-21 13:14 | 只看該作者
電動車控制器邏輯嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:704837 發(fā)表于 2023-9-8 11:27 | 只看該作者
電路圖沒有呢,電路圖比PCB重要
回復(fù)

使用道具 舉報(bào)

5#
ID:433219 發(fā)表于 2023-9-8 14:39 | 只看該作者
  硬件pcb 有點(diǎn)含糊,,,
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表