欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在FPGA上快速構(gòu)建PID算法

jf_78858299 ? 來源:OpenFPGA ? 作者:碎碎思 ? 2023-05-11 15:36 ? 次閱讀

作為一名工程師,在項目實施階段多多少少會遇到需要使用控制理論的應(yīng)用程序。

一種非常常用的算法是比例積分微分控制器(proportional-integral-derivative control)或 PID 控制器。PID 算法用于控制各種應(yīng)用中溫度、壓力、電機(jī)位置和流量等變量。我經(jīng)常看到的一個地方是高端圖像處理系統(tǒng)(制冷型紅外),為了減少圖像中的噪點。它使用熱電冷卻器或其他冷卻系統(tǒng)來冷卻圖像傳感器。對于高端成像,較低的噪聲可以帶來更好的圖像。

介紹

PID 控制算法實現(xiàn)起來并不難,因為它只需要加法、乘法、除法和減法(dog)。但是,一旦算法實施,確保 PID 回路穩(wěn)定的三個系數(shù)可能需要一點額外的時間來獲取。

PID 主要使用三個術(shù)語。

  • 比例(Proportional) -測量期望值和測量值之間的差異。比例值是當(dāng)前位置的量度。
  • 積分(Integral) -會隨著時間的推移對誤差進(jìn)行積分。積分項是誤差的歷史累積值。隨著誤差的消除,積分項停止增長。
  • 導(dǎo)數(shù)(Derivative) -計算變化率并預(yù)測誤差的未來趨勢。

每個術(shù)語還具有相關(guān)的增益 KI、KP 或 KD,可以幫助我們調(diào)整 PID 控制器算法的行為。D 項不是必須的,而且簡單的情況下我們基本不使用,使用 PI 控制器也很常見。

PID經(jīng)常使用浮點數(shù)來實現(xiàn)。因此,我們可以使用諸如 VHDL Fixed/Float 之類的庫在 RTL 中實現(xiàn)?;蛘?,我們可以使用HLS來實現(xiàn) PID,因為國內(nèi)應(yīng)用VHDL較少,所以我們今天的實例是使用HLS構(gòu)建我們的PID算法。使用HLS能夠使用浮點或任意精度的定點數(shù)。HLS還能通過#pragma 快速的為IP添加通用控制接口(AXI)。

在純 FPGA 實現(xiàn)類似系統(tǒng)時候,我們需要添加軟核來控制IP。在較小的 Zynq-7000 SoC FPGA(7007、7010、7020 等)中則可以通過硬核控制IP?;蛘撸绻覀冊O(shè)計中不想使用處理器,那我們可以設(shè)計傳統(tǒng)的矢量接口即可。

源碼設(shè)計

PID 的實際源代碼非常簡單,如下所示。

#include "pid.h"

static data_type error_prev =0;
static data_type i_prev=0;

data_type PID (data_type set_point, data_type KP, data_type KI, data_type KD, data_type sample, data_type ts, data_type pmax)
{
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=s_axilite port=sample
#pragma HLS INTERFACE mode=s_axilite port=KD
#pragma HLS INTERFACE mode=s_axilite port=KI
#pragma HLS INTERFACE mode=s_axilite port=KP
#pragma HLS INTERFACE mode=s_axilite port=set_point
#pragma HLS INTERFACE mode=s_axilite port=ts
#pragma HLS INTERFACE mode=s_axilite port=pmax
 data_type error, i, d, p;
 data_type temp;
 data_type op;

 error = set_point - sample;

 p = error * KP;
 i = i_prev + (error  * ts * KI);
 d = KD * ((error - error_prev) / ts);

 op = p+i+d;
 error_prev = error;
 if (op > pmax)  {
  i_prev = i_prev;
  op = pmax;
 }else{
  i_prev = i;
 }
 return op;
}

已將previous error和previous integral聲明為全局靜態(tài)變量,以確保它們在迭代時候其值保持不變。

在算法方面,用戶可以在應(yīng)用程序運行時動態(tài)加載 KP、KI、KID、Ts 和 Pmax。我們可以輕松地添加積分值或使用附加寄存器重新啟動控制器。這將使 PID 可以用于多個實現(xiàn)。

為了測試和配置 PID,測試文件羅列了一系列溫度值,這些溫度都遠(yuǎn)高于預(yù)期的目標(biāo)設(shè)定點,并確保達(dá)到設(shè)定點。此示例中的 PID 設(shè)計用于提供功率(以瓦特為單位)維持光學(xué)床的溫度。在這種情況下,我們需要加熱而不是降低溫度。

#include "pid.h"
#include 
#define iterations 40
int main(void)
{

data_type set_point = -80.0;
data_type sample[iterations] = {-90.000,-88.988,-87.977,-86.966,-85.955,-84.946,-83.936,-82.928,-81.920,-80.912,-80.283,-79.926,-79.784,-79.774,-79.829,-79.898,-79.955,-79.993,-80.011,-80.017,-80.016,-80.010,-80.005,-80.002,-80.000,-79.999,-79.999,-79.999,-79.999,-80.000,-80.000,-80.000,-80.000,-80.000,-80.000,-80.000,-79.999,-80.000,-80.001,-80.000};

data_type kp = 19.6827; // w/k
data_type ki = 0.7420; // w/k/s
data_type kd = 0.0;
data_type op;

printf("testing cpp\\r\\n");

for (int i =0; i

在 Vitis HLS 中針對該 PID 算法進(jìn)行C 仿真和協(xié)同仿真,結(jié)果完全符合預(yù)期。

圖片

算法按照預(yù)期運行,下一步是綜合和導(dǎo)出 IP,最后就是添加到我們的 Vivado 項目中。這次我們使用的是ZYNQ FPGA。

圖片

延遲性能和資源消耗下面的完整框圖反映了添加到Vivado項目中情況。

圖片

框圖圖片

總設(shè)計資源圖片

PID 資源構(gòu)建完成上面的Vivado項目,接下來就是導(dǎo)出硬件(XSA)到 Vitis 中開發(fā)驅(qū)動。

在 Vitis 中開發(fā)驅(qū)動時候,我重用了 HLS 仿真文件中的幾個元素。

由于我們使用的是 AXI 接口,Vitis HLS 在導(dǎo)出IP時候地為我們提供了一個可以在 Vitis 中用于驅(qū)動 IP 核的驅(qū)動程序。但是,當(dāng)在 IP 內(nèi)核中使用浮點輸入時,驅(qū)動程序則期望它們?yōu)?U32。如果我們在開發(fā)驅(qū)動時候從浮點數(shù)轉(zhuǎn)換為 U32,我們將失去準(zhǔn)確性。因此,解決這個問題的方法是使用指針(pointers)和強(qiáng)制轉(zhuǎn)換。

圖片

本質(zhì)上,我們將變量聲明為浮點數(shù),然后在函數(shù)中調(diào)用設(shè)置一個指向浮點變量地址的 U32 指針,并使用間接運算符讀取該值。

XPid_Set_set_point ( & pid ,  * ( ( u32 * ) & set_point ) ) ;

整個應(yīng)用程序是

#include 
#include "platform.h"
#include "xil_printf.h"
#include "xpid.h"
#define iterations 40

typedef float data_type;
data_type set_point = -80.0;
data_type sample[iterations] = {-90.000,-88.988,-87.977,-86.966,-85.955,-84.946,-83.936,-82.928,-81.920,-80.912,-80.283,-79.926,-79.784,-79.774,-79.829,-79.898,-79.955,-79.993,-80.011,-80.017,-80.016,-80.010,-80.005,-80.002,-80.000,-79.999,-79.999,-79.999,-79.999,-80.000,-80.000,-80.000,-80.000,-80.000,-80.000,-80.000,-79.999,-80.000,-80.001,-80.000};

data_type kp = 19.6827; // w/k
data_type ki = 0.7420; // w/k/s
data_type kd = 0.0;
data_type ts = 12.5;
data_type pmax = 40;
u32 op;

XPid pid;

int main()
{
    float result;
    init_platform();
    disable_caches();
    print("Adiuvo PID Example\\n\\r");
    XPid_Initialize(&pid,XPAR_XPID_0_DEVICE_ID);
    XPid_Set_set_point(&pid, *((u32*)&set_point ));
    XPid_Set_KP(&pid,  *((u32*)&kp));
    XPid_Set_KI(&pid,  *((u32*)&ki));
    XPid_Set_KD(&pid,  *((u32*)&kd));
    XPid_Set_ts(&pid,  *((u32*)&ts));
    XPid_Set_pmax(&pid,  *((u32*)&pmax));
    u32 tst = XPid_Get_set_point(&pid);
    for (int i =0; i

運行,得到以下結(jié)果。

圖片

正如預(yù)期的那樣,硬件中的實現(xiàn)與軟件的工作方式相同。

當(dāng)然,對于不同的應(yīng)用程序,我們需要重新確定可用于應(yīng)用程序的 KP、KI 和 KD 變量。

這樣做的真正美妙之處在于,因為它是用 C 實現(xiàn)的,可維護(hù)性高,可以快速構(gòu)建一個我們需要的PID算法。

完整項目在下面鏈接里。

參考

https://www.cnki.com.cn/Article/CJFDTOTAL-CAIZ201316188.htm

https://www.adiuvoengineering.com/

總結(jié)

雖然上面的流程很簡單,但是HLS在調(diào)整資源和速度方面還是需要一些時間,并且浪費的資源還是比純HDL多。

最后在說一下該方式的缺點,PID需要進(jìn)行浮點運算,而FPGA則不能進(jìn)行浮點運算,如果想把上面的算法在邏輯中運行,則需要自己進(jìn)行量化,但是如果像上面例程的方式在內(nèi)核(硬核)中運行算法,則該方式簡單且優(yōu)雅~

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16468

    瀏覽量

    179649
  • 噪聲
    +關(guān)注

    關(guān)注

    13

    文章

    1126

    瀏覽量

    47525
  • PID
    PID
    +關(guān)注

    關(guān)注

    35

    文章

    1473

    瀏覽量

    85886
  • 圖像處理器
    +關(guān)注

    關(guān)注

    1

    文章

    104

    瀏覽量

    15575
收藏 人收藏

    評論

    相關(guān)推薦

    基于FPGA的模糊PID控制算法的研究及實現(xiàn)

    基于FPGA的模糊PID控制算法的研究及實現(xiàn)
    發(fā)表于 03-18 14:25

    FPGA中實現(xiàn)PID算法

    本帖最后由 發(fā)燒友LV 于 2014-12-29 20:13 編輯 在FPGA中實現(xiàn)PID算法,面臨著小數(shù)的計算,請問大家一般是怎么處理的?
    發(fā)表于 12-03 21:59

    何在嵌入式系統(tǒng)或快速原型構(gòu)建實現(xiàn)即交即用式部署?

    何在嵌入式系統(tǒng)或快速原型構(gòu)建實現(xiàn)即交即用式部署?
    發(fā)表于 11-22 07:25

    FPGA開發(fā)板快速構(gòu)建一種PID算法

    的實例是使用HLS構(gòu)建我們的PID算法。使用HLS能夠使用浮點或任意精度的定點數(shù)。HLS還能通過#pragma 快速的為IP添加通用控制接口(AXI)。在純
    發(fā)表于 10-31 15:53

    基于FPGA的DSP算法快速驗證

    本內(nèi)容提供了基于FPGA的DSP算法快速驗證,希望對大家學(xué)習(xí)有所幫助
    發(fā)表于 06-15 18:08 ?86次下載
    基于<b class='flag-5'>FPGA</b>的DSP<b class='flag-5'>算法</b><b class='flag-5'>快速</b>驗證

    pid算法_什么是pid算法

    PID控制器是一種最優(yōu)控制。本文講述了增量式PID算法原理與數(shù)字PID算法原理與數(shù)字PID
    發(fā)表于 01-01 11:58 ?1.1w次閱讀
    <b class='flag-5'>pid</b><b class='flag-5'>算法</b>_什么是<b class='flag-5'>pid</b><b class='flag-5'>算法</b>

    基于FPGA的模糊PID控制算法的研究及實現(xiàn)

    基于FPGA的模糊PID控制算法的研究及實現(xiàn)-2009。
    發(fā)表于 04-05 10:39 ?21次下載

    快速浮_定點PID控制器FPGA的研究與實現(xiàn)

    快速浮_定點PID控制器FPGA的研究與實現(xiàn)
    發(fā)表于 05-11 11:30 ?20次下載

    改進(jìn)PID算法在智能車控制的應(yīng)用

    改進(jìn)PID算法在智能車控制的應(yīng)用
    發(fā)表于 11-18 17:19 ?1次下載

    基于FPGA的ECC快速算法研究及設(shè)計

    基于FPGA的ECC快速算法研究及設(shè)計_陳俊杰
    發(fā)表于 01-07 19:08 ?2次下載

    基于模糊自適應(yīng)PID算法快速充電系統(tǒng)設(shè)計_孫莉莉

    基于模糊自適應(yīng)PID算法快速充電系統(tǒng)設(shè)計_孫莉莉
    發(fā)表于 01-13 21:36 ?1次下載

    商湯聯(lián)合提出基于FPGA的Winograd算法:改善FPGA的CNN性能 降低算法復(fù)雜度

    商湯科技算法平臺團(tuán)隊和北京大學(xué)高能效實驗室聯(lián)合提出一種基于 FPGA快速Winograd算法,可以大幅降低算法復(fù)雜度,改善
    的頭像 發(fā)表于 02-07 11:52 ?9338次閱讀
    商湯聯(lián)合提出基于<b class='flag-5'>FPGA</b>的Winograd<b class='flag-5'>算法</b>:改善<b class='flag-5'>FPGA</b><b class='flag-5'>上</b>的CNN性能 降低<b class='flag-5'>算法</b>復(fù)雜度

    何在MATLAB中開發(fā)基于像素的視頻和圖像處理算法

    此講座將結(jié)合新產(chǎn)品的特性,重點介紹如何在MATLAB?中開發(fā)基于像素流的視頻和圖像處理的算法,并通過HDL代碼產(chǎn)生的技術(shù)快速FPGA實現(xiàn)
    的頭像 發(fā)表于 08-29 06:08 ?2920次閱讀
    如<b class='flag-5'>何在</b>MATLAB中開發(fā)基于像素的視頻和圖像處理<b class='flag-5'>算法</b>

    FPGA實現(xiàn)PID控制算法

    相信大家對于PID控制算法,都不感到陌生了,平衡車就是靠它平衡起來的,還有飛控的平衡算法也是它,以及FOC中的閉環(huán)控制中也是用的它,它不僅簡單,而且易于理解。那么本篇文章將簡要介紹一下算法
    的頭像 發(fā)表于 05-19 16:40 ?1802次閱讀
    <b class='flag-5'>FPGA</b>實現(xiàn)<b class='flag-5'>PID</b>控制<b class='flag-5'>算法</b>

    怎么用FPGA算法何在FPGA實現(xiàn)最大公約數(shù)算法

    FPGA算法是指在FPGA(現(xiàn)場可編程門陣列)實現(xiàn)的算法。FPGA是一種可重構(gòu)的硬件設(shè)備,可以
    的頭像 發(fā)表于 08-16 14:31 ?3008次閱讀
    怎么用<b class='flag-5'>FPGA</b>做<b class='flag-5'>算法</b> 如<b class='flag-5'>何在</b><b class='flag-5'>FPGA</b><b class='flag-5'>上</b>實現(xiàn)最大公約數(shù)<b class='flag-5'>算法</b>