自然界當中的訊號幾乎為連續的,也就是我們常說的類比訊號,而對於單晶片或著電腦來說,我們能夠接收的不外乎就是0與1,因此就有了ADC的誕生,ADC全名為Analog-To-Digital Converter,類比轉數位轉換器,透過短時間重複採樣,將連續尋號轉換為離散的。可以想像如果我們採集的頻率越高,越能完整的描述這個連續的訊號,這也就是取樣率的概念
而另一個重要的概念就是解析度,如果我們能夠將固定的範圍切的更細,那麼我們也就能更好的描述這個類比訊號。
還記得以前在Arduino使用analogRead他回傳的值為0~1023也就是切成1024等分,我們將其稱為10位元解析度的A/D轉換器(1024為2的10次方)。而STM32為12的解析度高達12位元,輸出為0~4095,分成4096等分。不過要注意的是Arduino是將0~5V切成1024等分,而STM32是將0~3.3V分成4096等分。稍微計算一下可以發現3.3/4096=0.000806,一個等分約為0.806mV。
STM32F429ZI單晶片總共有3個ADC轉換器(ADC1~ADC3),而每個轉換器有高達19個通道。
是不是完全聽不懂一下3個、一下19個、又通道...。我們可以想像ADC轉換器就是一台機器,可以將類比訊號轉換為數位訊號,而這台機器有19個開口來接收類比訊號(當然一次還是只能接收一個啦),但這台機器運作的速度非常快(根據我簡單的測量,轉換一次的時間約為11微秒左右),因此就算你19個通道全部都在輸入,那也只需要11X19=209微秒就可以測量完所有的通道,相當的快。
底下為每個ADC轉換器各個通道所對應到的腳位
首先我們先來看單通道的轉換
HAL_ADC_Start(ADC_HandleTypeDef* hadc)
HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
我們依序來介紹。
第一個函式的功能就是啟用ADC轉換器,就像你要使用一台機器前要先把開關打開的道理相同。
第二個函式的功能是等待轉換完成後再繼續執行程式。不要忘了這台機器轉換是需要時間的,雖然很快(~11us),因此這個函式就是等待轉換完成後再繼續執行。但如果這台機器出錯,轉換失敗呢?整個程式就一直卡在這裡那還得了,因此Timeout這個參數就是告訴這台機器最多要等多久,單位是ms。
第三個函式看名字就知道,它會回傳轉換的結果。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,1);
value = HAL_ADC_GetValue(&hadc1);
}
記得在全域宣告一個整數變數value
每次轉換前都要將ADC轉換器啟用(只要轉換完成就會關掉,因此要放在while迴圈)。
執行後我們就可以用現場表達是來監看轉換完成的value啦