- 模擬信號:Arduino中的模擬信號就是0v~5v的連續的電壓值
- 數字信號:Arduino中的數字信號就是高電平(5V)或者低電平(0V),是兩個離散的值
模擬信號->數字信號:ADC(模數轉換器)
ADC是用於將模擬信號轉換為數字信號的電路。將輸入的模擬信號通過ADC轉換為數字信號,處理器才能對其進行處理。
這里講的模擬輸入是指0~5v的電壓值。在Arduino上,ADC具有10位分辨率,這意味着它可以通過1,024個數字表示模擬電壓。相當於將連續的電壓值0~5v映射到離散的數值0~1023。將0 ~ 5V的電壓分成1024份(2^10),算出來約為4.882mV的測量精度。即:0~4.882mV之間的電壓值映射到數字0,4.883mV~9.764mV之間的電壓值映射到數字1......
這里的轉換關系如下:
數字i對應的模擬電壓區間為:
如果用區間的中位數來代表數字i對應的模擬電壓:
模擬輸入:analogRead(pin)
- 用analogRead()讀取到的輸入值就是0~1023之間的數值
- pin = 0~5 / A0~A5
模擬輸出:analogWrite(pin, outputVal)
- pin = 3,5,6,9,10,11(PWM引腳)
- outputVal的取值范圍:0~255(對應0V~5V)
這里的映射關系比較多,用一個圖示說明一下:
這種映射關系可以方便地借助map()函數實現:
map(value, fromLow, fromHigh, toLow, toHigh):
- value : 要處理的數值,在這里就是指模擬輸入端讀的數值
- fromLow, fromHigh : 輸入的上下限
- toLow, toHigh : 想要映射到的數值范圍的上下限
- 這里的fromLow和fromHigh,toLow和toHigh沒有明確的大小關系。map函數做的只是得到一個把fromLow映射到toLow,fromHigh映射到toHigh的線性映射關系,不在乎toLow和toHigh哪個大哪個小。
- 返回值:根據得到的線性映射關系將value映射到的那個值
值得注意的是:map()函數並沒有限制value的大小必須在fromLow和fromHigh之間,它只是根據得到的線性映射關系來輸出一個相對應的值。因此使用map()的時候可能會借助constrain()函數來限制輸出值的范圍:
constrain(value, min, max) :
- value < min : return min
- value > max : return max
- min <= value <= max : return value