国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

STM32電機驅動代碼,帶過流檢測

[復制鏈接]
樓主
coolice 發表于 2021-8-14 01:10:26 | 只看該作者 |倒序瀏覽 |閱讀模式
MotorDriver_upgrade 帶過流監測.rar (4.1 MB, 售價: 3 E幣)
部分源碼如下,完整工程源碼見附件
  1. #include "main.h"
  2. extern unsigned char rx_buffer[10];
  3. extern u8 rx_received;
  4. extern u8 TIM2Timeout;
  5. extern u8 MotorState;
  6. extern s16 MotorPWM;
  7. extern int MotorSpeed;
  8. extern u8 ExceedCurrentCounter;
  9. int MotorPWM_Para=0;//調試用
  10. float MotorSetSpeed=0;//需要的轉速(rpm,-MOTORMAXRPM~MOTORMAXRPM)
  11. u16 TIM2Counter=0;//TIM2溢出計數器,范圍0~399,對應時間0~1s
  12. int MotorSpeed_Debug=0;
  13. u16 MotorCurrentADValue=0;

  14. int main(void)
  15. {
  16.         LED_Configuration();
  17.         LED_RED_ON();

  18.         PWM_Configuration();
  19.         KEY_Configuration();
  20.         USART2_Configuration();
  21.         Encoder_Configuration();
  22.         TIM2_Configuration();
  23.         ADC_Configuration();
  24.         TIM2_Start();
  25.         Encoder_Start();

  26.         MotorControlInit();

  27.     while(1)
  28.     {
  29.                 if(TIM2Timeout==1)//處理定時器2溢出事件,周期2.5ms
  30.                 {
  31.                         MotorSpeed+=Encoder_Get_CNT();//讀取碼盤數據

  32.                         if(MotorState==3)//過流保護狀態指示,當第一次發生過流時,紅燈閃爍(周期400ms),將轉速設定值降為0以解除過流保護狀態
  33.                         {
  34.                                 MotorSetPWM(0);//電機停轉

  35.                                 if(TIM2Counter%80==0 && ExceedCurrentCounter==1)//1次過流保護狀態紅燈閃爍
  36.                                         LED_RED_TOGGLE();

  37.                                 if(ExceedCurrentCounter==2)//當第二次發生過流時,紅燈閃爍(周期1.2s),電機驅動器鎖死,只能復位或重新上電以解除過流保護
  38.                                         while(1)
  39.                                         {
  40.                                                 delay_ms(600);
  41.                                                 LED_RED_TOGGLE();
  42.                                         }

  43.                                 if(MotorSetSpeed==0 && ExceedCurrentCounter==1 && MotorCurrentCheck(ADC_Filter())==0)//將轉速設為0,且此時不過流,則解除1次過流保護狀態
  44.                                 {
  45.                                         MotorState=0;
  46.                                         LED_RED_ON();
  47.                                         MotorControlReset();//電機控制復位
  48.                                         MotorSpeed=0;//反饋轉速也清0
  49.                                 }
  50.                                        
  51.                         }        
  52.                         else//不在過流保護狀態才進行電機控制
  53.                         {
  54.                                 if(TIM2Counter%2==0)//每5ms進行一次PID控制
  55.                                 {
  56.                                         MotorSpeed/=2;
  57.                                         MotorSpeed_Debug=MotorSpeed;
  58.                                         MotorControl(MotorSetSpeed,0.7426*MotorSpeed);           //讀出的數據除以260(碼盤倍率),再除以16(減速箱比),即為輸出軸的轉速r/s,乘以60即得rpm
  59.                                         MotorSpeed=0;
  60.                                 }
  61.                         }

  62.                         if(TIM2Counter%40==0)//每100ms發送一次數據,以及電流檢測
  63.                         {
  64.                                 MotorCurrentADValue=ADC_Filter();
  65.                                 MotorCurrentCheck(MotorCurrentADValue);
  66.                                 printf("%.2f  %.4f %d %d\r\n",MotorSetSpeed,0.7426*MotorSpeed_Debug,MotorPWM,MotorCurrentADValue);                                
  67.                         }

  68.                
  69.                         
  70.                         TIM2Counter=(TIM2Counter+1)%400;//計數器加1
  71.                         TIM2Timeout=0;//溢出事件處理完畢
  72.                 }

  73.                 if(rx_received==1)//處理串口發來的數據信息
  74.                 {
  75.                         if(strncmp((const char*)rx_buffer,"boostmotor",10)==0)//電機增速
  76.                         {
  77.                                 MotorSetSpeed+=50;
  78.                                 MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);        
  79.                         }

  80.                         if(strncmp((const char*)rx_buffer,"slackmotor",10)==0)//電機減速
  81.                         {
  82.                                 MotorSetSpeed-=50;
  83.                                 MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);
  84.                         }                        
  85.                         
  86.                         rx_received=0;//串口數據處理完畢
  87.                 }        

  88.     }
復制代碼


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

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 02:12

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表