久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17842|回復: 41
打印 上一主題 下一主題
收起左側

基于STM32F103的無刷電機驅動板(包含有霍爾,無霍爾傳感器)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:659402 發表于 2019-12-10 12:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本人幾年前開發個的一個基于STM32的無刷驅動板,當時試過,有霍爾,和利用反向電動勢的無感啟動都是可以的,也可以正常的帶載運行。
后來因為切換到其他項目,沒有再繼續優化,
但程序的基本框架是正確的,編譯也可完全通過。
發到網上供大家參考,有疑問的同行可以發帖相互交流學習,謝謝!

單片機源程序如下:


STM32單片機源程序如下:
  1. #include "includes.h"  

  2. void Motor_Ctr(void);

  3. void send_wave_data(u16 send_data)
  4. {
  5.         usart1_send_byte(0xAA);
  6.         usart1_send_byte(send_data>>8);
  7.         usart1_send_byte(send_data);
  8. }



  9. void Motor_start_param_initial()
  10. {
  11.         MotorCtr.motor_start_delay=MAX_START_DELAY;   //電機啟動參數初始化,30ms,相當于60000/6/2/30=166圈/分鐘       
  12.         MotorCtr.start_step_cn=0;
  13.        
  14.         #ifdef  NO_HOLZER_SENSOR                                            //無霍爾傳感器
  15.        
  16.                 MotorCtr.Holzer_sensor=0;
  17.                 MotorCtr.No_Holzer_sensor_start_count=0;
  18.                 MotorCtr.start_holl_value=2;
  19.         #else                                                //有霍爾傳感器
  20.        
  21.                 MotorCtr.Holzer_sensor=1;
  22.                 MotorCtr.Holzer_sensor_start_count=0;
  23.         #endif               
  24. }       


  25. //電機控制初始化函數
  26. void MotorCtr_ini(void)
  27. {
  28.         MotorCtr.sample_ok=0;            //電機采樣參數初始化
  29.         MotorCtr.motor_voltage=0;
  30.         MotorCtr.motor_current=0;
  31.        
  32.         MotorCtr.speed_val=0;                        //電機速度參數初始化設定值
  33.         MotorCtr.speed_set=0;                       
  34.         MotorCtr.speed_time_cnt=0;
  35.         MotorCtr.speed_time_ok=0;       
  36.                
  37.         MotorCtr.holl_overtime_cnt=0;
  38.         MotorCtr.holl_cnt=0;
  39.         MotorCtr.sum_holl_time=0;                          
  40.         MotorCtr.sample_ok_cn=0;               
  41.         MotorCtr.stall_time_cn=0;       
  42.        
  43.         MotorCtr.motor_dir= NONE_DIR;                                  //電機轉動控制初始化,順時鐘
  44.         MotorCtr.motor_run_state = MOTOR_IDLE;
  45.        
  46.         Motor_start_param_initial();
  47.        
  48.        
  49.         MotorCtr.motor_run_state=MOTOR_START;
  50.         MotorCtr.motor_dir= FORWARD_DIR;         
  51.         //MotorCtr.motor_dir= REVERSE_DIR;                 
  52.         TIM_Cmd(TIM4, ENABLE);                                          //使能TIM4,開始計時間

  53. }


  54. void MOTOR_CMD_process()
  55. {
  56.         if(Usart2Data.Usart_Rx_Data_OK)
  57.         {
  58.                
  59.                 if(Usart2Data.Usart_Rx_Cmd_H==CMD_ORDER)
  60.                 {
  61.                         if(Usart2Data.Usart_Rx_Cmd_L&MOTOR_START)
  62.                         {
  63.                                 Motor_start_param_initial();

  64.                                 MotorCtr.motor_run_state=MOTOR_START;
  65.                                 if(Usart2Data.Usart_Rx_Cmd_L&FORWARD_DIR)
  66.                                 {
  67.                                         MotorCtr.motor_dir= FORWARD_DIR;                 
  68.                                 }
  69.                                 if(Usart2Data.Usart_Rx_Cmd_L&REVERSE_DIR)
  70.                                 {
  71.                                         MotorCtr.motor_dir= REVERSE_DIR;                 
  72.                                 }
  73.                                 TIM_Cmd(TIM4, ENABLE);                                          //使能TIM4,開始計時間
  74.                                
  75.                         }
  76.                         else if(Usart2Data.Usart_Rx_Cmd_L&MOTOR_STOP)
  77.                         {
  78.                                 MotorCtr.motor_run_state=MOTOR_STOP;
  79.                                 stop_motor();
  80.                                 TIM_Cmd(TIM4, DISABLE);                                          //使能TIM4,開始計時間
  81.                         }                                       
  82.                 }       
  83.                 else if(Usart2Data.Usart_Rx_Cmd_H==CMD_DATA_SPEED)
  84.                 {
  85.                                         MotorCtr.pwm_duty_set=Usart2Data.Usart_Rx_Cmd_L*MIN_START_PWM_DUTY/SPEED_DUTY_NUM;   //速度檔位1-10檔
  86.                 }
  87.                 else if(Usart2Data.Usart_Rx_Cmd_H==CMD_DATA_ANGLE)
  88.                 {
  89.                                        
  90.                 }
  91.                                                                        
  92.                 Usart2Data.Usart_Rx_Data_OK=0;
  93.         }       
  94. }



  95. int main(void)
  96. {         
  97.         RCC_Configuration();  
  98.         IO_Initial();                               //初始化輸入輸出IO口及電平中斷輸入  

  99.         Delay_Initial();                        //用于精確延時
  100.        
  101.         UART1_Initial(115200);                         //用于調試
  102.         UART2_Initial(115200);                         //用于調試
  103.          
  104.         TIM2_Configuration();                    //觸發采樣,用來設置ADC采樣率          
  105.         MYDMA_Initial();                                          //ADC配置為DMA傳輸
  106.         ADC_Initial();                                           //充電電流,電池電壓AD輸入初始化
  107.          
  108.         TIM4_Configuration();                    //用于啟動延時
  109.          
  110.         ISR_Initial();                                                  //必須在所有任務開始運行后,開啟中斷初
  111.          
  112.         //TIM3_Configuration();                    //霍爾輸入觸發配置
  113.         //TIM1_Configuration();                    //6路PWM產生配置,載波頻率為25KHz
  114.        
  115.         MotorCtr_ini();
  116.        
  117.        
  118.         Motor_Ctr();
  119. }                                                            



  120. void Motor_Ctr(void)
  121. {
  122.         while(1)
  123.         {
  124.                 MOTOR_CMD_process();                              //運控板命令處理
  125.                
  126.                 if(MotorCtr.sample_ok)
  127.                 {
  128.                     LED_ON=!LED_ON;
  129.                        
  130.                         MotorCtr.sample_ok=0;
  131.                        
  132.                         ADC1_Sample_filter(MotorCtr.sample_ok_cn);
  133.                        
  134.                         MotorCtr.motor_voltage+=single_motor_voltage[MotorCtr.sample_ok_cn];
  135.                         MotorCtr.motor_current+=single_motor_current[MotorCtr.sample_ok_cn];
  136.                        
  137.                         ADC1_sample(ENABLE);
  138.                        
  139.                     MotorCtr.sample_ok_cn++;
  140.                        
  141.                         if(MotorCtr.sample_ok_cn>=SAMPLE_OK_NUM)
  142.                         {
  143.                                 MotorCtr.sample_ok_cn=0;
  144.                                
  145.                                 MotorCtr.motor_voltage/=SAMPLE_OK_NUM;
  146.                                 MotorCtr.motor_current/=SAMPLE_OK_NUM;
  147.                                                       
  148.                                 if(MotorCtr.motor_voltage<BATTERY_MIN_V)                                 //mA,最大可測1.2A  
  149.                                 {
  150.                                        
  151.                                 }
  152.                                 if(MotorCtr.motor_current>MOTOR_STALL_A)                                //A
  153.                                 {
  154.                                        
  155.                                 }

  156.                                 printf("MotorCtr.motor_run_state %d\n",MotorCtr.motor_run_state);
  157.                                               
  158.                                 printf("MotorCtr.motor_voltage %d\n",MotorCtr.motor_voltage);    //mV
  159.                                 printf("MotorCtr.motor_current %d\n",MotorCtr.motor_current);    //mA
  160.                         }
  161.                 }
  162.                
  163.         if(MotorCtr.motor_run_state==MOTOR_START)                                                                //無感啟動,或有霍爾傳感器啟動                                                     
  164.                 {
  165.                         MotorCtr.pwm_duty_set=FIXED_PHASE_PWM_DUTY;                                                   //max 1800       
  166.                         Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);                  //轉子預定位
  167.                         delay_ms(100);
  168.                         MotorCtr.start_holl_value=Manu_Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);          
  169.                         Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);                  //二次定位
  170.                         delay_ms(100);
  171.                         MotorCtr.pwm_duty_set=MIN_START_PWM_DUTY;                                                           //max 1800       
  172.                         MotorCtr.fixed_start_speed_cn=0;                        
  173.                         while(1)
  174.                         {
  175.                                 MotorCtr.start_step_cn++;
  176.                                
  177.                                 Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);                                                                  //控制與換相
  178.                                
  179.                                 if(MotorCtr.start_step_cn<=MAX_START_STEP_NUM)                                //啟動完畢速度,24步后,換向時間2.6ms,相當于60000/6/2/2.6=1923圈/分鐘       
  180.                                 {
  181.                                         MotorCtr.motor_start_delay=MotorCtr.motor_start_delay*STEP_PWM_DELAY;
  182.                                 }
  183.                                 else
  184.                                 {
  185.                      
  186.                                         if(MotorCtr.fixed_start_speed_cn<FIXED_SPEED_START_NUM)          //加速啟動后再,固定速度啟動幾步
  187.                                                 MotorCtr.fixed_start_speed_cn++;
  188.                                         else
  189.                                         {
  190.                                                 #ifdef  IO_INT_SENORLESS
  191.                                                         TIM_SetCounter(TIM3,0);
  192.                                                 #endif
  193.                                                
  194.                                                 MotorCtr.motor_run_state = MOTOR_RUN;
  195.                                                 ADC1_sample(ENABLE);                                                                                    //理論上在啟動中就要檢測電流大小,進行保護,調試時跳過
  196.                                                 TIM_Cmd(TIM3, ENABLE);
  197.                                                 MotorCtr.start_step_cn=0;
  198.                                                 break;
  199.                                         }
  200.                                        
  201.                                 }
  202.                                                
  203.                                 if(MotorCtr.Holzer_sensor)                                                                                                                     //有感啟動,固定霍爾輸入
  204.                                 {
  205.                                         MotorCtr.start_holl_value =0;
  206.                                         MotorCtr.start_holl_value = FHASE_C_IN<<2 | FHASE_B_IN<<1 | FHASE_A_IN<<0;
  207.                                        
  208.                                         if(MotorCtr.Holzer_sensor_start_count<MAX_MOTOR_START_NUM)
  209.                                                 MotorCtr.Holzer_sensor_start_count++;
  210.                                         else
  211.                                         {
  212.                                                 MotorCtr.motor_run_state =MOTOR_STALL;
  213.                                                 motor_brake();
  214.                                         }   
  215.                                 }
  216.                                 else                                                                               //無感啟動,實時讀取霍爾輸入
  217.                                 {
  218.                                         MotorCtr.start_holl_value=Manu_Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);          
  219.                                         /*
  220.                                         if(MotorCtr.No_Holzer_sensor_start_count<MAX_MOTOR_START_NUM)
  221.                                                 MotorCtr.No_Holzer_sensor_start_count++;
  222.                                         else
  223.                                         {
  224.                                                 MotorCtr.motor_run_state =MOTOR_STALL;
  225.                                                 motor_brake();
  226.                                         }*/
  227.                                 }
  228.                                 delay_us(MotorCtr.motor_start_delay);
  229.                                
  230.                         }
  231.                 }
  232.                 else if(MotorCtr.motor_run_state == MOTOR_RUN)
  233.                 {
  234.                         if(MotorCtr.speed_time_ok)
  235.                         {
  236.                                 MotorCtr.speed_time_ok=0;
  237.                                 MotorCtr.speed_val=MotorCtr.holl_cnt*SPEED_K;                                             //(MotorCtr.holl_cnt/6步/2對磁極對數)*60=轉/min,換向延時 1000ms*60/轉/2對磁極對數/6步,4000轉時,每換向一次1.25ms
  238.                                                                                                                                                                        
  239.                                 MotorCtr.ave_holl_time=HOLL_SPEED_K/(MotorCtr.sum_holl_time/MotorCtr.holl_cnt);
  240.                                
  241.                                 send_wave_data(MotorCtr.speed_val);
  242.                                        
  243.                                 printf("MotorCtr.speed_val %d\n",MotorCtr.speed_val);                              //轉/min
  244.                                 printf("MotorCtr.ave_holl_time %d\n",MotorCtr.ave_holl_time);   
  245.                                 //printf("MotorCtr.holl_overtime_cnt %d\n",MotorCtr.holl_overtime_cnt);  
  246.                                 printf("MotorCtr.pwm_duty_set %d\n",MotorCtr.pwm_duty_set);  
  247.                                
  248.                                 MotorCtr.sum_holl_time=0;
  249.                                 MotorCtr.holl_cnt=0;
  250.                        
  251.                         }
  252.                 }
  253.                 else                                                                                                          //MOTOR_STOP
  254.                 {
  255.                         MotorCtr.speed_val=0;
  256.                         MotorCtr.holl_overtime_cnt = 0;
  257.                         MotorCtr.sum_holl_time=0;
  258.                         MotorCtr.holl_cnt=0;
  259.                 }       
  260.         }
  261. }
復制代碼



全部資料51hei下載地址:
Brushless_Drive_0303.7z (360.09 KB, 下載次數: 699)
原理圖.pdf (45.46 KB, 下載次數: 671)
PCB圖.pdf (2.79 MB, 下載次數: 392)

評分

參與人數 2黑幣 +62 收起 理由
AAA_MCU + 12 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏60 分享淘帖 頂5 踩
回復

使用道具 舉報

沙發
ID:340339 發表于 2019-12-10 17:19 | 只看該作者
感謝分享
回復

使用道具 舉報

板凳
ID:98992 發表于 2019-12-10 19:09 | 只看該作者
很不錯 不過 好像挺復雜
回復

使用道具 舉報

地板
ID:492919 發表于 2019-12-14 20:20 | 只看該作者
謝謝分享
     
         
回復

使用道具 舉報

5#
ID:627772 發表于 2020-1-5 19:41 | 只看該作者
下下來看看。正在學無霍爾的驅動,學習一下
回復

使用道具 舉報

6#
ID:682196 發表于 2020-1-6 15:19 | 只看該作者
大佬有流程圖嗎?
回復

使用道具 舉報

7#
ID:328121 發表于 2020-1-10 09:01 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

8#
ID:340339 發表于 2020-2-17 14:46 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

9#
ID:295789 發表于 2020-2-22 22:04 | 只看該作者
謝謝樓主!下載看看有沒有用!
回復

使用道具 舉報

10#
ID:638203 發表于 2020-2-23 17:53 | 只看該作者
好帖子  謝謝
回復

使用道具 舉報

11#
ID:638203 發表于 2020-2-24 11:20 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

12#
ID:686311 發表于 2020-2-24 14:00 | 只看該作者
學習學習,謝謝樓主
回復

使用道具 舉報

13#
ID:161929 發表于 2020-2-24 14:53 | 只看該作者
下下來看看。正在學無霍爾的驅動,學習一下
回復

使用道具 舉報

14#
ID:643968 發表于 2020-2-25 09:35 | 只看該作者
謝謝分享
回復

使用道具 舉報

15#
ID:709056 發表于 2020-3-15 20:43 | 只看該作者
謝謝大佬
回復

使用道具 舉報

16#
ID:604109 發表于 2020-3-15 22:41 來自觸屏版 | 只看該作者
不錯,很好的資料!
回復

使用道具 舉報

17#
ID:367149 發表于 2020-3-18 10:03 | 只看該作者
正在學無霍爾的驅動,學習一下
回復

使用道具 舉報

18#
ID:535167 發表于 2020-3-30 10:42 | 只看該作者
謝謝樓主共享!正在學,謝謝!
回復

使用道具 舉報

19#
ID:240034 發表于 2020-3-30 23:18 | 只看該作者
正在學無霍爾的驅動
回復

使用道具 舉報

20#
ID:719220 發表于 2020-3-31 01:10 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

21#
ID:135281 發表于 2020-8-6 20:35 | 只看該作者
資料不錯,就是扣分太多
回復

使用道具 舉報

22#
ID:135281 發表于 2020-8-25 17:42 | 只看該作者

謝謝樓主!下載看看有沒有用!
回復

使用道具 舉報

23#
ID:92520 發表于 2020-11-16 09:53 | 只看該作者
正在做這個驅動,學習一下!
回復

使用道具 舉報

24#
ID:639666 發表于 2020-12-22 11:04 | 只看該作者
值得學習,設計得不錯。
回復

使用道具 舉報

25#
ID:88896 發表于 2021-5-8 10:39 | 只看該作者
有PCB 的工程文件嗎
回復

使用道具 舉報

26#
ID:4294 發表于 2021-5-10 11:12 | 只看該作者
謝謝了,電壓在多少伏左右?
回復

使用道具 舉報

27#
ID:419063 發表于 2021-10-24 15:27 | 只看該作者
多謝分享,學習中。。。,想請教一下,帶載不好啟動如何調整?
回復

使用道具 舉報

28#
ID:760761 發表于 2022-5-24 22:53 | 只看該作者
感謝,正好可以參考
回復

使用道具 舉報

29#
ID:184706 發表于 2022-7-13 18:25 | 只看該作者
哦 原來有原理圖
回復

使用道具 舉報

30#
ID:455220 發表于 2022-8-22 13:48 | 只看該作者
正學習BLDC,感謝樓主分享。
回復

使用道具 舉報

31#
ID:95059 發表于 2022-8-26 18:17 | 只看該作者
感謝分享,這電容在背面不太好吧? 在同一面會好安裝一點,個人建議
回復

使用道具 舉報

32#
ID:638714 發表于 2022-9-29 18:46 | 只看該作者
做個記號,用的時候好找
回復

使用道具 舉報

33#
ID:399179 發表于 2022-10-5 15:08 來自觸屏版 | 只看該作者
是不是能用在電動自行車上?
回復

使用道具 舉報

34#
ID:418515 發表于 2022-10-6 11:39 | 只看該作者
一個32IC現在好幾十塊錢了,沒空間了。換國產
回復

使用道具 舉報

35#
ID:1002058 發表于 2022-10-6 12:51 | 只看該作者
高,能把原理簡述一下,就更好了。畢竟有很多人不了解這個。
回復

使用道具 舉報

36#
ID:216265 發表于 2022-10-17 08:46 | 只看該作者
這個是方波的嗎?如果方波的居逸的容易出成品吧
回復

使用道具 舉報

37#
ID:1033997 發表于 2023-1-16 10:40 | 只看該作者
很不錯 不過 好像挺復雜
回復

使用道具 舉報

38#
ID:413770 發表于 2024-8-1 22:17 | 只看該作者
下載學習,謝謝樓主分享
回復

使用道具 舉報

39#
ID:245053 發表于 2024-9-29 13:38 | 只看該作者
以前用STC驅動無刷電機,無霍爾,沒有成功,放棄了。。下來學習一下
回復

使用道具 舉報

40#
ID:25103 發表于 2025-1-1 09:37 | 只看該作者

謝謝樓主分享
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费成人高清在线视频 | 精品国产乱码久久久久久闺蜜 | 色www精品视频在线观看 | 国产a视频| 老头搡老女人毛片视频在线看 | 成人亚洲综合 | 精品国产乱码一区二区三 | 在线视频一区二区三区 | 日韩视频国产 | 亚洲黄色av | 久久久久亚洲av毛片大全 | 午夜专区| 久久久久久免费毛片精品 | 日韩精品一区二区在线 | 欧美中文字幕在线 | 国产一区二区三区免费 | 中国xxxx性xxxx产国 | 国内精品99 | 国产在线拍偷自揄拍视频 | 日韩精品一区二区三区在线播放 | 蜜桃精品视频在线 | 日韩91在线| 亚洲视频在线观看一区二区三区 | 国产成人免费视频网站视频社区 | 免费看爱爱视频 | 黄色av大片 | 第一色在线 | jav成人av免费播放 | 精品久久一区 | 中文字幕一区二区在线观看 | 操皮视频 | 日本污视频 | 日操操| 中文字幕免费在线 | 久久国产精品久久国产精品 | www.日本精品 | 亚洲一区精品在线 | www.久| 粉嫩在线 | 成人h电影在线观看 | 6996成人影院网在线播放 |