這是學(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í) | 描述 | 1 | AOUT | 模擬量輸出 | 2 | GND | 電源地 | 3 | VCC | 電源正(3.3V-5.0V) |
資料官網(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:
實(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í))
輸入邏輯圖如下:
抽水泵用到的是輸出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ì)算 把增量疊加到速度控制的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)
這個(gè)是一個(gè)達(dá)到穩(wěn)定的,10毫米對(duì)應(yīng)采樣值1700,此時(shí)ADC采樣是1720,誤差因?yàn)檠舆t沒顯示出來,但是超過目標(biāo)值電機(jī)轉(zhuǎn)速達(dá)到最慢0
想把手冊(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)
2021-7-6 04:39 上傳
點(diǎn)擊文件名下載附件
|