類比訊號處理在單晶片的控制中是做為接收細節外部訊息的一種方式,相較於 GPIO ,此種方式可以做到更細微的控制。例如,當室內溫度高於攝氏30度時打開冷氣、濕氣過重時開啟除濕機等等。今天這篇文章要來教告位 mbed 如何做類比訊號的處理。
認識類比訊號
在進入正文之前,我想還是要跟大家講講類比訊號這四個字組成的名詞到底是什麼東西。
類比訊號的基本定義大概是這樣的:訊號為一連續訊號,這個訊號在任何一個時間點都存在一個代表這訊號的值。
有點太複雜了,我想這部份我們需要幾張圖解來說明。
這是最常見的連續訊號,正弦波訊號,你家中的交流電就是這種訊號,而他是可以被一個連續數學函數所表示的訊號,因此是一種連續訊號。
一般來說,自然界所見的事物都屬於類比訊號,聲音、光線、溫度、風…等等的都算是。
類比-數位轉換
為了儲存與處理類比訊號,我們需要做一種處理 – 類比數位轉換,這種處理的方式是依照人所規定的方式將類比訊號的某區段取樣成一個數位化的值。
舉例來說,當你用數位相機拍攝相片時,它會把所拍攝的影像分割成一格一格的像素,這就是將類比訊號(光線)轉化成數位的過程,也就是我們常聽到的 ADC 類比-數位轉換。
這樣做的原因是因為我們目前的技術無法將所有自然界的類比資料轉換成數位的方式儲存的關係,所以我們必須切割這些資料,才能夠處理與儲存。
開始之前
這次要準備的東西很少,大概就這樣:
- mbed LPC1768
- 任一種可變電阻 (1K以上為佳)
類比訊號讀取 – AnalogIn
在 mbed LPC1768 上有 6 個可輸入類比訊號的功能腳位,分別位在左下側編號為 p15~p20 的接腳,這就是我們今天的主角。
AnalogIn 在做的事情是把類比訊號轉換成 mbed 處理器看得懂得數位訊號,並且讓使用者可以根據這些取樣的值來做一些處理。
硬體接線
一般來說,你手上的可變電阻都可直接插於麵包板上,若無法的話,就必須在他的引腳上焊上一根接線來與麵包板或者是 mbed 相連。
以本篇範例所使用的可變電阻來說,他的接線方式是這樣:
線路接好後,我們就可以來玩實驗囉!
範例程式 – 門檻
這是一個非常簡單的程式,我們設定一個門檻值,當超過這個門檻值時,LED 便會亮起,反之則熄滅。範例程式如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include "mbed.h" AnalogIn ain(p20); DigitalOut led(LED1); int main() { while(1) { // 輸入電壓大於 0.5 * Vcc (約 1.65V) 時 LED 會亮起,反之則是滅。 if(ain > 0.5) led = 1; else led = 0; // 等 200 ms wait(0.2); } } |
mbed 輸出類比訊號的方式是以比例的方式輸出,在本例中,是當輸入的值超過 0.5 * Vcc
也就是大約 1.65V 時則會點亮板子上的 LED1 。
這個值的範圍從 0.0 到 1.0 ,也就是從 0V 到 3.3V。
範例程式 – LED 閃爍速度控制
知道了讀取的類比訊號的方式後,我們可以來利用目前有限的資源玩點有趣的。在這個例子中,我們利用 AnalogIn
輸入值的特性,就可以用可變電阻來控制 LED 閃爍頻率。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include "mbed.h" AnalogIn ain(p20); BusOut LEDs(LED1, LED2, LED3, LED4); main() { while(1) { LEDs = 0x0; wait( ain ); LEDs = 0xF; wait( ain ); } } |
執行結果就像這樣
上面的範例程式是一個閃爍頻率從恆亮到每秒閃爍一次的範例程式,這個程式還可以有更多變化,例如在 ain
加上適當的比例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include "mbed.h" AnalogIn ain(p20); BusOut LEDs(LED1, LED2, LED3, LED4); main() { while(1) { LEDs = 0x0; wait( ain * 2.0 ); LEDs = 0xF; wait( ain * 2.0 ); } } |
這樣就會變成從恆亮到兩秒閃爍一次的控制程式了。
範例程式 – LED 跑馬燈速度控制
這個則是控制 LED 跑馬燈速度的控制程式,原理與上面的都差不多,我們就只有把收到的值拿來作為切換 LED 速度的值而已。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include "mbed.h" AnalogIn ain(p20); BusOut LEDs(LED1, LED2, LED3, LED4); main() { while(1) { for(int i=1; i<=8; i*=2) { LEDs = i; wait( ain ); } } } |
執行結果
很酷對吧!
總結
今天這篇文章是在介紹 mbed 的類比訊號輸入的方式,並利用最簡單的方式去做相關的實驗。希望你能夠透過這簡單的實驗,知道如何使用這項頗為有趣的功能。