找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7131|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32四旋翼飛控定高算法,含源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:627837 發(fā)表于 2019-10-21 20:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
之前做電子設(shè)計(jì)競(jìng)賽做的定高算法,硬件是基于STM32F103的飛控,算法主要是串級(jí)PID,使用的是超聲波測(cè)距模塊。由于整個(gè)飛控工程比較大,現(xiàn)將核心算法貼出來(lái)供大家參考。

單片機(jī)源程序如下:
  1. #include "height_ctrl.h"
  2. #include "include.h"
  3. #include "mymath.h"

  4. extern float Thr_Weight;
  5. extern Gravity V;//重力分量

  6. /******************高度控制變量********************/
  7. float height_ctrl_out;
  8. float wz_acc;
  9. float keepheight_thr;
  10. /*-------------------------------------------------*/

  11. /******************超聲波變量********************/
  12. #define ULTRA_SPEED                  300    // mm/s
  13. #define ULTRA_INT        300    // 積分幅度
  14. u8 lock=0;
  15. extern s8 ultra_start_f;
  16. extern float US100_Alt_delta;
  17. float exp_height_speed,exp_height;
  18. float ultra_speed,ultra_speed_acc;
  19. float ultra_dis_lpf;
  20. float ultra_ctrl_out;
  21. _st_height_pid_v ultra_ctrl;
  22. _st_height_pid ultra_pid;
  23. /*-------------------------------------------------*/

  24. /******************速度環(huán)變量********************/
  25. float wz_speed;
  26. float wz_acc_mms2;
  27. float tempacc_lpf;
  28. u8 lock_spd_crl=0;
  29. _st_height_pid_v wz_speed_pid_v;
  30. _st_height_pid wz_speed_pid;
  31. _st_height_pid ultra_wz_speed_pid;
  32. _st_height_pid baro_wz_speed_pid;
  33. /*-------------------------------------------------*/

  34. /******************氣壓計(jì)變量********************/
  35. float baro_height,baro_height_old;
  36. #define BARO_SPEED                  300    // mm/s
  37. #define BARO_INT        300    // 積分幅度

  38. u8 lock_BARO=0;//定高鎖定當(dāng)前以及清零用
  39. #define BARO_SPEED_NUM 10
  40. float baro_speed_arr[BARO_SPEED_NUM + 1];

  41. #define ACC_SPEED_NUM 50
  42. float acc_speed_arr[ACC_SPEED_NUM + 1];

  43. float baro_dis_lpf,baro_dis_kalman;
  44. float baro_ctrl_out;
  45. _st_height_pid_v baro_ctrl;
  46. _st_height_pid baro_pid;

  47. u16 baro_cnt[2];
  48. u16 acc_cnt[2];
  49. float baro_speed,baro_speed_lpf;
  50. float baro_height;
  51. float Pressure_groud;
  52. /*-------------------------------------------------*/

  53. void Height_Ctrl(float T,float thr)
  54. {        
  55.         static u8 height_ctrl_start_f;
  56.         static float thr_lpf;
  57.         static float height_thr;
  58.         static float wz_acc_temp,wz_acc1;
  59.         static float hc_speed_i,wz_speed_0;
  60.         static float h_speed;
  61.         
  62.         switch( height_ctrl_start_f )
  63.         {
  64.                 case 0:
  65.         
  66.                                 if( sensor.acc.averag.z > 7000 )//注意這里,指水平靜態(tài)下的Z值要比這個(gè)大,表示水平垂直
  67.                                 {
  68.                                           height_ctrl_start_f = 1;
  69.                                 }
  70.                                 break;
  71.                
  72.                 case 1:
  73.                         
  74.                                 LockForKeepHigh(thr_lpf);//一旦切到控高模式,立即保存當(dāng)前的距離值,油門(mén)值、相關(guān)清零。
  75.                                 if((flag.FlightMode==ULTRASONIC_High && lock==1 &&lock_spd_crl==0)|| (flag.FlightMode==ATMOSPHERE_High && lock_BARO==1 &&lock_spd_crl==0))
  76.                                 {
  77.                                                 keepheight_thr=thr_lpf;
  78.                                                 wz_speed_0=0;
  79.                                                 hc_speed_i=0;
  80.                                                 hc_speed_i=0;
  81.                                                 wz_speed=0;
  82.                                                 wz_speed_pid_v.err_old=0;
  83.                                                 wz_speed_pid_v.err=0;
  84.                                                 wz_speed_pid_v.err_i=0;
  85.                                                 lock=2;
  86.                                                 lock_BARO=2;
  87.                                                 lock_spd_crl=1;
  88.                                 }
  89.                                 else if(flag.FlightMode==MANUAL_High)
  90.                                 {
  91.                                                 lock=0;
  92.                                                 lock_BARO=0;
  93.                                                 lock_spd_crl=0;//切回手動(dòng)模式后置零,以使下次進(jìn)入定高模式是能順利置零速度內(nèi)環(huán)        
  94.                                 }
  95.                         
  96.                                 height_thr = LIMIT( thr , 0, 700 );
  97.                                 thr_lpf += ( 1 / ( 1 + 1 / ( 2.0f *3.14f *T ) ) ) *( height_thr - thr_lpf );//對(duì)油門(mén)值低通濾波修正
  98.                                 userdata1[0]=        thr_lpf;//調(diào)試用
  99.                                 /*下面的低通濾波用于測(cè)試對(duì)比效果,最終沒(méi)有選用*/                                
  100.                     //wz_acc += ( 1 / ( 1 + 1 / ( 8 *3.14f *T ) ) ) *my_deathzoom( (V.z *(sensor.acc.averag.z- sensor.acc.quiet.z) + V.x *sensor.acc.averag.x + V.y *sensor.acc.averag.y - wz_acc),100 );//
  101.                     //wz_acc_mms2 = (float)(wz_acc/8192.0f) *9800 ;
  102.                                 //加速度的靜態(tài)零點(diǎn)是讀取的EEPROM數(shù)據(jù),但是每次飛行都可能不一樣,能每次起飛前校準(zhǔn)一次最好,可以單獨(dú)校準(zhǔn)Z軸的,自行設(shè)計(jì)程序
  103.                                 wz_acc_temp = V.z *(sensor.acc.averag.z- sensor.acc.quiet.z) + V.x *sensor.acc.averag.x + V.y *sensor.acc.averag.y;//
  104.                                 Moving_Average( wz_acc_temp,acc_speed_arr,ACC_SPEED_NUM,acc_cnt ,&wz_acc1 );
  105.                                 tempacc_lpf= (float)(wz_acc1/8192.0f) *9800;//9800 *T;由于是+-4G共8G,65535/8g=8192 g,加速度,mms2毫米每平方秒
  106.                                 if(abs(tempacc_lpf)<50)tempacc_lpf=0;//簡(jiǎn)單消除下噪聲
  107.                                 userdata1[2]=tempacc_lpf;
  108.                                 wz_speed_0 += tempacc_lpf *T;//加速度計(jì)積分成速度
  109.                                                                
  110.                                 if( ultra_start_f == 1 )////不管是啥模式,只要更新了超聲波數(shù)據(jù)就進(jìn)行運(yùn)算
  111.                                 {        
  112.                                          Ultra_dataporcess(15.0f*TT);
  113.                                          ultra_start_f=2;
  114.                                 }
  115.                                 
  116.                                 if(baro_start_f==1)//不管是啥模式,只要更新了氣壓數(shù)據(jù)就進(jìn)行運(yùn)算
  117.                                 {
  118.                                          Baro_dataporcess(8.0f*TT);                         //8.0f*TT這么長(zhǎng)時(shí)間更新一次氣壓計(jì)數(shù)據(jù)
  119.                                          userdata2[10]=baro_height;//Baro_Height_Source
  120.                                          baro_dis_delta=baro_height-baro_dis_old;
  121.                                          baro_dis_old=baro_height;//氣壓計(jì)速度可以繼續(xù)優(yōu)化,這里比較粗糙                        
  122.                        //Moving_Average( (float)( baro_dis_delta/(8.0f*TT)),baro_speed_arr,BARO_SPEED_NUM,baro_cnt ,&baro_speed ); //單位mm/s
  123.                                          userdata1[11]=baro_speed_lpf=0.4* baro_dis_delta/(8.0f*TT);//baro_speed這里乘以系數(shù)以削減該值                 
  124.                                          baro_start_f=2;
  125.                                 }        
  126.                
  127.                                 if(flag.FlightMode==ULTRASONIC_High)
  128.                                 {
  129.                                          h_speed=ultra_speed;
  130.                                          wz_speed_0 = 0.99        *wz_speed_0 + 0.01*h_speed;//超聲波垂直速度互補(bǔ)濾波
  131.                                 }                                
  132.                                 else if(flag.FlightMode==ATMOSPHERE_High)
  133.                                 {
  134.                                          h_speed=baro_speed_lpf;
  135.                                          wz_speed_0 = 0.99        *wz_speed_0 + 0.01*h_speed;//氣壓計(jì)垂直速度互補(bǔ)濾波,系數(shù)可調(diào)
  136.                                 }        

  137.                                 userdata1[3] =h_speed;//h_speed是高度環(huán)傳到速度環(huán)的實(shí)測(cè)高度方向速度【但可能是錯(cuò)誤的,氣壓計(jì)速度不可靠】
  138.                                 userdata1[4]=wz_speed_0;//調(diào)試用
  139.                                 hc_speed_i += 0.4f *T *( h_speed - wz_speed );//速度偏差積分,乘以了0.4系數(shù)
  140.                                 hc_speed_i = LIMIT( hc_speed_i, -500, 500 );//積分限幅        
  141.                                 userdata1[5] =hc_speed_i;//這個(gè)沒(méi)顯示
  142.                                 wz_speed_0 += ( 1 / ( 1 + 1 / ( 0.1f *3.14f *T ) ) ) *( h_speed - wz_speed_0  ) ;//0.1實(shí)測(cè)速度修正加速度算的速度
  143.                                 userdata1[6] = wz_speed=wz_speed_0 + hc_speed_i;//經(jīng)過(guò)修正的速度+經(jīng)過(guò)限幅的增量式速度積分

  144.                           if( flag.FlightMode == ATMOSPHERE_High)
  145.                                 {
  146.                                                 if(baro_start_f==2)//說(shuō)明有新數(shù)據(jù)且被上面移動(dòng)均值濾波使用過(guò)了
  147.                                                 {
  148.                                                         baro_start_f = -1;
  149.                                                         Baro_Ctrl(8.0f*TT,thr_lpf);
  150.                                                 }        
  151.                                                 height_speed_ctrl(T,keepheight_thr,baro_ctrl_out,baro_speed_lpf);                                                        
  152.                                 }

  153.                                 if( flag.FlightMode == ULTRASONIC_High)
  154.                                 {
  155.                                                 height_speed_ctrl(T,keepheight_thr,ultra_ctrl_out,ultra_speed);//系數(shù)原來(lái)是0.4
  156.                                                         
  157.                                                 if( ultra_start_f == 2 )//超聲波數(shù)據(jù)更新了且被運(yùn)算了
  158.                                                 {                                
  159.                                                                 Ultra_Ctrl(15.0f*TT,thr_lpf);//realtime是周期為 TT 秒的,#define TT 0.0025//控制周期2.5ms
  160.                                                                 ultra_start_f = -1;
  161.                                                 }
  162.                                 }
  163.                
  164.               /*******************************************控制高度輸出********************************************/
  165.                                 if(flag.FlightMode==ULTRASONIC_High || flag.FlightMode==ATMOSPHERE_High || flag.FlightMode==ACC_High)//注意這里,模式
  166.                                 {               
  167.                                           height_ctrl_out = wz_speed_pid_v.pid_out;
  168.                                 }
  169.                                 else
  170.                                 {
  171.                                           height_ctrl_out = thr;
  172.                                 }
  173.                                 userdata2[0]=exp_height;
  174.                         
  175.                                 break;         
  176.                                 default: break;
  177.         }
  178. }

  179. void WZ_Speed_PID_Init()
  180. {
  181.                 ultra_wz_speed_pid.kp = 0.25;// //超聲波定高的速度環(huán)PID,會(huì)被EEPROM里的重新賦值的
  182.                 ultra_wz_speed_pid.ki = 0.08; //0.12
  183.                 ultra_wz_speed_pid.kd = 8;
  184.                 baro_wz_speed_pid.kp = 0.1;// 氣壓定高的速度環(huán)PID,會(huì)被EEPROM里的重新賦值的
  185.                 baro_wz_speed_pid.ki = 0.06;
  186.                 baro_wz_speed_pid.kd = 8;//1.4*10,在計(jì)算式乘以了10,已刪除
  187.                 wz_speed_pid.kp = 0.1;//速度環(huán)默認(rèn)PID,真正用不到被重新賦值
  188.                 wz_speed_pid.ki = 0.08;
  189.                 wz_speed_pid.kd = 8;
  190. }

  191. void height_speed_ctrl(float T,float thr_keepheight,float exp_z_speed,float h_speed)
  192. {
  193.     userdata1[1] =        thr_keepheight;
  194.                 //wz_speed被用于參與超聲波高度D運(yùn)算
  195.                 userdata1[7]=wz_speed_pid_v.err = wz_speed_pid.kp *( exp_z_speed - wz_speed );//
  196.                 userdata1[8]=wz_speed_pid_v.err_d = wz_speed_pid.kd * (-tempacc_lpf) *T;//(wz_speed_pid_v.err - wz_speed_pid_v.err_old);
  197.                 //wz_speed_pid_v.err_i += wz_speed_pid.ki *wz_speed_pid_v.err *T;
  198.                 wz_speed_pid_v.err_i += wz_speed_pid.ki *( exp_z_speed - h_speed ) *T;//期望速度與實(shí)際速度誤差積分
  199.                 wz_speed_pid_v.err_i = LIMIT(wz_speed_pid_v.err_i,-Thr_Weight *200,Thr_Weight *200);
  200.                 userdata1[9]=wz_speed_pid_v.err_i;
  201.                 wz_speed_pid_v.pid_out = thr_keepheight + Thr_Weight *LIMIT((wz_speed_pid.kp *exp_z_speed + wz_speed_pid_v.err + wz_speed_pid_v.err_d + wz_speed_pid_v.err_i),-300,300);//積分原來(lái)沒(méi)有乘wz_speed_pid.kp
  202.                 userdata1[10]=wz_speed_pid_v.pid_out-thr_keepheight;
  203.                 wz_speed_pid_v.err_old = wz_speed_pid_v.err;
  204. }

  205. void Baro_PID_Init()
  206. {
  207.                 baro_pid.kp = 0.15;//氣壓定高的高度位置環(huán)PID,會(huì)被EEPROM里的重新賦值的
  208.                 baro_pid.ki = 0;
  209.                 baro_pid.kd = 1.5;        //2.5
  210. }

  211. void Baro_dataporcess(float T)
  212. {
  213.                 float baro_dis_tmp;        
  214.                
  215.                 baro_dis_tmp = Moving_Median(2,5,baro_height);//對(duì)超聲波測(cè)量的距離進(jìn)行移動(dòng)中位值濾波

  216.                 if( baro_dis_tmp < Baro_MAX_Height )
  217.                 {        
  218.                         if( ABS(baro_dis_tmp - baro_dis_lpf) < 100 )
  219.                         {        
  220.                                  baro_dis_lpf += ( 1 / ( 1 + 1 / ( 2.0f *3.14f *T ) ) ) *(baro_dis_tmp - baro_dis_lpf) ;
  221.                         }
  222.                         else if( ABS(baro_dis_tmp - baro_dis_lpf) < 500 )
  223.                         {
  224.                                  baro_dis_lpf += ( 1 / ( 1 + 1 / ( 1.0f *3.14f *T ) ) ) *(baro_dis_tmp- baro_dis_lpf) ;
  225.                         }
  226.                         else
  227.                         {
  228.                                  baro_dis_lpf += ( 1 / ( 1 + 1 / ( 0.5f *3.14f *T ) ) ) *(baro_dis_tmp- baro_dis_lpf) ;
  229.                         }
  230.                 }
  231.                 userdata2[2]=baro_dis_lpf;//調(diào)試用
  232.                 userdata2[3]+= ( 1 / ( 1 + 1 / ( 1.0f *3.14f *T ) ) ) *(Baro_Height_Source- userdata2[3]) ;//調(diào)試用        
  233.                 userdata2[4]=baro_speed;//調(diào)試用
  234. }

  235. void Baro_Ctrl(float T,float thr)
  236. {
  237.                 exp_height_speed = BARO_SPEED *my_deathzoom_2(thr - 500,100)/400.0f; //20這里具體根據(jù)自己起飛油門(mén)定,油門(mén)控制高度+-ULTRA_SPEEDmm / s
  238.                 exp_height_speed = LIMIT(exp_height_speed ,-BARO_SPEED,BARO_SPEED);
  239.                
  240.                 if( exp_height > Baro_MAX_Height )//限定高度,可以根據(jù)實(shí)際修改
  241.                 {
  242.                         if( exp_height_speed > 0 )
  243.                         {
  244.                                 exp_height_speed = 0;
  245.                         }
  246.                 }
  247.                 else if( exp_height < Baro_MIN_Height )
  248.                 {
  249.                         if( exp_height_speed < 0 )
  250.                         {
  251.                                 exp_height_speed = 0;
  252.                         }
  253.                 }
  254.                
  255.                 exp_height += exp_height_speed *T;//累積期望高度,因?yàn)槠谕俣瓤赡芨淖兞?nbsp;                       
  256.                 baro_ctrl.err = baro_pid.kp*(exp_height - baro_dis_lpf);//baro_dis_lpfmm 對(duì)高度誤差乘以Kp
  257.                 userdata2[5]=baro_ctrl.err;
  258.                 baro_ctrl.err_i += baro_pid.ki *baro_ctrl.err *T;//對(duì)高度誤差積分
  259.                 userdata2[6]=baro_ctrl.err_i = LIMIT(baro_ctrl.err_i,-Thr_Weight *BARO_INT,Thr_Weight *BARO_INT);//積分限幅,融合了油門(mén)權(quán)重
  260.                 //對(duì)于D,融合了加速度計(jì)運(yùn)算得到的距離        
  261.                 userdata2[7]=0.4f *(baro_ctrl.err - baro_ctrl.err_old);
  262.                 baro_ctrl.err_d = baro_pid.kd *( 0.6f *(-wz_speed*T) + 0.4f *(baro_ctrl.err - baro_ctrl.err_old) );
  263.                 userdata2[8]=baro_ctrl.err_d;
  264.                 baro_ctrl.pid_out = baro_ctrl.err + baro_ctrl.err_i + baro_ctrl.err_d;
  265.                 baro_ctrl.pid_out = LIMIT(baro_ctrl.pid_out,-300,300);        
  266.                 userdata2[9]=baro_ctrl_out = baro_ctrl.pid_out;        
  267.                 baro_ctrl.err_old = baro_ctrl.err;
  268. }

  269. void Ultra_PID_Init()
  270. {
  271.                 ultra_pid.kp = 0.5;//超聲波定高的高度位置環(huán)PID,會(huì)被EEPROM里的重新賦值的
  272.                 ultra_pid.ki = 0;
  273.                 ultra_pid.kd = 2.5;        //2.5
  274. }

  275. void Ultra_dataporcess(float T)
  276. {
  277.                 float ultra_sp_tmp,ultra_dis_tmp;        
  278.                 ultra_dis_tmp = Moving_Median(1,5,US100_Alt);//對(duì)超聲波測(cè)量的距離進(jìn)行移動(dòng)中位值濾波
  279.                 userdata2[1]=ultra_dis_tmp;
  280.                 if( ultra_dis_tmp < Ultrasonic_MAX_Height )
  281.                 {        
  282.                         if( ABS(ultra_dis_tmp - ultra_dis_lpf) < 100 )
  283.                         {        
  284.                                 ultra_dis_lpf += ( 1 / ( 1 + 1 / ( 4.0f *3.14f *T ) ) ) *(ultra_dis_tmp - ultra_dis_lpf) ;
  285.                         }
  286.                         else if( ABS(ultra_dis_tmp - ultra_dis_lpf) < 200 )
  287.                         {                        
  288.                                 ultra_dis_lpf += ( 1 / ( 1 + 1 / ( 2.2f *3.14f *T ) ) ) *(ultra_dis_tmp- ultra_dis_lpf) ;
  289.                         }
  290.                         else if( ABS(ultra_dis_tmp - ultra_dis_lpf) < 400 )
  291.                         {
  292.                                 ultra_dis_lpf += ( 1 / ( 1 + 1 / ( 1.2f *3.14f *T ) ) ) *(ultra_dis_tmp- ultra_dis_lpf) ;
  293.                         }
  294.                         else
  295.                         {
  296.                                 ultra_dis_lpf += ( 1 / ( 1 + 1 / ( 0.2f *3.14f *T ) ) ) *(ultra_dis_tmp- ultra_dis_lpf) ;
  297.                         }
  298.                 }
  299.                
  300.                 //注意超聲波測(cè)量的 距離的時(shí)效性問(wèn)題,避免反復(fù)被計(jì)算
  301.                 ultra_sp_tmp = Moving_Median(0,5,US100_Alt_delta/T); //對(duì)超聲波測(cè)距出來(lái)兩次之間距離差計(jì)算的速度中值濾波 ultra_delta/T;

  302.                 if( ultra_dis_tmp < Ultrasonic_MAX_Height )//小于3米,注意這里,萬(wàn)一超出了呢?
  303.                 {
  304.                         if( ABS(ultra_sp_tmp) < 100 )//運(yùn)動(dòng)速度小于100mm/s
  305.                         {
  306.                                 ultra_speed += ( 1 / ( 1 + 1 / ( 4 *3.14f *T ) ) ) * ( (float)(ultra_sp_tmp) - ultra_speed );
  307.                         }//ultra_speed會(huì)傳遞給速度環(huán),作為當(dāng)前速度的反饋,原來(lái)是4
  308.                         else
  309.                         {
  310.                                 ultra_speed += ( 1 / ( 1 + 1 / ( 1.0f *3.14f *T ) ) ) * ( (float)(ultra_sp_tmp) - ultra_speed );
  311.                         }//系數(shù)越大作用越小,原來(lái)是1
  312.                 }
  313. }

  314. void Ultra_Ctrl(float T,float thr)
  315. {
  316.                 exp_height_speed = ULTRA_SPEED *my_deathzoom_2(thr - 500,100)/300.0f; //20這里具體根據(jù)自己起飛油門(mén)定,油門(mén)控制高度+-ULTRA_SPEEDmm / s
  317.                 exp_height_speed = LIMIT(exp_height_speed ,-ULTRA_SPEED,ULTRA_SPEED);
  318.                
  319.                 if( exp_height > Ultrasonic_MAX_Height )//超出超聲波高度穩(wěn)定范圍則不執(zhí)行
  320.                 {
  321.                         if( exp_height_speed > 0 )
  322.                         {
  323.                                 exp_height_speed = 0;
  324.                         }
  325.                 }
  326.                 else if( exp_height < Ultrasonic_MIN_Height )
  327.                 {
  328.                         if( exp_height_speed < 0 )
  329.                         {
  330.                                 exp_height_speed = 0;
  331.                         }
  332.                 }
  333.                
  334.                 exp_height += exp_height_speed *T;//累積期望高度,因?yàn)槠谕俣瓤赡芨淖兞?br />

  335.                 ultra_ctrl.err = ( ultra_pid.kp*(exp_height - ultra_dis_lpf) );//mm 對(duì)高度誤差乘以Kp
  336.                 userdata2[5]=ultra_ctrl.err;
  337.                 ultra_ctrl.err_i += ultra_pid.ki *ultra_ctrl.err *T;//對(duì)高度誤差積分
  338.                 userdata2[6]=ultra_ctrl.err_i = LIMIT(ultra_ctrl.err_i,-Thr_Weight *ULTRA_INT,Thr_Weight *ULTRA_INT);//積分限幅,融合了油門(mén)權(quán)重
  339.                                         //對(duì)于D,融合了加速度計(jì)運(yùn)算得到的距離        
  340.                 userdata2[7]=0.4f *(ultra_ctrl.err_old - ultra_ctrl.err);
  341. ……………………

  342. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
height_ctrl.rar (4.54 KB, 下載次數(shù): 97)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:604530 發(fā)表于 2019-11-2 11:53 | 只看該作者
樓主你好能不能簡(jiǎn)單分享一下定高是PID的參數(shù)測(cè)定方法嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表