這是學完微型計算機控制要求制作的一個實驗,由幾個供學習用的STM32例程拼接而成,能實現簡單的液位控制,不足的地方很多,參數也還要根據自身情況調整,第一次發帖,大佬看到多指教。
首先簡單介紹一下用到的硬件:
液位傳感器:
液位傳感器.png (155.32 KB, 下載次數: 66)
下載附件
液位傳感器
2021-7-5 17:32 上傳
- 工作電壓:2.0V-5.0V
- 輸出類型 :模擬量輸出
- 檢測深度:48mm
- 產品尺寸:19.0mm*63.0mm
- 固定孔尺寸:2.0mm
- 原理:該模塊主要是利用三極管的電流放大原理,當液位高度使三極管的基極與電源正極導通的時候,在三極管的基極和發射極之間就會產生一定大小的電流,此時在三極管的集電極和發射極之間就會產生一個一定放大倍數的電流,該電流經過發射極的電阻產生電壓供AD轉換器采集。 原理:該模塊主要是利用三極管的電流放大原理,當液位高度使三極管的基極與電源正極導通的時候,在三極管的基極和發射極之間就會產生一定大小的電流,此時在三極管的集電極和發射極之間就會產生一個一定放大倍數的電流,該電流經過發射極的電阻產生電壓供AD轉換器采集。
[backcolor=rgb(54, 165, 232) !important]接口說明引腳號 | 標識 | 描述 | 1 | AOUT | 模擬量輸出 | 2 | GND | 電源地 | 3 | VCC | 電源正(3.3V-5.0V) |
I2%YR68A2`BCY_O8MU7@@GS.png (10.77 KB, 下載次數: 64)
下載附件
2021-7-5 17:35 上傳
資料官網:www點waveshare點net/wiki/Liquid_Level_Sensor
官網自帶的傳感器插入水深和輸出電壓的關系本人并沒有驗證過,輸出的電壓和采樣值的轉換關系是可以自己寫的,這里做了簡單的深度和采樣值轉換,不過后面感覺作用不大,實驗只要求能控制在不同水位即可,即改變一下采樣值。想要準確的控制在某一個高度,確定一下該高度和采樣值的對應關系就行!
大致如下:
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);//顯示一下目標深度,單位毫米
return c;
}
本來想輸入深度然后到達目標深度的,但是發現采樣波動大,效果不是很好,這就是一個簡單的分段線性轉換,測的分段越多越準
傳感器官網中有教學,利用正點原子的ADC實驗例程也能夠查看采樣值和轉換電壓值,這為了方便直接移植,沒有改變它的采樣端口,用的還是PA1作為模擬輸入端口,電源接STM32的3V電源,
驅動模塊是L298N,簡單的資料如下,知道基本的驅動方法就能用,想知道更詳細的網上資料很容易找給多一張原理圖:
C[I@F[G]@MST[[%UG78)RL0.png (337.32 KB, 下載次數: 58)
下載附件
2021-7-5 19:03 上傳
實物如下:
L298N原理圖.png (309.54 KB, 下載次數: 64)
下載附件
管腳作用圖
2021-7-5 16:50 上傳
模塊參數
1.驅動芯片:L298N雙H橋直流電機驅動芯片
2.驅動部分端子供電范圍Vs:+5V~+35V ; 如需要板內取電,則供電范圍Vs:+7V~+35V
3.驅動部分峰值電流Io:2A
4.邏輯部分端子供電范圍Vss:+5V~+7V(可板內取電+5V)
5.邏輯部分工作電流范圍:0~36mA
6.控制信號輸入電壓范圍:
低電平:-0.3V≤Vin≤1.5V
高電平:2.3V≤Vin≤Vss 7.使能信號輸入電壓范圍:
低電平:-0.3≤Vin≤1.5V(控制信號無效)
高電平:2.3V≤Vin≤Vss(控制信號有效)
8.最大功耗:20W(溫度T=75℃時)
輸入邏輯圖如下:
OINAQY$N_DRF%G~Z$KTPFVR.png (23.74 KB, 下載次數: 50)
下載附件
2021-7-5 18:54 上傳
抽水泵用到的是輸出A,由使能端口A控制,其正反轉由旁邊的兩個輸出的IN1和IN2電平高低決定,具體關系看表,要用到輸出B的話,原理類似
驅動電源用的是STM32模塊上的5V電源,一開始接的5V供電接口,但是電機最高速度有點慢,后面接到了12供電接口,馬上就猛起來了,真是讓人摸不著頭腦 使能端口即PWM輸出控制速度由pin8控制,電機的啟動則由pin11和pin12控制,想換的改一改就行
說一說這個PID的吧,經常用到的控制方法之一,大部分代碼都是用現成的,所以整個實驗做下來要寫的也就一個PID和梯度線性轉換 PID控制又稱偏差控制,當實際值與目標值有差異時,偏差控制就起作用,這里是使用增量型PID算法,由位置型推導而出 PID的分別基本含義找到一個比較好的解釋: P - 比例部分 比例環節的作用是對偏差瞬間作出反應。偏差一旦產生控制器立即產生控制作用, 使控制量向減少偏差的方向變化。 控制作用的強弱取決于比例系數Kp, 比例系數Kp越大,控制作用越強, 則過渡過程越快, 控制過程的靜態偏差也就越小; 但是Kp越大,也越容易產生振蕩, 破壞系統的穩定性。 故而, 比例系數Kp選擇必須恰當, 才能過渡時間少, 靜差小而又穩定的效果。 I - 積分部分 從積分部分的數學表達式可以知道, 只要存在偏差, 則它的控制作用就不斷的增加; 只有在偏差e(t)=0時, 它的積分才能是一個常數,控制作用才是一個不會增加的常數。 可見,積分部分可以消除系統的偏差。 積分環節的調節作用雖然會消除靜態誤差,但也會降低系統的響應速度,增加系統的超調量。積分常數Ti越大,積分的積累作用越弱,這時系統在過渡時不會產生振蕩; 但是增大積分常數Ti會減慢靜態誤差的消除過程,消除偏差所需的時間也較長, 但可以減少超調量,提高系統的穩定性。 當 Ti 較小時, 則積分的作用較強,這時系統過渡時間中有可能產生振蕩,不過消除偏差所需的時間較短。所以必須根據實際控制的具體要求來確定Ti D - 微分部分 實際的控制系統除了希望消除靜態誤差外,還要求加快調節過程。在偏差出現的瞬間,或在偏差變化的瞬間, 不但要對偏差量做出立即響應(比例環節的作用), 而且要根據偏差的變化趨勢預先給出適當的糾正。為了實現這一作用,可在 PI 控制器的基礎上加入微分環節,形成 PID 控制器。 微分環節的作用使阻止偏差的變化。它是根據偏差的變化趨勢(變化速度)進行控制。偏差變化的越快,微分控制器的輸出就越大,并能在偏差值變大之前進行修正。微分作用的引入, 將有助于減小超調量, 克服振蕩, 使系統趨于穩定, 特別對髙階系統非常有利, 它加快了系統的跟蹤速度。但微分的作用對輸入信號的噪聲很敏感,對那些噪聲較大的系統一般不用微分, 或在微分起作用之前先對輸入信號進行濾波。
這里利用 目標值-采樣值 得出一個反作用誤差 增量利用這個誤差進行計算
增量型.png (20.08 KB, 下載次數: 66)
下載附件
2021-7-5 19:53 上傳
把增量疊加到速度控制的PWM輸出值上
代碼如下: void PIDcontrol(float a) { float p=13; float i=2; float d=1; float adduk=0; float expvalue=trans(a); //設置水深和采樣值的轉化
e=expvalue-Adcvalue; //偏差計算 adduk=p*(e-e1)+i*e+d*(e-2*e1+e2); //增量計算 e2=e1; //刷新一下 e1=e;
vt+=adduk; //更新轉速 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);//顯示目標值
LCD_ShowxNum(156,170,vt,4,16,0);//顯示轉速情況
LCD_ShowxNum(156,190,e,4,16,0);//誤差顯示
} 在PWM輸出中,分頻是7200,但是經過測試到了3千多電機就停止轉動了(pwm設置原因,數值越高越慢,這就是為什么要900-vt控制轉速 ),之所以設置最低900,是因為電機停止轉動后出水太快液位降得太快導致液面波動劇烈,調這個數值可以令最低速時液面下降慢點,視具體情況而定,
歸根結底算法細節沒處理好,比較粗糙,可以考慮PID放進定時器中、增加按鍵控制目標數值等,反復下載麻煩
這是開始時的一張圖片,目標水位是沒過傳感器13毫米,轉換成采樣值是1880,現在誤差是1880,轉速達到最快900,寫的時候實物不在手上。對應最后穩定階段沒了,裝水的也沒拍,這樣另外一張的穩定狀態
實物1.png (229.99 KB, 下載次數: 60)
下載附件
2021-7-5 20:15 上傳
這個是一個達到穩定的,10毫米對應采樣值1700,此時ADC采樣是1720,誤差因為延遲沒顯示出來,但是超過目標值電機轉速達到最慢0
實物2.png (266.15 KB, 下載次數: 55)
下載附件
2021-7-5 20:20 上傳
想把手冊也上傳上來,結果超過20M,看來需要的自行下載吧
鏈接:https://pan.baidu.com/s/1O5qqnvEDdLQAIcO_-Yh3GA 提取碼:pk1x
關于STM32mini的更多資料例程等:www點openedv點com/docs/boards/stm32/zdyz_stm32f103_mini.html
寫著玩意原來還有些麻煩,和寫文檔似的= =,唉,看來自己著實沒耐心,感謝哪些寫出長篇大論的大佬給我帶來過的幫助,自己寫的亂糟糟的
程序可從51hei下載附件:
ADC實驗.7z
(229.12 KB, 下載次數: 39)
2021-7-6 04:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|