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

STM32CubeMX 直流電機(jī)串級(jí)PID位置速度控制、HAL庫、cubemx、PID、串級(jí)PID、位置控制、速度控制、雙環(huán)控制

這篇具有很好參考價(jià)值的文章主要介紹了STM32CubeMX 直流電機(jī)串級(jí)PID位置速度控制、HAL庫、cubemx、PID、串級(jí)PID、位置控制、速度控制、雙環(huán)控制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

提示:本文章的串級(jí)PID位置速度控制,是在前兩篇文章速度控制,位置控制的基礎(chǔ)上實(shí)現(xiàn)的,這一章節(jié)中不需要額外的cubemx的配置,只需要寫簡(jiǎn)單的代碼即可,復(fù)雜的地方在于串級(jí)pid的調(diào)試過程。


前言

pid是我們?cè)趯W(xué)習(xí)單片機(jī)中首先要學(xué)會(huì)的控制算法,而串級(jí)pid又是在單pid的基礎(chǔ)上衍生出來的,他能更好的控制系統(tǒng),這篇文章主要介紹stm32如何編寫串級(jí)pid的代碼,沒有對(duì)pid進(jìn)行分析和解釋,要想了解串級(jí)原理的可以參考這篇文章。


一、代碼

在之前的基礎(chǔ)上我們已經(jīng)能分別對(duì)電機(jī)的位置和電機(jī)的速度進(jìn)行相應(yīng)的控制了 ,那么現(xiàn)在的問題是當(dāng)電機(jī)轉(zhuǎn)到指定位置的過程中電機(jī)的速度不可控,所以我們就需要通過串級(jí)pid來進(jìn)行速度的調(diào)節(jié),我么把電機(jī)的位置環(huán)作為外環(huán),電機(jī)的轉(zhuǎn)速我們作為內(nèi)環(huán)。

1.pid

和前面一節(jié)的區(qū)別就是多了一個(gè)Double_Loop_Control()函數(shù),其實(shí)這個(gè)函數(shù)就是簡(jiǎn)單的把兩個(gè)串在一起而已,代碼閱讀起來很簡(jiǎn)單,就不多說了。
pid.c

int Double_Loop_Control(int position, int target_position, int current_speed, int desired_speed)
{
    int target_speed;
    int pwm_output;

		// 位置環(huán)控制
		target_speed = Position_PID(position, target_position);
		/* 目標(biāo)速度上限處理 */
		if (target_speed > desired_speed)// 目標(biāo)速度的最大值
		{
			target_speed = desired_speed;
		}
		else if (target_speed < -desired_speed)
		{
			target_speed = -desired_speed;
		}


    // 速度環(huán)控制
    pwm_output = Incremental_PI(current_speed, target_speed);	
    return pwm_output;
}
/*											多環(huán)控制  										*/
/*
*	函數(shù)功能:位置式PID控制器
*	入口參數(shù):編碼器測(cè)量位置信息,目標(biāo)位置
*	返回  值:電機(jī)PWM
*	根據(jù)位置式離散PID公式 
*	pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
*	e(k)代表本次偏差 
*	e(k-1)代表上一次的偏差  
*	∑e(k)代表e(k)以及之前的偏差的累積和;其中k為1,2,,k;
*	pwm代表輸出
**************************************************************************/
int Position_PID (int position,int target)
{ 
	float Kp=0.5,Ki=0.005,Kd=1;	
	static float Bias,Pwm,Integral_bias,Last_Bias;
	Bias=target-position;                                  //計(jì)算偏差
	Integral_bias+=Bias;	                                 //求出偏差的積分
	if(Integral_bias>400)Integral_bias=400;				//對(duì)積分 限幅
	if(Integral_bias<-400)Integral_bias=-400;		//積分限幅 防止到達(dá)目標(biāo)位置后過沖
	Pwm=Kp*Bias+Ki*Integral_bias+Kd*(Bias-Last_Bias);       //位置式PID控制器
	Last_Bias=Bias;                                       //保存上一次偏差 
	return Pwm;                                           //增量輸出
}
/**************************************************************************
函數(shù)功能:增量PI控制器
入口參數(shù):編碼器測(cè)量值,目標(biāo)速度
返回  值:電機(jī)PWM
根據(jù)增量式離散PID公式 
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差  以此類推 
pwm代表增量輸出
在我們的速度控制閉環(huán)系統(tǒng)里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{ 	
	float Kp=30,Ki=10;	
	static int Bias,Pwm,Last_bias;
	Bias=Target-Encoder;                //計(jì)算偏差
	Pwm+=Kp*(Bias-Last_bias)+Ki*Bias;   //增量式PI控制器
	Last_bias=Bias;	                   //保存上一次偏差 
	return Pwm;                         //增量輸出
}
/**************************************************************************
函數(shù)功能:限制PWM賦值 
入口參數(shù):無
返回  值:無
**************************************************************************/
int Xianfu_Pwm(int moto) //限制幅度的函數(shù)
 {
   int Amplitude=7000;  //===PWM滿幅是8400 限制7000
	 if(moto<-Amplitude)  moto = -Amplitude;
	 if(moto>Amplitude)   moto =  Amplitude;
	 return moto;
 }

pid.h

#ifndef __PID_H
#define __PID_H
#include "main.h"
#include "moto.h"
int Double_Loop_Control(int position, int target_position, int current_speed, int desired_speed);
int Position_PID (int position,int target);
int Incremental_PI (int Encoder,int Target);
int Xianfu_Pwm(int moto) ;//限制幅度的函數(shù)
#endif

2.it.c文件

就是簡(jiǎn)單的得到的速度值和位置值進(jìn)行賦值。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//雙環(huán)
{
  if(htim==(&htim9))//因?yàn)槲也捎玫氖嵌〞r(shí)器6
  {
    int target_position=20000;
		int desired_speed=70;		
		int moto_pwm;
		int Encoder;
		int CurrentPosition_;
		Encoder=Read_Encoder();
		CurrentPosition_=Read_CurrentPosition();
		moto_pwm=Double_Loop_Control(CurrentPosition_, target_position, Encoder, desired_speed);
		moto_pwm=Xianfu_Pwm(moto_pwm);
		Set_Pwm(moto_pwm);
		printf("samples: %d ,%d ,%d ,%d ,%d \n",CurrentPosition_,target_position, Encoder, desired_speed,moto_pwm);	
  }
}

二、串級(jí)調(diào)參的方法

其中位置環(huán)采用的是位置式PID控制器,速度環(huán)采用的是增量式PI控制器。在這種情況下,您需要分別調(diào)整位置環(huán)和速度環(huán)的PID參數(shù),以下是一些基本的參考步驟:
調(diào)整位置環(huán)的PID參數(shù):
a. 將Ki和Kd參數(shù)設(shè)為0,僅保留Kp參數(shù)。
b. 將目標(biāo)位置值設(shè)置為一個(gè)較小的值(例如10),逐步增加Kp,直到系統(tǒng)開始出現(xiàn)持續(xù)振蕩。記錄此時(shí)的Kp值,稱為臨界增益Ku2。同時(shí),記錄振蕩周期,稱為臨界周期Tu2。
c. 使用Ziegler-Nichols方法設(shè)置位置式PID控制器的參數(shù)。例如,可以使用以下參數(shù):
Kp2 = 0.6 * Ku2
Ki2 = 2 * Kp2 / Tu2
Kd2 = Kp2 * Tu2 / 8
d. 應(yīng)用調(diào)整后的位置環(huán)參數(shù),并觀察系統(tǒng)性能。如果仍然需要改進(jìn),請(qǐng)微調(diào)參數(shù),直到獲得滿意的位置控制性能。
調(diào)整速度環(huán)的PID參數(shù):
a. 將Kd參數(shù)設(shè)為0,僅保留Kp和Ki參數(shù)。
b. 將目標(biāo)速度值設(shè)置為一個(gè)較小的值(例如50),逐步增加Kp,直到系統(tǒng)開始出現(xiàn)持續(xù)振蕩。記錄此時(shí)的Kp值,稱為臨界增益Ku1。同時(shí),記錄振蕩周期,稱為臨界周期Tu1。
c. 使用Ziegler-Nichols方法設(shè)置增量式PI控制器的參數(shù)。例如,可以使用以下參數(shù):
Kp1 = 0.6 * Ku1 / 20
Ki1 = 2 * Kp1 * 20 / Tu1
d. 應(yīng)用調(diào)整后的速度環(huán)參數(shù),并觀察系統(tǒng)性能。如果仍然需要改進(jìn),請(qǐng)微調(diào)參數(shù),直到獲得滿意的速度控制性能。
需要注意的是,在實(shí)際調(diào)試過程中,根據(jù)系統(tǒng)的實(shí)際需求和工作條件,可能需要在Ziegler-Nichols建議的參數(shù)基礎(chǔ)上進(jìn)行微調(diào)。您可以嘗試修改各個(gè)參數(shù),觀察系統(tǒng)對(duì)其的敏感程度,并據(jù)此進(jìn)行優(yōu)化。同時(shí),調(diào)整參數(shù)的過程中也需要密切關(guān)注系統(tǒng)的響應(yīng)和性能,避免引起系統(tǒng)不穩(wěn)定或控制性能不佳等問題。

下面介紹一下我的方法:
1.內(nèi)環(huán)的參數(shù)整定
由于內(nèi)環(huán)是速度環(huán),要是前面你的速度環(huán)已經(jīng)整定完畢以后你就可以直接使用那個(gè)值了,這時(shí)候千萬不要讓外環(huán)接入。
最簡(jiǎn)答的方法就是Double_Loop_Control()函數(shù)中的

    // 速度環(huán)控制
    pwm_output = Incremental_PI(current_speed, target_speed);

將其中的target_speed直接寫成一個(gè)固定的值例如設(shè)置為15

    // 速度環(huán)控制
    pwm_output = Incremental_PI(current_speed, 15);

由此去整定速度環(huán)中p和i的值(因?yàn)橛玫氖莗i增量式所以沒有d)。
2.外環(huán)的參數(shù)整定
當(dāng)內(nèi)環(huán)的整定完畢以后就可以把剛剛修改成15的那個(gè)改回原來的target_speed
這時(shí)候就先設(shè)置p為0.005,id都為0,這個(gè)時(shí)候來觀察圖像。
例如p為0.5時(shí)候圖像
pid雙環(huán)控制,stm32,stm32,單片機(jī),嵌入式硬件
然后有些抖動(dòng)我們就縮小p的值
pid雙環(huán)控制,stm32,stm32,單片機(jī),嵌入式硬件
這時(shí)候看來就好了很多,然后就需要對(duì)i的值進(jìn)行整定
開的時(shí)候我把i設(shè)置為1,圖像有明顯的抖動(dòng)
pid雙環(huán)控制,stm32,stm32,單片機(jī),嵌入式硬件
這種大的抖動(dòng)就需要?2或者?10,接著我設(shè)定為0.5抖動(dòng)沒有絲毫的變化,接著我又設(shè)置為0.05
pid雙環(huán)控制,stm32,stm32,單片機(jī),嵌入式硬件
抖動(dòng)基本消除,但是依然還有幾個(gè)波動(dòng),接著減小為0.005
pid雙環(huán)控制,stm32,stm32,單片機(jī),嵌入式硬件
這個(gè)時(shí)候的基本沒有抖動(dòng)了大致已經(jīng)是我么需要的樣子了。
還需要調(diào)整一下d的值以次來抵御外部的干擾,我將其設(shè)置為1。文章來源地址http://www.zghlxwxcb.cn/news/detail-633623.html

總結(jié)

文件下載地址

到了這里,關(guān)于STM32CubeMX 直流電機(jī)串級(jí)PID位置速度控制、HAL庫、cubemx、PID、串級(jí)PID、位置控制、速度控制、雙環(huán)控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • [proteus]STM32F103單片機(jī)直流電機(jī)PID算法PWM波電機(jī)調(diào)速正反轉(zhuǎn)Proteus仿真

    1、實(shí)現(xiàn)功能: (1)、基于STM32F103單片機(jī)PID算法PWM控制直流電機(jī)正反轉(zhuǎn)調(diào)速,LCD1602顯示轉(zhuǎn)速等??赏ㄟ^“加速”、“減速”按鍵修改“目標(biāo)轉(zhuǎn)速”并實(shí)時(shí)測(cè)量“實(shí)際轉(zhuǎn)速”送到LCD1602上顯示。 (2)、“啟動(dòng)”按鍵控制電機(jī)啟動(dòng),默認(rèn)啟動(dòng)電機(jī)是正轉(zhuǎn)(示波器上的黃色PWM波)。 (3)、“

    2024年02月06日
    瀏覽(26)
  • 【STM32】cubeMX配置HAL庫驅(qū)動(dòng)L298N控制直流有刷電機(jī)

    【STM32】cubeMX配置HAL庫驅(qū)動(dòng)L298N控制直流有刷電機(jī)

    目錄 1.電機(jī)為什么需要驅(qū)動(dòng)板呢?為什么不能用控制器直接控制電機(jī)呢? 2.H橋電路介紹 3.L298N原理介紹 4.實(shí)物接線圖 5.CUBEMX配置 6.代碼 7. 演示視頻 L298N是常用來驅(qū)動(dòng)小型直流有刷電機(jī)(兩個(gè))和步進(jìn)電機(jī)(一個(gè))的電機(jī)驅(qū)動(dòng)板,其電路原理就是兩個(gè)H橋電路,控制原理是使用

    2024年02月16日
    瀏覽(78)
  • 直流有刷電機(jī)位置環(huán)控制與位置速度雙環(huán)控制(位置式PID)流程解析

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

    2023年04月12日
    瀏覽(23)
  • STM32控制直流電機(jī)轉(zhuǎn)向

    一、所需硬件模塊 1.主控芯片:STM32F103C8T6 2.程序下載器:STLINK 3.電機(jī):直流電機(jī) 4.電機(jī)驅(qū)動(dòng)模塊:L298N 二、模塊介紹 1、主控芯片采用的是STM32系列的最小系統(tǒng)板,通過控制其引腳的輸出進(jìn)而實(shí)現(xiàn)對(duì)電機(jī)的控制; 2、STLINK下載器是用于燒錄程序,其中的SWCLK、SWDLO、GND、3.3V引腳

    2024年02月07日
    瀏覽(56)
  • STM32PWM控制直流電機(jī)

    STM32PWM控制直流電機(jī)

    PWM介紹 脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡(jiǎn)稱脈寬調(diào)制,是利用 微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡(jiǎn)單一點(diǎn),就是對(duì)脈沖寬 度的控制 PWM的原理: 假定定時(shí)器工作在向上計(jì)數(shù) PWM 模式,且當(dāng) CNT=CCRx 時(shí)輸出 1。那么就可以

    2024年02月08日
    瀏覽(17)
  • stm32+TB6612驅(qū)動(dòng)直流電機(jī)

    stm32+TB6612驅(qū)動(dòng)直流電機(jī)

    ????????因?yàn)閱纹瑱C(jī)的不可以直接的驅(qū)動(dòng)電機(jī),所以需要在他們之間加上一個(gè)電機(jī)的驅(qū)動(dòng)模塊,之前的文章里面用過L298N電機(jī)驅(qū)動(dòng)模塊,現(xiàn)在再給大家推薦一個(gè)新的電機(jī)驅(qū)動(dòng)模塊,他比L298N好用許多,而且占用體積小,發(fā)熱也少。TB6612可以一次驅(qū)動(dòng)兩個(gè)直流電機(jī),輸出PWM也

    2024年02月15日
    瀏覽(21)
  • 基于STM32的智能巡檢小車系統(tǒng)設(shè)計(jì)--STM32最小系統(tǒng)、直流電機(jī)、直流電源模塊設(shè)計(jì)

    基于STM32的智能巡檢小車系統(tǒng)設(shè)計(jì)--STM32最小系統(tǒng)、直流電機(jī)、直流電源模塊設(shè)計(jì)

    作者:車 郵箱:692604135@qq.com 學(xué)校:西安工程大學(xué)碩士研究生 方向:機(jī)器視覺、圖像分割、深度學(xué)習(xí) 在介紹具體實(shí)現(xiàn)功能之前,需要介紹以下模塊。 本課題選擇的單片機(jī)是ST(意法半導(dǎo)體)開發(fā)的STM32F407VET6。 這是一款采用Corte-M4為內(nèi)核的高性能32位ARM微控制器。該芯片支持

    2024年02月10日
    瀏覽(96)
  • STM32第八課:PWM控制直流電機(jī)

    STM32第八課:PWM控制直流電機(jī)

    ????????TB6612FNG是一款新型驅(qū)動(dòng)器件,能獨(dú)立雙向控制2個(gè)直流電機(jī),它具有很高的集成度,同時(shí)能提供足夠的輸出能力,運(yùn)行性能和能耗方面也具有優(yōu)勢(shì)因此在集成化、小型化的電機(jī)控制系統(tǒng)中,它可以作為理想的電機(jī)驅(qū)動(dòng)器件。 ??????????????????????????

    2024年03月24日
    瀏覽(21)
  • STM32-微項(xiàng)目03-pwm控制直流電機(jī)運(yùn)行

    STM32-微項(xiàng)目03-pwm控制直流電機(jī)運(yùn)行

    一,項(xiàng)目目標(biāo) 實(shí)現(xiàn)利用STM32F103C8T6+TB6612,輸出不同占空比輸出的PWM波,從而實(shí)現(xiàn)電機(jī)不同轉(zhuǎn)速的運(yùn)行、正反轉(zhuǎn)的功能; ? ?二、硬件涉及 1,STM32核心板 2,TB6612直流電機(jī)驅(qū)動(dòng)模塊 3,直流電機(jī)? 三、硬件接線涉及 1,先看TB6612直流電機(jī)驅(qū)動(dòng)模塊: ①驅(qū)動(dòng)模塊是具備兩路PWM輸入

    2024年02月04日
    瀏覽(19)
  • stm32——pwm驅(qū)動(dòng)LED燈、舵機(jī)、直流電機(jī)

    stm32——pwm驅(qū)動(dòng)LED燈、舵機(jī)、直流電機(jī)

    改為PA15,選擇重映射方式1或完全重映射 在時(shí)鐘開啟后寫入 PWM頻率=計(jì)數(shù)器更新頻率 比如要產(chǎn)生一個(gè)頻率為1KHz,占空比為50%,分辨率為1%的PWM波形 72M/(PSC+1)/ (ARR+1)=1000 CCR/(ARR+1)=0.5 1/(ARR+1)=0.01 計(jì)算得:ARR=99,CCR=50, PSC=720-1; 常用模式為 PWM1模式1 PWM.c PWM.h main.c 參數(shù)計(jì)算 PWM.c Servo.

    2024年02月04日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包