找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3101|回復(fù): 0
收起左側(cè)

基于stm32mini版的PID液位控制器設(shè)計(jì) 附源程序

[復(fù)制鏈接]
ID:649697 發(fā)表于 2021-7-5 18:33 | 顯示全部樓層 |閱讀模式
這是學(xué)完微型計(jì)算機(jī)控制要求制作的一個(gè)實(shí)驗(yàn),由幾個(gè)供學(xué)習(xí)用的STM32例程拼接而成,能實(shí)現(xiàn)簡(jiǎn)單的液位控制,不足的地方很多,參數(shù)也還要根據(jù)自身情況調(diào)整,第一次發(fā)帖,大佬看到多指教。
首先簡(jiǎn)單介紹一下用到的硬件:
液位傳感器:

液位傳感器

液位傳感器


  • 工作電壓:2.0V-5.0V
  • 輸出類型        :模擬量輸出
  • 檢測(cè)深度:48mm
  • 產(chǎn)品尺寸:19.0mm*63.0mm
  • 固定孔尺寸:2.0mm
  • 原理:該模塊主要是利用三極管的電流放大原理,當(dāng)液位高度使三極管的基極與電源正極導(dǎo)通的時(shí)候,在三極管的基極和發(fā)射極之間就會(huì)產(chǎn)生一定大小的電流,此時(shí)在三極管的集電極和發(fā)射極之間就會(huì)產(chǎn)生一個(gè)一定放大倍數(shù)的電流,該電流經(jīng)過發(fā)射極的電阻產(chǎn)生電壓供AD轉(zhuǎn)換器采集。 原理:該模塊主要是利用三極管的電流放大原理,當(dāng)液位高度使三極管的基極與電源正極導(dǎo)通的時(shí)候,在三極管的基極和發(fā)射極之間就會(huì)產(chǎn)生一定大小的電流,此時(shí)在三極管的集電極和發(fā)射極之間就會(huì)產(chǎn)生一個(gè)一定放大倍數(shù)的電流,該電流經(jīng)過發(fā)射極的電阻產(chǎn)生電壓供AD轉(zhuǎn)換器采集。

[backcolor=rgb(54, 165, 232) !important]接口說明
引腳號(hào)標(biāo)識(shí)描述
1AOUT模擬量輸出
2GND電源地
3VCC電源正(3.3V-5.0V)


I2%YR68A2`BCY_O8MU7@@GS.png
資料官網(wǎng):www點(diǎn)waveshare點(diǎn)net/wiki/Liquid_Level_Sensor

官網(wǎng)自帶的傳感器插入水深和輸出電壓的關(guān)系本人并沒有驗(yàn)證過,輸出的電壓和采樣值的轉(zhuǎn)換關(guān)系是可以自己寫的,這里做了簡(jiǎn)單的深度和采樣值轉(zhuǎn)換,不過后面感覺作用不大,實(shí)驗(yàn)只要求能控制在不同水位即可,即改變一下采樣值。想要準(zhǔn)確的控制在某一個(gè)高度,確定一下該高度和采樣值的對(duì)應(yīng)關(guān)系就行!

大致如下:
float trans(float a)
{
        float b=a,c=0;
        if(b<=0.5)
                c=b*(1450.0/0.5);
        if(b>0.5&&b<=1)
                c=(b-0.5)*((1700.0-1450)/0.5)+1450.0;
        if(b>1&&b<=1.5)
                c=(b-1.0)*((2000.0-1700)/0.5)+1700.0;
        if(b>1.5&&b<=2.0)
                c=(b-1.5)*((2150.0-2000.0)/0.5)+2000.0;
        if(b>2.0&&b<=2.5)
                c=(b-2.0)*((2240.0-2150.0)/2.5)+2150.0;
        if(b>2.5&&b<=3.0)
                c=(b-2.5)*((2310.0-2240.0)/3.0)+2240.0;
        if(b>3.0&&b<=3.5)
                c=(b-3.0)*((2360.0-2310)/0.5)+2310;
        if(b>3.5&&b<=4.0)
                c=(b-3.5)*((2420.0-2360.0)/0.5)+2360.0;
        if(b>4.0&&b<=5)
                c=(b-4.0)*((2500.0-2420.0)/1.0)+2420.0;
        
        LCD_ShowxNum(156,150,b*10,4,16,0);//顯示一下目標(biāo)深度,單位毫米
        
        return c;
        
}
本來想輸入深度然后到達(dá)目標(biāo)深度的,但是發(fā)現(xiàn)采樣波動(dòng)大,效果不是很好,這就是一個(gè)簡(jiǎn)單的分段線性轉(zhuǎn)換,測(cè)的分段越多越準(zhǔn)


傳感器官網(wǎng)中有教學(xué),利用正點(diǎn)原子的ADC實(shí)驗(yàn)例程也能夠查看采樣值和轉(zhuǎn)換電壓值,這為了方便直接移植,沒有改變它的采樣端口,用的還是PA1作為模擬輸入端口,電源接STM32的3V電源,

驅(qū)動(dòng)模塊是L298N,簡(jiǎn)單的資料如下,知道基本的驅(qū)動(dòng)方法就能用,想知道更詳細(xì)的網(wǎng)上資料很容易找給多一張?jiān)韴D:
C[I@F[G]@MST[[%UG78)RL0.png
實(shí)物如下:

管腳作用圖

管腳作用圖
模塊參數(shù)

1.驅(qū)動(dòng)芯片:L298N雙H橋直流電機(jī)驅(qū)動(dòng)芯片

2.驅(qū)動(dòng)部分端子供電范圍Vs:+5V~+35V ; 如需要板內(nèi)取電,則供電范圍Vs:+7V~+35V

3.驅(qū)動(dòng)部分峰值電流Io:2A

4.邏輯部分端子供電范圍Vss:+5V~+7V(可板內(nèi)取電+5V)

5.邏輯部分工作電流范圍:0~36mA

6.控制信號(hào)輸入電壓范圍:
   低電平:-0.3V≤Vin≤1.5V
   高電平:2.3V≤Vin≤Vss
7.使能信號(hào)輸入電壓范圍:

   低電平:-0.3≤Vin≤1.5V(控制信號(hào)無效)
   高電平:2.3V≤Vin≤Vss(控制信號(hào)有效)
8.最大功耗:20W(溫度T=75℃時(shí))

輸入邏輯圖如下:
OINAQY$N_DRF%G~Z$KTPFVR.png

抽水泵用到的是輸出A,由使能端口A控制,其正反轉(zhuǎn)由旁邊的兩個(gè)輸出的IN1和IN2電平高低決定,具體關(guān)系看表,要用到輸出B的話,原理類似

驅(qū)動(dòng)電源用的是STM32模塊上的5V電源,一開始接的5V供電接口,但是電機(jī)最高速度有點(diǎn)慢,后面接到了12供電接口,馬上就猛起來了,真是讓人摸不著頭腦
使能端口即PWM輸出控制速度由pin8控制,電機(jī)的啟動(dòng)則由pin11和pin12控制,想換的改一改就行

說一說這個(gè)PID的吧,經(jīng)常用到的控制方法之一,大部分代碼都是用現(xiàn)成的,所以整個(gè)實(shí)驗(yàn)做下來要寫的也就一個(gè)PID和梯度線性轉(zhuǎn)換
PID控制又稱偏差控制,當(dāng)實(shí)際值與目標(biāo)值有差異時(shí),偏差控制就起作用,這里是使用增量型PID算法,由位置型推導(dǎo)而出
PID的分別基本含義找到一個(gè)比較好的解釋:

P - 比例部分

比例環(huán)節(jié)的作用是對(duì)偏差瞬間作出反應(yīng)。偏差一旦產(chǎn)生控制器立即產(chǎn)生控制作用, 使控制量向減少偏差的方向變化。 控制作用的強(qiáng)弱取決于比例系數(shù)Kp, 比例系數(shù)Kp越大,控制作用越強(qiáng), 則過渡過程越快, 控制過程的靜態(tài)偏差也就越小; 但是Kp越大,也越容易產(chǎn)生振蕩, 破壞系統(tǒng)的穩(wěn)定性。 故而, 比例系數(shù)Kp選擇必須恰當(dāng), 才能過渡時(shí)間少, 靜差小而又穩(wěn)定的效果。

I  - 積分部分

從積分部分的數(shù)學(xué)表達(dá)式可以知道, 只要存在偏差, 則它的控制作用就不斷的增加; 只有在偏差e(t)=0時(shí), 它的積分才能是一個(gè)常數(shù),控制作用才是一個(gè)不會(huì)增加的常數(shù)。 可見,積分部分可以消除系統(tǒng)的偏差。

積分環(huán)節(jié)的調(diào)節(jié)作用雖然會(huì)消除靜態(tài)誤差,但也會(huì)降低系統(tǒng)的響應(yīng)速度,增加系統(tǒng)的超調(diào)量。積分常數(shù)Ti越大,積分的積累作用越弱,這時(shí)系統(tǒng)在過渡時(shí)不會(huì)產(chǎn)生振蕩; 但是增大積分常數(shù)Ti會(huì)減慢靜態(tài)誤差的消除過程,消除偏差所需的時(shí)間也較長(zhǎng), 但可以減少超調(diào)量,提高系統(tǒng)的穩(wěn)定性。

當(dāng) Ti 較小時(shí), 則積分的作用較強(qiáng),這時(shí)系統(tǒng)過渡時(shí)間中有可能產(chǎn)生振蕩,不過消除偏差所需的時(shí)間較短。所以必須根據(jù)實(shí)際控制的具體要求來確定Ti

D - 微分部分

實(shí)際的控制系統(tǒng)除了希望消除靜態(tài)誤差外,還要求加快調(diào)節(jié)過程。在偏差出現(xiàn)的瞬間,或在偏差變化的瞬間, 不但要對(duì)偏差量做出立即響應(yīng)(比例環(huán)節(jié)的作用), 而且要根據(jù)偏差的變化趨勢(shì)預(yù)先給出適當(dāng)?shù)募m正。為了實(shí)現(xiàn)這一作用,可在 PI 控制器的基礎(chǔ)上加入微分環(huán)節(jié),形成 PID 控制器。

微分環(huán)節(jié)的作用使阻止偏差的變化。它是根據(jù)偏差的變化趨勢(shì)(變化速度)進(jìn)行控制。偏差變化的越快,微分控制器的輸出就越大,并能在偏差值變大之前進(jìn)行修正。微分作用的引入, 將有助于減小超調(diào)量, 克服振蕩, 使系統(tǒng)趨于穩(wěn)定, 特別對(duì)髙階系統(tǒng)非常有利, 它加快了系統(tǒng)的跟蹤速度。但微分的作用對(duì)輸入信號(hào)的噪聲很敏感,對(duì)那些噪聲較大的系統(tǒng)一般不用微分, 或在微分起作用之前先對(duì)輸入信號(hào)進(jìn)行濾波。


這里利用  目標(biāo)值-采樣值  得出一個(gè)反作用誤差
增量利用這個(gè)誤差進(jìn)行計(jì)算
                                           增量型.png
把增量疊加到速度控制的PWM輸出值上

代碼如下:
   void PIDcontrol(float a)
{
        float p=13;  
  float i=2;   
  float d=1;
  float adduk=0;
        float expvalue=trans(a);    //設(shè)置水深和采樣值的轉(zhuǎn)化

        e=expvalue-Adcvalue;      //偏差計(jì)算
        adduk=p*(e-e1)+i*e+d*(e-2*e1+e2);   //增量計(jì)算
        e2=e1;                            //刷新一下
        e1=e;

        vt+=adduk;                   //更新轉(zhuǎn)速
        if(vt>900) vt=900;         //防止越出
        if(vt<0)   vt=0;


        TIM_SetCompare1(TIM1,900-vt);

        LCD_ShowxNum(156,70,Adcvalue,4,16,0);//顯示采樣值
        LCD_ShowxNum(156,90,expvalue,4,16,0);//顯示目標(biāo)值

        LCD_ShowxNum(156,170,vt,4,16,0);//顯示轉(zhuǎn)速情況

        LCD_ShowxNum(156,190,e,4,16,0);//誤差顯示


}
在PWM輸出中,分頻是7200,但是經(jīng)過測(cè)試到了3千多電機(jī)就停止轉(zhuǎn)動(dòng)了(pwm設(shè)置原因,數(shù)值越高越慢,這就是為什么要900-vt控制轉(zhuǎn)速 ),之所以設(shè)置最低900,是因?yàn)殡姍C(jī)停止轉(zhuǎn)動(dòng)后出水太快液位降得太快導(dǎo)致液面波動(dòng)劇烈,調(diào)這個(gè)數(shù)值可以令最低速時(shí)液面下降慢點(diǎn),視具體情況而定,
歸根結(jié)底算法細(xì)節(jié)沒處理好,比較粗糙,可以考慮PID放進(jìn)定時(shí)器中、增加按鍵控制目標(biāo)數(shù)值等,反復(fù)下載麻煩



這是開始時(shí)的一張圖片,目標(biāo)水位是沒過傳感器13毫米,轉(zhuǎn)換成采樣值是1880,現(xiàn)在誤差是1880,轉(zhuǎn)速達(dá)到最快900,寫的時(shí)候?qū)嵨锊辉谑稚稀?duì)應(yīng)最后穩(wěn)定階段沒了,裝水的也沒拍,這樣另外一張的穩(wěn)定狀態(tài)
實(shí)物1.png


這個(gè)是一個(gè)達(dá)到穩(wěn)定的,10毫米對(duì)應(yīng)采樣值1700,此時(shí)ADC采樣是1720,誤差因?yàn)檠舆t沒顯示出來,但是超過目標(biāo)值電機(jī)轉(zhuǎn)速達(dá)到最慢0
實(shí)物2.png

想把手冊(cè)也上傳上來,結(jié)果超過20M,看來需要的自行下載吧
鏈接:https://pan.baidu.com/s/1O5qqnvEDdLQAIcO_-Yh3GA             提取碼:pk1x
關(guān)于STM32mini的更多資料例程等:www點(diǎn)openedv點(diǎn)com/docs/boards/stm32/zdyz_stm32f103_mini.html

寫著玩意原來還有些麻煩,和寫文檔似的= =,唉,看來自己著實(shí)沒耐心,感謝哪些寫出長(zhǎng)篇大論的大佬給我?guī)磉^的幫助,自己寫的亂糟糟的

程序可從51hei下載附件: ADC實(shí)驗(yàn).7z (229.12 KB, 下載次數(shù): 39)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表