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

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

這篇具有很好參考價(jià)值的文章主要介紹了stm32(HAL)庫(kù)編碼器電機(jī)pid代碼及利用VOFA+對(duì)Pid波形顯示調(diào)參。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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

基本介紹

PID控制是一種經(jīng)典的反饋控制算法,它通過不斷地調(diào)整輸出來使系統(tǒng)的實(shí)際值與設(shè)定值盡量接近,并保持在設(shè)定值附近。PID控制器由三個(gè)部分組成:比例§、積分(I)和微分(D)。

比例作用(P):比例作用通過測(cè)量實(shí)際值與設(shè)定值之間的偏差,乘以一個(gè)比例系數(shù)來產(chǎn)生輸出。輸出與偏差成正比,用來調(diào)整系統(tǒng)的響應(yīng)速度和穩(wěn)定性。較大的比例系數(shù)會(huì)增加系統(tǒng)的靈敏度,但可能導(dǎo)致過渡振蕩。
積分作用(I):積分作用通過將偏差的累積值乘以一個(gè)積分系數(shù)來產(chǎn)生輸出。積分作用能夠消除系統(tǒng)的靜差,提高系統(tǒng)的穩(wěn)定性和響應(yīng)速度。然而,過大的積分系數(shù)可能導(dǎo)致系統(tǒng)過度響應(yīng)和振蕩。
微分作用(D):微分作用通過測(cè)量偏差變化率,并乘以一個(gè)微分系數(shù)來產(chǎn)生輸出。微分作用能夠預(yù)測(cè)系統(tǒng)的未來趨勢(shì),以防止過沖和振蕩。合適的微分系數(shù)可以提高系統(tǒng)的響應(yīng)速度和穩(wěn)定性,但過大的微分系數(shù)可能導(dǎo)致靈敏度降低。
PID控制器的輸出是比例、積分和微分的加權(quán)和,即輸出 = P * 偏差 + I * 積分值 + D * 變化率。通過調(diào)整比例、積分和微分系數(shù),可以根據(jù)實(shí)際需求優(yōu)化系統(tǒng)的性能。
hal編碼器,stm32,單片機(jī),嵌入式硬件pid的控制規(guī)律:
hal編碼器,stm32,單片機(jī),嵌入式硬件
Kp——比例系數(shù); Ti——積分時(shí)間常數(shù); TD——微分時(shí)間常數(shù)

利用pid控制電機(jī)是我們學(xué)習(xí)pid的基礎(chǔ),以下是我用HAL庫(kù)通過stm32控制編碼器電機(jī)pid代碼及利用VOFA+對(duì)Pid波形顯示調(diào)參

配置與程序部分

以F103為例配置hal,其實(shí)其他版本的也差不多
先基礎(chǔ)配置時(shí)鐘樹,RCC,SYS,這里可以略過了
hal編碼器,stm32,單片機(jī),嵌入式硬件
先配置io輸出引腳,供一個(gè)電機(jī),到下面寫代碼會(huì)define控制引腳高電平低電平,控制電機(jī)正反轉(zhuǎn)

接下來需要配置3個(gè)定時(shí)器,分別用于pwm輸出,編碼器捕獲,和中斷。編碼器捕獲用于識(shí)別脈沖,計(jì)算速度反饋給pid調(diào)速,中斷定時(shí)器里就用于中斷回調(diào)計(jì)算pid。接下來配置定時(shí)器
hal編碼器,stm32,單片機(jī),嵌入式硬件
配置定時(shí)器2打開編碼器捕獲
hal編碼器,stm32,單片機(jī),嵌入式硬件
定時(shí)器3,pwm輸出
hal編碼器,stm32,單片機(jī),嵌入式硬件
定時(shí)器4
hal編碼器,stm32,單片機(jī),嵌入式硬件
我們還要利用usart與上位機(jī)通信顯示波形
這里我用的usart2,usart1和I2c是之前我用來和藍(lán)牙通信的和iled的,可以不管
最后還要去NVIC里設(shè)置中斷優(yōu)先
hal編碼器,stm32,單片機(jī),嵌入式硬件
這里配置就完成了,建立工程

首先我們需要打開定時(shí)器和USART,放在main中,while之前,定時(shí)器初始化之后,為了方便我們之后的函數(shù)都寫在main.c里都可以,首先定時(shí)器就是以下代碼

// 為了方便我們的函數(shù)都寫在main.c里
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL); //開啟編碼器模式
	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start(&htim2);
	HAL_TIM_Base_Start_IT(&htim4);                  //開啟定時(shí)器的中斷
	HAL_TIM_Base_Start(&htim4);  
	HAL_TIM_Base_Start_IT(&htim3);
	HAL_TIM_Base_Start(&htim3);
	HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

因?yàn)槲覀冃枰肰OFA+來打印波形,要用printf命令(VOFA的特點(diǎn)就是不用協(xié)議有printf就可打印波形非常好用),所以需要在函數(shù)前include <stdio.h>就可

// An highlighted block
#include <stdio.h>

了解上面的pid的控制規(guī)律
然后就寫pid的代碼了
直接把下面的代碼無腦復(fù)制到main前面就行了

// An highlighted block
typedef struct __PID_Increment_Struct//一個(gè)定義結(jié)構(gòu)體
{
    float Kp, Ki, Kd;  //系數(shù)
    float Error_Last1; //上次誤差
    float Error_Last2; //上次誤差
    float Out_Last;    //上次輸出
} PID_Increment_Struct;
void motor1()//正//BIN()是我在main.h里define的,往下可以看到
{	
BIN1(0);
 BIN2(1);}
void motor0()//反//如果你的反了改0,1即可
{	
BIN1(1);
 BIN2(0);}
//vofa的FireWater數(shù)據(jù)協(xié)議  換行結(jié)尾  /n或/r/n  逗號(hào)分隔通道
//指定三個(gè)通道
/* USER CODE BEGIN 0 */
#define Encoder_TIM_Handle htim2
#define Motor_MAX_Duty 2000
// PID_Increment_Struct PID_Speed = {80, 5};
float Get_Speed()//計(jì)算速度
{
    int16_t zj;
    float Speed = 0;
    zj = __HAL_TIM_GetCounter(&Encoder_TIM_Handle);
    __HAL_TIM_SetCounter(&Encoder_TIM_Handle, 0);
    Speed = (float)zj / (4 * 11 * 30) * 100 * 60;//30是減速比,11是基礎(chǔ)脈沖,4是因?yàn)?分頻,可不改,最后算出速度是一分鐘多少轉(zhuǎn)
	b=Speed;//提取數(shù)值到外部變量,到時(shí)候放到while中顯示實(shí)時(shí)速度
    return Speed;
   
}
//float Get_Angle()//計(jì)算角度(只速度控制可忽略)
//{
//    int16_t zj;
//    float angle = 0;
//    zj = __HAL_TIM_GetCounter(&Encoder_TIM_Handle);
//    angle = (float)zj / (4 * 15 * 34) * 360;
//    return angle;
//}
float PID_Increment(PID_Increment_Struct *PID, float Current, float Target)//pid計(jì)算
{
    float err,                                                                                                       //誤差
        out,                                                                                                         //輸出
        proportion,                                                                                                  //比例
        differential;                                                                                                //微分
    err = (float)Target - (float)Current;    	//計(jì)算誤差
    proportion = (float)err - (float)PID->Error_Last1;                                                               //計(jì)算比例項(xiàng)
    differential = (float)err - 2 * (float)PID->Error_Last1 + (float)PID->Error_Last2;                               //計(jì)算微分項(xiàng)
    if(err<=40&&err>-40)
		out = (float)PID->Out_Last + (float)PID->Kp * proportion+(float)PID->Ki * err+ (float)PID->Kd * differential; //計(jì)算PID
	else//如果不if  else,調(diào)試的時(shí)候如果單片機(jī)只是5v上電但電機(jī)沒轉(zhuǎn),你接12v電源開電機(jī),電機(jī)速度會(huì)拉滿,這就不好了
		out = (float)PID->Out_Last + (float)PID->Kp * proportion+ (float)PID->Kd * differential; //計(jì)算PID
    PID->Error_Last2 = PID->Error_Last1;                                                                             //更新上上次誤差
    PID->Error_Last1 = err;                                                                                          //更新誤差
    PID->Out_Last = out;                                                                                             //更新上此輸出
    return out;
}
void motor(int16_t Speed)
{
    if (Speed == 0)
    {
		
        __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Motor_MAX_Duty+1 );
    }
    else if (Speed > 0)
    {
		motor0();
		
        __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Speed);
        
    }
    else if (Speed < 0)
    {
        Speed *= -1;
		motor1();
         __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,Speed);
    }
}
PID_Increment_Struct PID_Speed = {20, 0.1, 0};//這個(gè)參數(shù)是我調(diào)的,不同參數(shù)得看不同電機(jī)
//PID_Increment_Struct PID_Angle = {3.1, 0, 0.06};//角度控制的,可忽略
//float angle;
float mb_speed_last;
float aa = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    float Speed = 0;
    float set_speed = 0;
    float mb_speed;
    if (htim == &htim2)
    {
    }
    else if (htim == &htim4)//注釋的都是角度控制的,到時(shí)候可以在深入使用
    {
//        angle += Get_Angle();
//        mb_speed = (int16_t)PID_Increment(&PID_Angle, angle, aa);

//        if (PID_Angle.Error_Last1 > 360)
//            mb_speed = 300;
//        else if (PID_Angle.Error_Last1 < -360)
//            mb_speed = -300;
        Speed = Get_Speed();
		mb_speed = 120;//目標(biāo)速度
        set_speed = PID_Increment(&PID_Speed, Speed, mb_speed);
        if (set_speed > 2000)
            set_speed = 2000;
        else if (set_speed < -2000)
            set_speed = -2000;
			motor(set_speed);
		if (set_speed > 100 || set_speed < -100)//死區(qū)控制,改善電機(jī)異響
            motor(set_speed);
        a=set_speed;//提取數(shù)值到外部變量,到時(shí)候放到while中顯示實(shí)時(shí)占空比
    }
}

宏定義電機(jī)輸出變量

#define BIN1(state) HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,(GPIO_PinState)(state))    //IN1
#define BIN2(state) HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,(GPIO_PinState)(state))    //IN2
//控制電機(jī)正反的輸出

接下來在while里加入printf命令

printf("%2f\n",b);//顯示實(shí)時(shí)速度,vofa的FireWater數(shù)據(jù)協(xié)議  記得要換行結(jié)尾  \n,不然打印不出來,逗號(hào)分隔通道

下載編譯燒錄就可完成了

vofa+調(diào)試顯示波形調(diào)參

需要下載vofa可從官網(wǎng)下鏈接: link
打開vofa,按圖選擇FireWater,F(xiàn)ireWater是用來顯示波形的協(xié)議,更多可參考官網(wǎng)的使用說明鏈接: link
hal編碼器,stm32,單片機(jī),嵌入式硬件

選擇控件,將波形顯示器加入到主屏幕上,長(zhǎng)按拖動(dòng)即可
hal編碼器,stm32,單片機(jī),嵌入式硬件

x軸默認(rèn)為t軸,y軸選擇io,即變量,單片機(jī)接上usb to ttl 轉(zhuǎn)換器,再接上位機(jī),識(shí)別到串口,打開串口,給電機(jī)上電即可顯示出波形,愉快的調(diào)參。
hal編碼器,stm32,單片機(jī),嵌入式硬件
我最后的結(jié)果是這樣的
hal編碼器,stm32,單片機(jī),嵌入式硬件
hal編碼器,stm32,單片機(jī),嵌入式硬件文章來源地址http://www.zghlxwxcb.cn/news/detail-546722.html

到了這里,關(guān)于stm32(HAL)庫(kù)編碼器電機(jī)pid代碼及利用VOFA+對(duì)Pid波形顯示調(diào)參的文章就介紹完了。如果您還想了解更多內(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)文章

  • stm32霍爾編碼器電機(jī)測(cè)速原理

    ????????本次選用的編碼器電機(jī)為13線的霍爾編碼器電機(jī),電機(jī)減速比為30:1,轉(zhuǎn)動(dòng)一圈輸出13*30=390個(gè)脈沖。輪胎直徑為75mm,輪胎周長(zhǎng)為pi*d=3*75=225mm.定時(shí)器采用四倍頻計(jì)數(shù),則一圈輸出390*4=1560個(gè)脈沖。具體編碼器知識(shí)這里就不多說了。 ?????????根據(jù)測(cè)速原理:假設(shè)編

    2024年02月15日
    瀏覽(33)
  • STM32F407 電機(jī)編碼器測(cè)量

    STM32F407 電機(jī)編碼器測(cè)量

    STM32的定時(shí)器功能非常強(qiáng)大,根據(jù)官方手冊(cè),定時(shí)器的功能如下 高級(jí)定時(shí)器 TIM1 和 TIM8 主要特性 TIM1 和 TIM8 定時(shí)器具有以下特性: ● 16 位遞增、遞減、遞增/遞減自動(dòng)重載計(jì)數(shù)器。 ● 16 位可編程預(yù)分頻器,用于對(duì)計(jì)數(shù)器時(shí)鐘頻率進(jìn)行分頻(即運(yùn)行時(shí)修改),分頻系數(shù) 介于

    2023年04月08日
    瀏覽(65)
  • STM32之增量式編碼器電機(jī)測(cè)速

    STM32之增量式編碼器電機(jī)測(cè)速

    編碼器,是一種用來測(cè)量機(jī)械旋轉(zhuǎn)或位移的傳感器。它能夠測(cè)量機(jī)械部件在旋轉(zhuǎn)或直線運(yùn)動(dòng)時(shí)的位移位置或速度等信息,并將其轉(zhuǎn)換成一系列電信號(hào)。 . 按監(jiān)測(cè)原理分類 光電編碼器 光電編碼器,是一種通過光電轉(zhuǎn)換將輸出軸上的機(jī)械幾何位移量轉(zhuǎn)換成脈沖或數(shù)字量的傳感器

    2024年02月13日
    瀏覽(23)
  • SimpleFOC移植STM32(九)—— ABZ編碼器電機(jī)

    SimpleFOC移植STM32(九)—— ABZ編碼器電機(jī)

    ? SimpleFOC、ODrive和VESC 教程鏈接匯總:請(qǐng)點(diǎn)擊 ? ? 在SimpleFOC代碼中,ABZ信號(hào)和霍爾電機(jī)信號(hào)處理方式很像,都是信號(hào)邊沿觸發(fā)中斷,在中斷中獲取狀態(tài)計(jì)算角度。 本次移植驅(qū)動(dòng)板103和官方代碼保持一致。 驅(qū)動(dòng)板405采用的是定時(shí)器計(jì)數(shù)脈沖,處理方式不同。 ? ABZ或者ABI,叫

    2023年04月11日
    瀏覽(26)
  • STM32 HAL庫(kù) AS5600編碼器程序

    STM32 HAL庫(kù) AS5600編碼器程序

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 STM32 HAL庫(kù) AS5600編碼器程序 提示:這里可以添加本文要記錄的大概內(nèi)容: AS5600磁性旋轉(zhuǎn)位置編碼器是一款可編程、12位高分辨率、非接觸式的設(shè)備,具有卓越的可靠性和耐久性。這個(gè)旋轉(zhuǎn)位置傳感器提供

    2024年02月20日
    瀏覽(33)
  • stm32 HAL庫(kù) 4096線ABZ編碼器

    stm32 HAL庫(kù) 4096線ABZ編碼器

    @[TOC]目錄 買的是這個(gè) AB相代表計(jì)數(shù)方向,Z代表過零點(diǎn) 也可以選上DMA 中斷 找一個(gè)空閑管腳 打開對(duì)應(yīng)中斷 用DMA 過機(jī)械零點(diǎn)就+/-360

    2024年04月17日
    瀏覽(25)
  • Stm32-使用TB6612驅(qū)動(dòng)電機(jī)及編碼器測(cè)速

    Stm32-使用TB6612驅(qū)動(dòng)電機(jī)及編碼器測(cè)速

    最近在 學(xué)習(xí)編碼電機(jī)以及嘗試使用編碼電機(jī)測(cè)速 。遇到了很多問題,花費(fèi)了很多時(shí)間,在這里做一個(gè)記錄,對(duì)自己學(xué)習(xí)到的知識(shí)進(jìn)行一個(gè)總結(jié) 找了很多資料,看了很多視頻,這些太多了,以至于讓我不知道究竟哪一個(gè)是正確的,今天看這個(gè),明天看這個(gè),導(dǎo)致自己的學(xué)習(xí)效

    2023年04月16日
    瀏覽(30)
  • 【STM32】【HAL庫(kù)】定時(shí)器編碼器模式測(cè)速

    【STM32】【HAL庫(kù)】定時(shí)器編碼器模式測(cè)速

    目錄 概述 HAL設(shè)置 ?定時(shí)器的編碼器模式 定時(shí)器設(shè)置 ?常用函數(shù) 代碼 電機(jī)AB相增量型編碼器的介紹和解碼方法在這里介紹過了 電機(jī)編碼器 https://blog.csdn.net/m0_57585228/article/details/125791283 測(cè)速可以使用外部中斷進(jìn)行脈沖計(jì)數(shù) 很多型號(hào)的單片機(jī)中有專門的電路來計(jì)算脈沖的速度和

    2023年04月18日
    瀏覽(36)
  • 【STM32】HAL庫(kù)自學(xué)記錄-旋轉(zhuǎn)編碼器的使用

    【STM32】HAL庫(kù)自學(xué)記錄-旋轉(zhuǎn)編碼器的使用

    通過本文可學(xué)會(huì)兩種實(shí)現(xiàn)判斷旋轉(zhuǎn)編碼器正轉(zhuǎn)反轉(zhuǎn)的方法,可根據(jù)自己的應(yīng)用場(chǎng)景來選擇使用哪種方法。 1、芯片:STM32F103RCT6 2、STM32CubeMx軟件 3、IDE: MDK-Keil軟件 4、旋轉(zhuǎn)編碼器模塊 5、XCOM V1.4串口軟件 圖中C端為GND。 方向 :A相和B相相差一個(gè)相位,一般來說是90°。A相信號(hào)在

    2024年02月11日
    瀏覽(27)
  • STM32自學(xué)筆記16-步進(jìn)電機(jī)驅(qū)動(dòng)項(xiàng)目-磁編碼器的校準(zhǔn)

    上節(jié)我把MT6816的驅(qū)動(dòng)給大致整明白了,接下去需要看看如何 校準(zhǔn) 。 為什么編碼器需要校準(zhǔn)? 如上節(jié)所說,MT6816是一款 絕對(duì)值編碼器 ,它為每個(gè)測(cè)量位置分配了唯一的二進(jìn)制代碼或字, 即使斷電,也可以跟蹤編碼器的確切位置 。 但是由于硬件或其他因素的影響,編碼器輸

    2024年02月16日
    瀏覽(173)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包