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

【STM32】使用HAL庫進(jìn)行電機(jī)PID位置環(huán)控制,代碼+調(diào)參

這篇具有很好參考價值的文章主要介紹了【STM32】使用HAL庫進(jìn)行電機(jī)PID位置環(huán)控制,代碼+調(diào)參。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前面兩篇博文已經(jīng)實現(xiàn)了電機(jī)測速和PID速度環(huán)控制,在這篇博文中,我們主要說明位置環(huán)的代碼怎么寫以及PID參數(shù)怎么調(diào)。

1. 位置環(huán)代碼實現(xiàn)

? 寫完速度環(huán)后位置環(huán)就很簡單了。

? 在串級PID中,內(nèi)環(huán)的控制量一般是外環(huán)控制量的微分。在我們這里,外環(huán)是控制量是電機(jī)轉(zhuǎn)動的位置(也可以說是角度),內(nèi)環(huán)是電機(jī)轉(zhuǎn)動的速度,剛好滿足這個微分關(guān)系。

? 我們的思路是這樣的,我們給外環(huán)PID設(shè)定電機(jī)轉(zhuǎn)動的目標(biāo)位置,位置環(huán)PID計算得到電機(jī)此時的理想轉(zhuǎn)速,送到內(nèi)環(huán)速度環(huán),速度環(huán)計算得到此時PWM理想的占空比,并輸出給電機(jī)。雙環(huán)PID就需要兩個反饋量,速度環(huán)的反饋量仍然是電機(jī)的速度,而位置環(huán)的反饋量可以使用編碼器輸出的脈沖總數(shù)。由于電機(jī)正轉(zhuǎn)時脈沖總數(shù)會增加,而反轉(zhuǎn)時脈沖總數(shù)會減少,所以脈沖總數(shù)其實是和電機(jī)轉(zhuǎn)動的位置一一對應(yīng)的。

? 位置環(huán)實現(xiàn)代碼如下

? 因為死區(qū)和剎車這些東西位置環(huán)和速度環(huán)不一樣,為了和速度環(huán)區(qū)分開,我們需要在PID.c中加上一個位置環(huán)的PID函數(shù)。

PID pid_speed,pid_position;
/**********************************
 * 功能:PID結(jié)構(gòu)體參數(shù)初始化
 * 輸入:無
 * 返回:無
 * *******************************/
void PID_Init(void)//PID參數(shù)初始化
{
    pid_speed.err = 0;
    pid_speed.integral = 0;
    pid_speed.maxIntegral = 1000;
    pid_speed.maxOutput = __HAL_TIM_GetAutoreload(&PWM_TIM);
    pid_speed.lastErr = 0;
    pid_speed.output = 0;
    pid_speed.kp = KP_speed;
    pid_speed.ki = KI_speed;
    pid_speed.kd = KD_speed;

    pid_position.err = 0;
    pid_position.integral = 0;
    pid_position.maxIntegral = 80;
    pid_position.maxOutput = __HAL_TIM_GetAutoreload(&PWM_TIM);
    pid_position.lastErr = 0;
    pid_position.output = 0;
    pid_position.kp = KP_position;//這幾個宏定義要自己補(bǔ)充
    pid_position.ki = KI_position;
    pid_position.kd = KD_position;
}

/****************************************
 * 作用:位置環(huán)PID計算
 * 參數(shù):PID參數(shù)結(jié)構(gòu)體地址;目標(biāo)值;反饋值
 * 返回值:無
 * ****************************************/
float Location_PID_Realize(PID* pid,float target,float feedback)//一次PID計算
{
     if(pid->err < 0.5 && pid->err > -0.5) pid->err = 0;//pid死區(qū)
    pid->err = target - feedback;
    pid->integral += pid->err;

    if(pid->ki * pid->integral < -pid->maxIntegral) pid->integral = -pid->maxIntegral / pid->ki;//積分限幅
    else if(pid->ki * pid->integral > pid->maxIntegral) pid->integral = pid->maxIntegral / pid->ki;

    pid->output = (pid->kp * pid->err) + (pid->ki * pid->integral) + (pid->kd * (pid->err - pid->lastErr));//全量式PID

    //輸出限幅
    if(pid->output > pid->maxOutput) pid->output = pid->maxOutput;
    if(pid->output < -pid->maxOutput) pid->output = -pid->maxOutput;

    pid->lastErr = pid->err;

    return pid->output;
}

? 定時器函數(shù)如下

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

    Motor_Contorl(htim);//我把測速和PID封裝成一個函數(shù)了
}
    
void Motor_Contorl(TIM_HandleTypeDef *htim)
{
    Motor_Get_Speed(htim);//得到電機(jī)轉(zhuǎn)速
    Now_Position = (float)(motor1.totalCount-10000)// 得到當(dāng)前位置 10000編碼器脈沖計數(shù)的初始值
    Target_Speed = Location_PID_Realize(&pid_position,Target_Position,Now_Position);//位置環(huán) Target_Position是目標(biāo)位置,自行定義即可
    motor_Out = Speed_PID_Realize(&pid_speed,Target_Speed,motor1.speed);//速度環(huán)
    if(motor_L_Out >= 0)
    {
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_FORWARD, 1000);
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_BACKWARD, 1000-motor_Out);
    }
    else
    {
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_BACKWARD, 1000);
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_FORWARD, 1000+motor_Out);
    }
}

? 現(xiàn)在位置環(huán)的代碼就完成了,下一步我們需要進(jìn)行PID調(diào)參

2. 位置環(huán)PID調(diào)參

? 位置環(huán)調(diào)參和速度環(huán)有很大區(qū)別,按我的經(jīng)驗來說,一般用不到I和D,我們只要調(diào)整P就好。

? 我們從0開始逐步增大P,直到電機(jī)在前往目標(biāo)位置的過程中是滿速,而到達(dá)目標(biāo)位置后不會超調(diào)、震蕩就行,位置環(huán)調(diào)好后曲線應(yīng)該是這樣的:

stm32電機(jī)位置控制,stm32,單片機(jī),嵌入式硬件

? 上圖中,紅線是目標(biāo)位置,綠線是當(dāng)前位置,這里的位置并不是脈沖數(shù),而是換算到了實際場景中,單位是cm,用脈沖數(shù)也是一樣的。

如果覺得電機(jī)達(dá)到目標(biāo)速度的過程中速度過快,可以對位置環(huán)的輸出進(jìn)行限幅。文章來源地址http://www.zghlxwxcb.cn/news/detail-594277.html

到了這里,關(guān)于【STM32】使用HAL庫進(jìn)行電機(jī)PID位置環(huán)控制,代碼+調(diào)參的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【STM32】使用HAL庫進(jìn)行電機(jī)測速,原理、代碼、濾波

    【STM32】使用HAL庫進(jìn)行電機(jī)測速,原理、代碼、濾波

    參考資料: https://blog.csdn.net/lzzzzzzm/article/details/119416134 野火STM32電機(jī)開發(fā)教程 常見的編碼器有兩種,分別為霍爾編碼器和GMR編碼器。 1.1 霍爾編碼器 ? 霍爾編碼器圓盤上分布有磁極,當(dāng)圓盤隨電機(jī)主軸轉(zhuǎn)動時,會輸出兩路相位差90°的方波,用這兩路方波可測出電機(jī)的轉(zhuǎn)速和

    2024年01月24日
    瀏覽(18)
  • STM32 HAL庫PID控制電機(jī) 第二章 TB6612FNG芯片驅(qū)動GB37-520電機(jī)

    STM32 HAL庫PID控制電機(jī) 第二章 TB6612FNG芯片驅(qū)動GB37-520電機(jī)

    1 電路圖 2 TB6612簡介 TB6612是雙驅(qū)動,可同時驅(qū)動兩個電機(jī) STBY:接單片機(jī)的IO口清零電機(jī)全部停止,置1通過AIN1 AIN2,BIN1,BIN2 來控制正反轉(zhuǎn) VM:建議接10V以內(nèi)電源( 瞬間上電12V可能會有尖峰電壓擊穿器件 ) VCC:接5V電源 GND:接電源負(fù)極 PWMA:接單片機(jī)的PWM口 ,控制轉(zhuǎn)速 PWM

    2023年04月22日
    瀏覽(28)
  • stm32(HAL)庫編碼器電機(jī)pid代碼及利用VOFA+對Pid波形顯示調(diào)參

    stm32(HAL)庫編碼器電機(jī)pid代碼及利用VOFA+對Pid波形顯示調(diào)參

    PID控制是一種經(jīng)典的反饋控制算法,它通過不斷地調(diào)整輸出來使系統(tǒng)的實際值與設(shè)定值盡量接近,并保持在設(shè)定值附近。PID控制器由三個部分組成:比例§、積分(I)和微分(D)。 比例作用(P):比例作用通過測量實際值與設(shè)定值之間的偏差,乘以一個比例系數(shù)來產(chǎn)生輸出。輸出

    2024年02月13日
    瀏覽(51)
  • 使用Simulink代碼生成工具基于STM32開發(fā)板對永磁同步電機(jī)進(jìn)行開環(huán)控制

    使用Simulink代碼生成工具基于STM32開發(fā)板對永磁同步電機(jī)進(jìn)行開環(huán)控制

    代碼鏈接:【免費】使用Simulink代碼生成工具對永磁同步電機(jī)進(jìn)行開環(huán)控制資源-CSDN文庫 本文介紹使用Simulink代碼生成功能在STM32開發(fā)板平臺上運行永磁同步電機(jī)。 硬件基礎(chǔ): Nucleo-G431RB開發(fā)板 X-NUCLEO-IHM07M1驅(qū)動擴(kuò)展板 57BLDC-24V-210W時代超群直流電機(jī) 軟件基礎(chǔ): MATLAB 2022b 安裝

    2023年04月14日
    瀏覽(83)
  • STM32 Simulink 自動代碼生成電機(jī)控制——記錄一次電機(jī)初始位置檢測及NS極的判斷實驗

    STM32 Simulink 自動代碼生成電機(jī)控制——記錄一次電機(jī)初始位置檢測及NS極的判斷實驗

    目錄 前言 ?基本原理 仿真實現(xiàn) 代碼生成及開發(fā)板驗證 之前做了脈振高頻注入的仿真到代碼生成開發(fā)板運行的實驗,電機(jī)可以通過高頻注入計算出角度,但是在初始位置檢測的時候,嘗試了不少方法但是效果一般,很容易反轉(zhuǎn),由于時間關(guān)系沒有花太多時間和精力,最近又嘗

    2024年02月13日
    瀏覽(30)
  • 【STM32】使用HAL庫對ULN2003控制28BYJ-48步進(jìn)電機(jī)

    【STM32】使用HAL庫對ULN2003控制28BYJ-48步進(jìn)電機(jī)

    步進(jìn)電機(jī)是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移,通過控制施加在電機(jī)線圈上的電脈沖順序、頻率和數(shù)量,可以控制步進(jìn)電機(jī)的轉(zhuǎn)向、速度和旋轉(zhuǎn)角度。 配合以直線運動執(zhí)行機(jī)構(gòu)(螺紋絲桿)或齒輪箱裝置,更可以實現(xiàn)更加復(fù)雜、精密的線性運動控制要求。 在非超載的情況下,

    2024年02月16日
    瀏覽(27)
  • STM32機(jī)器人控制開發(fā)教程No.4 使用串口通信控制電機(jī)(基于HAL庫)

    STM32機(jī)器人控制開發(fā)教程No.4 使用串口通信控制電機(jī)(基于HAL庫)

    在機(jī)器人控制中,單片機(jī)(Arduino/STM32)與上位機(jī)(Raspberry Pi/NVIDIA Jetson nano)之間的通信經(jīng)常采用串口通信的方式,那應(yīng)該如何使用STM32的串口通信以及根據(jù)自己定義的協(xié)議來完成數(shù)據(jù)的接收與發(fā)送呢?在本篇文章中將給你演示如何通過自定協(xié)議來完成對電機(jī)的控制以及獲取編碼

    2023年04月25日
    瀏覽(37)
  • [FOC-Simulink]使用Simulink代碼生成工具基于STM32開發(fā)板對永磁同步電機(jī)進(jìn)行開環(huán)控制

    [FOC-Simulink]使用Simulink代碼生成工具基于STM32開發(fā)板對永磁同步電機(jī)進(jìn)行開環(huán)控制

    代碼鏈接:【免費】使用Simulink代碼生成工具對永磁同步電機(jī)進(jìn)行開環(huán)控制資源-CSDN文庫 本文介紹使用Simulink代碼生成功能在STM32開發(fā)板平臺上運行永磁同步電機(jī)。 硬件基礎(chǔ): Nucleo-G431RB開發(fā)板 X-NUCLEO-IHM07M1驅(qū)動擴(kuò)展板 57BLDC-24V-210W時代超群直流電機(jī) 軟件基礎(chǔ): MATLAB 2022b 安裝

    2024年02月13日
    瀏覽(17)
  • 基于stm32的減速直流電機(jī)PID算法控制

    基于stm32的減速直流電機(jī)PID算法控制

    本例程采用了HAL庫進(jìn)行項目開發(fā)(主要使用軟件CubexMX和keil5),文章末尾會有代碼開源,歡迎各位對文章進(jìn)行指正和探討。 ????????硬件組成:stm32f103c8t6最小系統(tǒng)板;0.96寸LED12864(I2C通訊模式);智能小車12v移動電源;25GA370直流減速電機(jī)(帶霍爾編碼器);JDY-31藍(lán)牙模塊

    2024年02月20日
    瀏覽(22)
  • QT上位機(jī)控制stm32,并利用PID控制編碼電機(jī)旋轉(zhuǎn)

    QT上位機(jī)控制stm32,并利用PID控制編碼電機(jī)旋轉(zhuǎn)

    QT上位機(jī)控制stm32,并利用PID控制編碼電機(jī)旋轉(zhuǎn)?? ??????? ? 由于最近在學(xué)習(xí)電機(jī)控制算法之類的東西,看到論文大多使用PID、或以PID衍生的ADRC作為電機(jī)的主流控制,于是自己也寫了一個stm32控制L298N以驅(qū)動直流電機(jī)的程序,并用QT做了一個上位機(jī)實現(xiàn)了用軟件改變PID的參數(shù)

    2023年04月09日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包