日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

直流无刷电机的调试与代码开源(配套资源)

發布時間:2024/3/12 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 直流无刷电机的调试与代码开源(配套资源) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本周對手頭的一款大疆M3508直流無刷電機調試的相關內容進行整理及個人的代碼進行分享。

一、M3508直流無刷電機

直流無刷電機的工作原理此處不做闡述,相關資料也易查詢。

1.1電機結構與連接樣式圖

1.2電機參數

具體不多加闡述,感興趣的可到官網下載相關資料和軟件驅動,連接如下:

M3508減速電機套裝 (robomaster.com)

1.3分電板

電源采用12V,通過一塊分電板對單片機主板、電機和電源模塊進行連接,這個分電板通過PCB簡單設計,實現多少電壓輸入,多少電壓輸出。分電板的PCB圖如下所示:

2.STM32程序:

控制一個電機,需要1個PWM,2個高低電位

2.1 控制原理圖


反饋值(測量值)- 設定值(目標值)= 控制偏差;
控制偏差給到控制器;
從而將偏差給到電機,在經過編碼器獲得反饋;
實現閉環

?

相關pid.c代碼如下:

#include"pid.h"#define speed_max 482struct _pid {float ExpectedValue;//定義設定值float ActualValue;//定義實際值 float err;//定義偏差值float err_prev;//定義前一個的偏差值float integral;//定義積分項float Kp, Ki, Kd;//定義比例、積分、微分系數float curmax, curmin;//定義電流最值 }pid;void PID_Init(){//初始化pid各值pid.ExpectedValue=0.0;pid.ActualValue = 0.0;pid.err = 0.0;pid.err_prev = 0.0;pid.integral = 0.0;pid.Kp = 1.0;pid.Ki = 0.1;pid.Kd = 0.2;pid.curmax = 3000;pid.curmin = -3000;} //限幅 void abs_limit(float *object, float abs_max) {if(*object > abs_max) *object = abs_max;if(*object < -abs_max) *object = -abs_max; }/* 輸入:期望轉速 輸出:位置型單環PID結果*/ float PID_Realize(float set_speed,float get_speed){//ste_speed期望轉速 £?get_speed實際轉速pid.ExpectedValue = set_speed;pid.ActualValue = get_speed;pid.err = pid.ExpectedValue-pid.ActualValue;//計算誤差err//計算積分項pid.integral += pid.err;//位置式PID公式float Value = pid.Kp*pid.err + pid.Ki*pid.integral+pid.Kp*(pid.err-pid.err_prev);//誤差換代pid.err_prev=pid.err;if(Value<pid.curmin)return pid.curmin;else if(Value>pid.curmax)return pid.curmax;elsereturn Value;}/********************************************************************************************************/ void pid_struct_init(pid_t* pid, float kp, float ki, float kd) {pid->err[NOW] = 0;pid->err[LAST] = 0;pid->err[LLAST] = 0;pid->pos_out = 0;pid->pout = 0;pid->iout = 0;pid->dout = 0;pid->p = kp;pid->i = ki;pid->d = kd;pid->pos_abs = 0;pid->pos_goal = 0;}//μ¥?·pidfloat single_pid_calculate(pid_t * pid_s) {pid_s->err[NOW] = pid_s->target - pid_s->measure;//當前誤差//p項 比例項pid_s->pout = pid_s->p * pid_s->err[NOW];//i項 積分項pid_s->iout += pid_s->i * pid_s->err[NOW];//d項 微分項pid_s->dout = pid_s->d * (pid_s->err[NOW] - pid_s->err[LAST]);pid_s->pos_out = pid_s->pout + pid_s->iout + pid_s->dout;//誤差更新pid_s->err[LAST] = pid_s->err[NOW];abs_limit(&(pid_s->pos_out),3000);return pid_s->pos_out; }//雙環pid float double_pid_calculate(pid_t * pid_I , pid_t* pid_O)//I是速度,o是角度 {/****************************角度環**************************************/pid_O->err[NOW] = pid_O->target - pid_O->measure;//當前誤差 /*//p項 比例項pid_O->pout = pid_O->p * (pid_O->err[NOW] - pid_O->err[LAST]);//i項 積分項pid_O->iout += pid_O->i * pid_O->err[NOW];//d項 微分項pid_O->dout = pid_O->d * (pid_O->err[NOW] - 2*pid_O->err[LAST] + pid_O->err[LLAST]); */if((pid_O->err[NOW]>-50) || (pid_O->err[NOW]<50)){pid_O->iout = 0; //設置死區}pid_O->pout = pid_O->p * pid_O->err[NOW];pid_O->iout += pid_O->i * pid_O->err[NOW];pid_O->dout = pid_O->d * (pid_O->err[NOW] - pid_O->err[LAST]);pid_O->pos_out = pid_O->pout + pid_O->iout + pid_O->dout;//算出速度應設置的值abs_limit(&(pid_O->pos_out),3000);//誤差更新pid_O->err[LAST] = pid_O->err[NOW];pid_O->err[LLAST] = pid_O->err[LAST];/*******************************速度環************************************/pid_I->err[NOW] = pid_O->pos_out - pid_I->measure;//μ±?°?ó2?//p項 比例項pid_I->pout = pid_I->p * pid_I->err[NOW];//i項 積分項pid_I->iout += pid_I->i * pid_I->err[NOW]; //d項 微分項pid_I->dout = pid_I->d * (pid_I->err[NOW] - pid_I->err[LAST]);pid_I->result =pid_I->pout + pid_I->iout + pid_I->dout;//應設置的電流值//誤差更新pid_I->err[LAST] = pid_I->err[NOW];abs_limit(&(pid_I->result),8000);return pid_I->result; }

pid.h

enum {LLAST = 0,LAST = 1,NOW = 2, }; void PID_Init(void); float PID_Realize(float current,float ActualValue);typedef struct __pid_t {float p;float i;float d;float target; //目標值float measure; //測量值float err[3]; //誤差float result;float pout; float iout; float dout; float pos_goal; //目標角度 float pos_abs; //絕對角度float pos_out; //本次位置式輸出 }pid_t;typedef struct {float pos_goal;//目標位置float pos_abs;//絕對位置float pos_offset;//位置補償float eer;//誤差float eer_eer;//上次誤差 }ANGLE_TypeDef;void pid_struct_init(pid_t* pid, float kp, float ki, float kd);float single_pid_calculate(pid_t * pid_s); float double_pid_calculate(pid_t * pid_I , pid_t* pid_O);

主函數

#include "main.h" #include "key.h" #include "led.h" #include "can.h" #include "tim.h" #include "pid.h"int i;unsigned char Temp_Value_3508 = { 0 };//CAN接受電機溫度 short Torque_Value_3508 = { 0 }; //CAN實際扭矩電流 short Velocity_Value_3508 = { 0 }; //CAN接受實際轉速 short Position_Value_3508 = { 0 }; //CAN接受機械角度 short Velocity_3508_ID1=0; //CAN實際轉速 short Position_3508_ID1=0; //CAN接受機械角度 short Torque_3508_ID1=0; //CAN實際扭轉電流 unsigned char Temp_Value_3508_ID1=0; //CAN接受電機溫度 pid_t PID,PID_I,PID_O; //o為角度,i為速度 short set_current1; //PID計算后當前需要傳輸電流值short Velocity_3508_ID1_Set_Speed=0; //設定轉速ANGLE_TypeDef motor_angle;void CAN1_TX_IRQHandler( void ) //CAN發送中斷 清楚發送中斷標志 {if ( CAN_GetITStatus( CAN1, CAN_IT_TME ) != RESET ){CAN_ClearITPendingBit( CAN1, CAN_IT_TME );} } void CAN1_RX0_IRQHandler( void ) //CA接受中斷 更新當前實際轉速 且清楚接受中斷標志位 {CanRxMsg rx_message;if ( CAN_GetITStatus( CAN1, CAN_IT_FMP0 ) != RESET )//判斷是否是fifo0消息掛起中斷(即收到消息){CAN_ClearITPendingBit( CAN1, CAN_IT_FMP0 );CAN_Receive( CAN1, CAN_FIFO0, &rx_message);if ( (rx_message.IDE == CAN_Id_Standard) && (rx_message.RTR == CAN_RTR_Data) && (rx_message.DLC == 8) ) /* ±ê×????¢êy?Y???¢êy?Y3¤?è?a8 */{Temp_Value_3508 = rx_message.Data[6]; Torque_Value_3508 = (rx_message.Data[4] << 8) | (rx_message.Data[5]);Velocity_Value_3508 = (rx_message.Data[2] << 8) | (rx_message.Data[3]);Position_Value_3508 = (rx_message.Data[0] << 8) | (rx_message.Data[1]);Velocity_3508_ID1=Velocity_Value_3508; Position_3508_ID1=Position_Value_3508;Torque_3508_ID1=Torque_Value_3508;Temp_Value_3508_ID1=Temp_Value_3508;PID.measure = Velocity_3508_ID1;//2aá??μPID_I.measure = Velocity_Value_3508;PID_O.measure = Position_Value_3508;}} }int main(void) {delay_init( 180 ); delay_ms( 100 );KEY_Init();Led_Init();CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_7tq,CAN_BS1_7tq,3,CAN_Mode_Normal); £?ò?°?2?ó??ˉ£???ê?500kbpsdelay_ms(100);PID_Init(); pid_struct_init(&PID,1,0.1,0.2);//3?ê??ˉpidμ?èy??2?êy?μp£?i£?dpid_struct_init(&PID_I,5,0.1,3);pid_struct_init(&PID_O,10,0.1,5);Tick_TIM7_Init(1000);while (1){ if(key==0){motor_angle.pos_goal = 0;LED3=1;LED4=0;}else if(key==1){motor_angle.pos_goal = -2160;LED3=0;LED4=1;}delay_ms(10);}}void Motor_Angle_Cal(float T) {float res1, res2;static float pos,pos_old;pos =(PID_O.measure/8192.0f*360.0f);motor_angle.eer=pos - pos_old;//???è?ó2?μ?????if(motor_angle.eer>0) { res1=motor_angle.eer-T;res2=motor_angle.eer;}else{res1=motor_angle.eer+T;res2=motor_angle.eer;}if(fabs(res1)<fabs(res2)) {motor_angle.eer_eer = res1;}else{motor_angle.eer_eer = res2;}motor_angle.pos_abs += motor_angle.eer_eer; motor_angle.pos_offset=motor_angle.pos_goal-motor_angle.pos_abs;pos_old = pos; }void TIM7_IRQHandler( void ) {if ( TIM_GetITStatus( TIM7, TIM_IT_Update ) == SET ){/******************μ¥?·******************/// set_current1 = single_pid_calculate(&PID);/******************???·******************/Motor_Angle_Cal(360);PID_O.target = motor_angle.pos_offset;PID_O.measure = 0;set_current1 = 0;// set_current1=PID_Realize(Velocity_3508_ID1_Set_Speed,Velocity_3508_ID1); CAN1_Send_Msg(set_current1,set_current1,set_current1,set_current1);//éè??μ?á÷?μ}TIM_ClearITPendingBit( TIM7, TIM_IT_Update ); }

?

?

總結

以上是生活随笔為你收集整理的直流无刷电机的调试与代码开源(配套资源)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品无码一区 | 国产网红主播精品av | 久久9966| 天天干,天天干 | 日韩精品免费一区二区夜夜嗨 | 天天射干| 国产免费av网址 | 精品亚洲在线 | 国产福利视频在线观看 | 毛片动漫| 天天干狠狠| 91嫩草视频在线观看 | 麻豆视频传媒入口 | 亚洲精品ww| 亚洲欧洲无码一区二区三区 | 国产精品视频免费观看 | 欧美精品一区二区三区久久久竹菊 | 欧美精品极品 | 成人免费毛片东京热 | 欧美黄色一级片视频 | 美女久久久久 | 在线精品视频播放 | 国产精品theporn88 | 亚洲av色一区二区三区精品 | 成年在线视频 | 九九av | 三级网站在线播放 | 谁有免费黄色网址 | 麻豆网站免费观看 | 欧美成人国产va精品日本一级 | 一级特黄aaa| 男生桶女生肌肌 | 美女黄色在线观看 | 看片地址 | 三上悠亚 电影 | 日本少妇激三级做爰在线 | 国产小精品| 日日操夜夜 | 69精品无码成人久久久久久 | 高跟肉丝丝袜呻吟啪啪网站av | 女女互慰揉小黄文 | 日本黄色网页 | mm1313亚洲国产精品无码试看 | 中文字幕在线精品 | 国产性色视频 | 伊人av综合 | 男人天堂视频在线 | 日韩精品一区二区av | 欧美sm视频 | 日韩视频 中文字幕 | 日韩干| 色午夜av | 午夜影视av | 日韩av中文字幕在线 | 中文字幕日韩电影 | 天天躁日日躁狠狠躁av麻豆男男 | 久草毛片 | 精品久久久久久久久久久久久久 | www.亚洲激情| 亚洲另类图区 | 91在现看 | 色噜噜狠狠狠综合曰曰曰 | 久久精品国产精品亚洲毛片 | 欧美日韩亚洲一区 | 免费观看亚洲 | 五月天综合色 | 亚洲色图视频网站 | 国产男女无套免费网站 | 亚洲精品香蕉 | 在线免费激情视频 | 国产欧美一区二区三区视频 | 五月婷婷激情综合 | 国产精品国产三级国产三级人妇 | 国产白丝袜美女久久久久 | 亚洲av无码乱码在线观看富二代 | 黄av网| 一级二级av | 亚洲国产精品第一页 | 都市激情中文字幕 | 91丨九色丨丰满人妖 | 国产精选第一页 | 东北少妇不带套对白 | 在线色资源| 亚洲第一成年人网站 | 日韩视频网 | 三级网站在线 | 黄色第一网站 | 中文字幕亚洲精品在线 | 中文字幕久久久久久久 | 在线成人中文字幕 | 日本在线观看一区二区 | 中文字幕在线视频免费 | 国产精品女人精品久久久天天 | 神秘马戏团在线观看免费高清中文 | 国内av网 | 成人深夜福利视频 | 久草手机在线观看 | 中字幕视频在线永久在线观看免费 | 日韩第1页|