国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(六)【平衡小車制作】位置式PID、直立環(huán)與速度環(huán)編程

這篇具有很好參考價值的文章主要介紹了(六)【平衡小車制作】位置式PID、直立環(huán)與速度環(huán)編程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本篇文章我將針對位置式PID算法、直立環(huán)速度環(huán)等的編程進(jìn)行詳細(xì)的講解,讓每位小伙伴能夠?qū)@三個概念的編程邏輯有更加清晰的理解。

一、直立環(huán)(PD控制器)

1.中文公式
?直立環(huán)輸出=Kp1×角度偏差+Kd×角度偏差的微分
?// 角度偏差=真實角度-期望角度

2.英文公式
?直立環(huán)PD控制器:Kp×Ek+Kd×Ek_D
?(Ek:角度偏差;Ek_D:角度偏差的微分)

Ek=真實角度-期望角度(Angle-Med,由陀螺儀MPU6050測得)
Ek_D=真實角速度(gyro_Y,由陀螺儀MPU6050測得)---角度的微分值代表角速度

3.軟件編程
??根據(jù)理論公式進(jìn)行軟件編程,相信看完上面的講解后這段代碼應(yīng)該比較清晰易懂。

/*****************  
直立環(huán)PD控制器:Kp*Ek+Kd*Ek_D
入口:Med:機(jī)械中值(期望角度),Angle:真實角度,gyro_Y:真實角速度
出口:直立環(huán)輸出
******************/
int Vertical(float Med,float Angle,float gyro_Y) 
{
  int PWM_out;
  
  PWM_out = Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro_Y-0);
  
  return PWM_out;
} 

?

二、速度環(huán)(PI控制器)


1.中文公式

?速度環(huán)輸出=Kp2×電機(jī)速度偏差+Ki2×電機(jī)速度偏差的積分
?// 電機(jī)速度偏差=真實速度-期望速度

2.英文公式

?速度環(huán)PI控制器:Kp×Ek+Ki×Ek_S
?(Ek:電機(jī)速度偏差;Ek_S:電機(jī)速度偏差的積分)

Ek=真實速度-期望速度(真實速度:左電機(jī)速度+右電機(jī)速度;期望速度:0)
Ek_S=速度偏差的累加
3.低通濾波

??期間需要低頻濾波,我們是以直立環(huán)為主,速度環(huán)為輔,速度環(huán)相對于直立環(huán)來說是一個干擾,最終目的是直立。低頻濾波作用是使得波形更加平滑,濾除高頻干擾,防止速度過大影響直立環(huán)正常工作。

4.積分限幅

??通過比較限制積分在規(guī)定范圍內(nèi)變動,不得超出。

5.軟件編程

??根據(jù)理論公式進(jìn)行軟件編程,相信看完上面的講解后這段代碼應(yīng)該比較清晰易懂。

/*****************  
速度環(huán)PI控制器:Kp*Ek+Ki*Ek_S(Ek_S:偏差的積分)
******************/
int Velocity(int Target,int encoder_left,int encoder_right)
{
  // 定義成靜態(tài)變量,保存在靜態(tài)存儲器,使得變量不丟掉
  static int PWM_out,Encoder_Err,Encoder_S,EnC_Err_Lowout,EnC_Err_Lowout_last;
  float a=0.7;
  
  // 1.計算速度偏差
  //舍去誤差--我的理解:能夠讓速度為"0"的角度,就是機(jī)械中值。
  Encoder_Err = ((encoder_left+encoder_right)-Target);
  
  // 2.對速度偏差進(jìn)行低通濾波
  // low_out = (1-a)*Ek+a*low_out_last
  EnC_Err_Lowout = (1-a)*Encoder_Err + a*EnC_Err_Lowout_last; // 使得波形更加平滑,濾除高頻干擾,放置速度突變
  EnC_Err_Lowout_last = EnC_Err_Lowout;   // 防止速度過大影響直立環(huán)的正常工作
  
  // 3.對速度偏差積分出位移
  Encoder_S+=EnC_Err_Lowout;
  
  // 4.積分限幅
  Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
  
  // 5.速度環(huán)控制輸出
  PWM_out = Velocity_Kp*EnC_Err_Lowout+Velocity_Ki*Encoder_S;
  
  return PWM_out;
}

三、轉(zhuǎn)向環(huán)

1.中文公式

?轉(zhuǎn)向環(huán)輸出=系數(shù)×Z軸角速度
?(Z軸角速度由陀螺儀MPU6050測得)

2.軟件編程

??轉(zhuǎn)向環(huán)的編程比較簡單,我們只需設(shè)置一個參數(shù)調(diào)節(jié)Z軸角速度即可。

/*****************  
轉(zhuǎn)向環(huán):系數(shù)*Z軸角速度
******************/
int Turn(int gyro_Z)
{
  int PWM_out;
  
  PWM_out = (-0.6)*gyro_Z;
  
  return PWM_out;
}

四、控制函數(shù)


1、采集編碼器數(shù)據(jù)和MPU6050角度信息

?編碼器數(shù)據(jù):左電機(jī)速度,右電機(jī)速度
(兩個電機(jī)是相對安裝,剛好相差180度,為了編碼器輸出極性一致,就需要對其中一個取反)
?MPU6050數(shù)據(jù):角度數(shù)據(jù),角速度數(shù)據(jù),角加速度數(shù)據(jù)
2、將數(shù)據(jù)壓入閉環(huán)控制中,計算出控制輸出量

?直立環(huán)輸出
?速度環(huán)輸出
?轉(zhuǎn)向環(huán)輸出
3、把控制輸出量加載到電機(jī)上,完成最終的控制

?左電機(jī)輸出(編碼器放置相對)
?右電機(jī)輸出
?限幅
?賦值
4、控制中斷函數(shù)
?首先要判斷是否接受到中斷請求,即檢測MPU6050的ANT引腳是否處在低電平(即為發(fā)生中斷),然后清除中斷標(biāo)志位,進(jìn)行接下來三步(即上面的三個步驟)。
?

void EXTI9_5_IRQHandler(void)
{
  int PWM_out;
  if(EXTI_GetITStatus(EXTI_Line5)!=0) // 一級判定
  {
    if(PBin(5)==0)    // 二級判斷
    { 
      EXTI_ClearITPendingBit(EXTI_Line5); // 清除中斷標(biāo)志位
      // 1.采集編碼器數(shù)據(jù)&MPU6050角度信息
      // 電機(jī)是相對安裝,剛好相差180度,為了編碼器輸出極性一致,就需要對其中一個取反
      Encoder_Left  = -Read_Speed(2); 
      Encoder_Right = Read_Speed(4);
      
      mpu_dmp_get_data(&Pitch,&Roll,&Yaw);	    // 讀取角度
      MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);  // 讀取角速度
      MPU_Get_Accelerometer(&aacx,&aacy,&aacz); // 讀取加速度
      // 2.將數(shù)據(jù)壓入閉環(huán)控制中,計算出控制輸出量
			Velocity_out=Velocity(Target_Speed,Encoder_Left,Encoder_Right); // 速度環(huán)
      Vertical_out=Vertical(Velocity_out+Med_Angle,Roll,gyrox);			  // 直立環(huán)
			Turn_out=Turn(gyroz);	
      
      PWM_out=Vertical_out;//最終輸出
      
      // 3.把控制輸出量加載到電機(jī)上,完成最終控制
      MOTO1 = PWM_out-Turn_out; // 左電機(jī)
      MOTO2 = PWM_out+Turn_out; // 右電機(jī)
      Limit(&MOTO1,&MOTO2);     // PWM限幅
      Load(MOTO1,MOTO2);        // 加載到電機(jī)上
    }
  }
}

五、整個控制函數(shù)源代碼

1、control.c

#include "control.h"

float Med_Angle=0;      // 機(jī)械中值,能使得小車真正平衡住的角度 
float Target_Speed=0;	  // 期望速度。---二次開發(fā)接口,用于控制小車前進(jìn)后退及其速度。
float 
  Vertical_Kp=0,
  Vertical_Kd=0;     // 直立環(huán)Kp、Kd
float 
  Velocity_Kp=0,     // 速度環(huán)Kp、Ki(正反饋)
  Velocity_Ki=0;
float 
  Turn_Kp=0;

int Vertical_out,Velocity_out,Turn_out; // 直立環(huán)&速度環(huán)&轉(zhuǎn)向環(huán)的輸出變量

int Vertical(float Med,float Angle,float gyro_Y); // 函數(shù)聲明
int Velocity(int Target,int encoder_left,int encoder_right);
int Turn(int gyro_Z);

void EXTI9_5_IRQHandler(void)
{
  int PWM_out;
  if(EXTI_GetITStatus(EXTI_Line5)!=0) // 一級判定
  {
    if(PBin(5)==0)    // 二級判斷
    { 
      EXTI_ClearITPendingBit(EXTI_Line5); // 清除中斷標(biāo)志位
      // 1.采集編碼器數(shù)據(jù)&MPU6050角度信息
      // 電機(jī)是相對安裝,剛好相差180度,為了編碼器輸出極性一致,就需要對其中一個取反
      Encoder_Left  = -Read_Speed(2); 
      Encoder_Right = Read_Speed(4);
      
      mpu_dmp_get_data(&Pitch,&Roll,&Yaw);	    // 讀取角度
      MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);  // 讀取角速度
      MPU_Get_Accelerometer(&aacx,&aacy,&aacz); // 讀取加速度
      // 2.將數(shù)據(jù)壓入閉環(huán)控制中,計算出控制輸出量
			Velocity_out=Velocity(Target_Speed,Encoder_Left,Encoder_Right); // 速度環(huán)
      Vertical_out=Vertical(Velocity_out+Med_Angle,Roll,gyrox);			  // 直立環(huán)
			Turn_out=Turn(gyroz);	
      
      PWM_out=Vertical_out;//最終輸出
      
      // 3.把控制輸出量加載到電機(jī)上,完成最終控制
      MOTO1 = PWM_out-Turn_out; // 左電機(jī)
      MOTO2 = PWM_out+Turn_out; // 右電機(jī)
      Limit(&MOTO1,&MOTO2);     // PWM限幅
      Load(MOTO1,MOTO2);        // 加載到電機(jī)上
    }
  }
}

/*****************  
直立環(huán)PD控制器:Kp*Ek+Kd*Ek_D

入口:Med:機(jī)械中值(期望角度),Angle:真實角度,gyro_Y:真實角速度
出口:直立環(huán)輸出
******************/
int Vertical(float Med,float Angle,float gyro_Y) 
{
  int PWM_out;
  
  PWM_out = Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro_Y-0);
  
  return PWM_out;
} 

/*****************  
速度環(huán)PI控制器:Kp*Ek+Ki*Ek_S(Ek_S:偏差的積分)
******************/
int Velocity(int Target,int encoder_left,int encoder_right)
{
  // 定義成靜態(tài)變量,保存在靜態(tài)存儲器,使得變量不丟掉
  static int PWM_out,Encoder_Err,Encoder_S,EnC_Err_Lowout,EnC_Err_Lowout_last;
  float a=0.7;
  
  // 1.計算速度偏差
  //舍去誤差--我的理解:能夠讓速度為"0"的角度,就是機(jī)械中值。
  Encoder_Err = ((encoder_left+encoder_right)-Target);
  // 2.對速度偏差進(jìn)行低通濾波
  // low_out = (1-a)*Ek+a*low_out_last
  EnC_Err_Lowout = (1-a)*Encoder_Err + a*EnC_Err_Lowout_last; // 使得波形更加平滑,濾除高頻干擾,放置速度突變
  EnC_Err_Lowout_last = EnC_Err_Lowout;   // 防止速度過大影響直立環(huán)的正常工作
  // 3.對速度偏差積分出位移
  Encoder_S+=EnC_Err_Lowout;
  // 4.積分限幅
  Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
  
  // 5.速度環(huán)控制輸出
  PWM_out = Velocity_Kp*EnC_Err_Lowout+Velocity_Ki*Encoder_S;
  
  return PWM_out;
}

/*****************  
轉(zhuǎn)向環(huán):系數(shù)*Z軸角速度
******************/
int Turn(int gyro_Z)
{
  int PWM_out;
  
  PWM_out = Turn_Kp*gyro_Z;
  
  return PWM_out;
}

以上就是平衡小車系列文章第六講——位置式PID、直立環(huán)與速度環(huán)軟件編程講解,平衡小車系列文章作者在持續(xù)更新中。若文章中出現(xiàn)錯誤或者小伙伴對以上內(nèi)容有所疑問,歡迎大家在評論區(qū)留言,小政看到后會盡快回復(fù)大家!文章來源地址http://www.zghlxwxcb.cn/news/detail-435442.html

到了這里,關(guān)于(六)【平衡小車制作】位置式PID、直立環(huán)與速度環(huán)編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 直流有刷電機(jī)位置環(huán)控制與位置速度雙環(huán)控制(位置式PID)流程解析

    今天看野火的直流有刷電機(jī)pid控制的教程視頻,整個代碼實現(xiàn)過程看了好幾遍后還是感覺云里霧里,尤其是速度環(huán)、位置環(huán)、位置速度雙環(huán)這樣看下來,雖然老師視頻里該說的都說了,自己也能明確感受到位置環(huán)與位置速度雙環(huán)是有區(qū)別的,但不好好捋一下還真沒一下領(lǐng)略到

    2023年04月12日
    瀏覽(23)
  • 位置環(huán)速度環(huán)串級位置式PID實現(xiàn)全過程解析(詳細(xì))

    位置環(huán)速度環(huán)串級位置式PID實現(xiàn)全過程解析(詳細(xì))

    電機(jī)型號:MD36N行星減速電機(jī)_AB兩相光電編碼器霍爾編碼器 電機(jī)參數(shù): 單片機(jī)型號:STM32F429IG,keil 程序最終功能:串級位置式PID反復(fù)調(diào)節(jié)電機(jī),使得電機(jī)可以在一定范圍內(nèi)精準(zhǔn)任意??吭谀硞€位置,比如電機(jī)控制目標(biāo)在圓形軌道轉(zhuǎn)動,就可以實現(xiàn)在固定角度的位置停靠,四

    2023年04月08日
    瀏覽(20)
  • stm32平衡小車制作遇到的問題和解決方案分享

    ????????1、電機(jī)帶負(fù)載所引起的死區(qū)補(bǔ)償問題 ????????2、利用MPU6050傳感器進(jìn)行某一軸的角度測量問題 ????????3、stm32串口通訊得到的數(shù)據(jù)用DMA轉(zhuǎn)運問題 ????????我選用的電機(jī)為直流減速電機(jī),型號為GA25-370,是12V的電機(jī)。 ????????電機(jī)運行分為帶負(fù)載和不

    2024年01月18日
    瀏覽(19)
  • 不要將程序釘在直立位置

    Don’t Nail Your Program into the Upright Position I once wrote a spoof(惡作劇) C++ quiz(測驗), in which I satirically(諷刺地) suggested the following strategy for exception handling: By dint of plentiful (大量的) try…catch constructs throughout our code base, we are sometimes able to prevent our applications from aborting. We think of

    2024年02月04日
    瀏覽(13)
  • 平衡小車——陀螺儀

    可以通過MPU6050獲取加速度信息 可以通過DMP庫獲取角度信息 MPU6050 MPU6050是一種常用的集成電路(IC),結(jié)合了3軸陀螺儀和3軸加速度計。它用于各種需要運動跟蹤和感應(yīng)的電子項目和設(shè)備。MPU6050由英飛凌科技公司(InvenSense)制造,現(xiàn)在已被TDK收購。它的一些主要特點包括:

    2024年02月02日
    瀏覽(31)
  • 基于stm32的平衡小車

    基于stm32的平衡小車

    目錄 前言 一、電機(jī)驅(qū)動部分 1、TB6612FNG電機(jī)驅(qū)動模塊接線方式: 2、代碼使用定時器2的4路輸出pwm 3、gpio引腳初始化,以及前進(jìn),后退引腳設(shè)置 二、MPU6050陀螺儀部分 三、編碼器捕獲部分 四、pid部分 1、直立環(huán)KD 2、速度環(huán)KI 3、轉(zhuǎn)向環(huán)(PD) 五、藍(lán)牙通信部分 總結(jié) 經(jīng)過幾天對

    2024年02月09日
    瀏覽(22)
  • 平衡小車學(xué)習(xí)教程1——硬件資源及其小車底層硬件介紹篇

    平衡小車學(xué)習(xí)教程1——硬件資源及其小車底層硬件介紹篇

    大家在學(xué)會了Stm32后,可以做一個項目來進(jìn)行來進(jìn)行練手, 平衡小車 就 是一個很好的練手項目,可以檢驗自己的學(xué)習(xí)成果 ,也可以對學(xué)習(xí)到的知識進(jìn)行一個復(fù)習(xí)。再一個就是 通過做項目來鍛煉自己的工程能力。 好啦,廢話不多說, 本套教程預(yù)計分為兩部分 , 硬件底層介

    2024年02月11日
    瀏覽(24)
  • 復(fù)刻stm32平衡小車(適合入門)

    復(fù)刻stm32平衡小車(適合入門)

    目錄 前言: 1.硬件部分 1.1 STM32最小系統(tǒng) 1.2 電源 1.3 TB6612電機(jī)驅(qū)動模塊 1.4 串口通信 1.5 OLED模塊 1.6 藍(lán)牙模塊 1.7 LED燈模塊 ?1.8 MPU6050模塊?編輯 1.9 硬件焊接與調(diào)試 1.10 組裝 2.軟件部分 2.1 代碼 2.2 邏輯實現(xiàn) 2.2.1 control.c 2.2.2 usart.c 結(jié)尾 本文主要為復(fù)刻b站up主開源的平衡小車以及

    2024年02月13日
    瀏覽(21)
  • PID智能小車快速入門(一)

    PID智能小車快速入門(一)

    ? ? ? ? 1、什么是PID? ? ? ? ? ? ? ? ? PID控制器是一種線性控制器,通俗的來講如人走直線一樣,眼睛是觀測器,下肢為執(zhí)行器,當(dāng)走偏了由眼睛觀測得出當(dāng)前位置和直線的偏差,由人腦根據(jù)偏差調(diào)整腳步回歸直線的過程就是一個負(fù)反饋調(diào)節(jié)的過程,而PID控制器就是得到偏

    2024年01月20日
    瀏覽(39)
  • 智能車PID控制詳細(xì)介紹(普通PID、串級PID、改進(jìn)PID)——適用于四輪車、三輪車、平衡車

    智能車PID控制詳細(xì)介紹(普通PID、串級PID、改進(jìn)PID)——適用于四輪車、三輪車、平衡車

    聲明:該文是本人原創(chuàng),后續(xù)將參與智能車相關(guān)書籍的寫作,為了防止侵權(quán)只能先發(fā)圖片版還請諒解,如有問題,敬請指出,歡迎討論~~~~ 1 舵機(jī)組成及其工作原理 2 舵機(jī)PID控制策略 1 直流電機(jī)調(diào)速系統(tǒng)組成及其工作原理 2 電機(jī)PID控制策略 一、四輪電機(jī)控制 二、兩輪平衡車與

    2023年04月23日
    瀏覽(89)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包