MotorDriver_upgrade 帶過流監測.rar
(4.1 MB, 售價: 3 E幣)
2023-3-24 00:44 上傳
點擊文件名下載附件
售價: 3 E幣 [記錄]
[ 購買]
部分源碼如下,完整工程源碼見附件
- #include "main.h"
- extern unsigned char rx_buffer[10];
- extern u8 rx_received;
- extern u8 TIM2Timeout;
- extern u8 MotorState;
- extern s16 MotorPWM;
- extern int MotorSpeed;
- extern u8 ExceedCurrentCounter;
- int MotorPWM_Para=0;//調試用
- float MotorSetSpeed=0;//需要的轉速(rpm,-MOTORMAXRPM~MOTORMAXRPM)
- u16 TIM2Counter=0;//TIM2溢出計數器,范圍0~399,對應時間0~1s
- int MotorSpeed_Debug=0;
- u16 MotorCurrentADValue=0;
- int main(void)
- {
- LED_Configuration();
- LED_RED_ON();
- PWM_Configuration();
- KEY_Configuration();
- USART2_Configuration();
- Encoder_Configuration();
- TIM2_Configuration();
- ADC_Configuration();
- TIM2_Start();
- Encoder_Start();
- MotorControlInit();
- while(1)
- {
- if(TIM2Timeout==1)//處理定時器2溢出事件,周期2.5ms
- {
- MotorSpeed+=Encoder_Get_CNT();//讀取碼盤數據
- if(MotorState==3)//過流保護狀態指示,當第一次發生過流時,紅燈閃爍(周期400ms),將轉速設定值降為0以解除過流保護狀態
- {
- MotorSetPWM(0);//電機停轉
- if(TIM2Counter%80==0 && ExceedCurrentCounter==1)//1次過流保護狀態紅燈閃爍
- LED_RED_TOGGLE();
- if(ExceedCurrentCounter==2)//當第二次發生過流時,紅燈閃爍(周期1.2s),電機驅動器鎖死,只能復位或重新上電以解除過流保護
- while(1)
- {
- delay_ms(600);
- LED_RED_TOGGLE();
- }
- if(MotorSetSpeed==0 && ExceedCurrentCounter==1 && MotorCurrentCheck(ADC_Filter())==0)//將轉速設為0,且此時不過流,則解除1次過流保護狀態
- {
- MotorState=0;
- LED_RED_ON();
- MotorControlReset();//電機控制復位
- MotorSpeed=0;//反饋轉速也清0
- }
-
- }
- else//不在過流保護狀態才進行電機控制
- {
- if(TIM2Counter%2==0)//每5ms進行一次PID控制
- {
- MotorSpeed/=2;
- MotorSpeed_Debug=MotorSpeed;
- MotorControl(MotorSetSpeed,0.7426*MotorSpeed); //讀出的數據除以260(碼盤倍率),再除以16(減速箱比),即為輸出軸的轉速r/s,乘以60即得rpm
- MotorSpeed=0;
- }
- }
- if(TIM2Counter%40==0)//每100ms發送一次數據,以及電流檢測
- {
- MotorCurrentADValue=ADC_Filter();
- MotorCurrentCheck(MotorCurrentADValue);
- printf("%.2f %.4f %d %d\r\n",MotorSetSpeed,0.7426*MotorSpeed_Debug,MotorPWM,MotorCurrentADValue);
- }
-
-
- TIM2Counter=(TIM2Counter+1)%400;//計數器加1
- TIM2Timeout=0;//溢出事件處理完畢
- }
- if(rx_received==1)//處理串口發來的數據信息
- {
- if(strncmp((const char*)rx_buffer,"boostmotor",10)==0)//電機增速
- {
- MotorSetSpeed+=50;
- MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);
- }
- if(strncmp((const char*)rx_buffer,"slackmotor",10)==0)//電機減速
- {
- MotorSetSpeed-=50;
- MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);
- }
-
- rx_received=0;//串口數據處理完畢
- }
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|