国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
STM32電機驅動代碼,帶過流檢測
[打印本頁]
作者:
coolice
時間:
2021-8-14 01:10
標題:
STM32電機驅動代碼,帶過流檢測
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;//串口數據處理完畢
}
}
復制代碼
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0