IMX6ULL一共有兩個ADC,每個ADC都有八個通道,但他們共用一個ADC控制器
1.設(shè)備樹
在imx6ull.dtsi文件中已經(jīng)幫我們定義好了adc1的節(jié)點部分信息
adc1: adc@02198000 {
compatible = "fsl,imx6ul-adc", "fsl,vf610-adc";
reg = <0x02198000 0x4000>;
interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_ADC1>;
num-channels = <2>;
clock-names = "adc";
status = "disabled";
};
注意 num-channels = <2>;,這個表示指定使用ADC1的兩個通道,即通道1和通道2
如果你要使用多個ADC通道,修改這個值即可
配置ADC引腳的 pinctrl,在自己的設(shè)備樹(.dts)中引用adc1并指定 pinctrl子系統(tǒng),也就是指定引腳
首先在根節(jié)點下定義 pinctrl
/* chenshao ADC1_CH1 GPIO1_IO01 */
pinctrl_adc1: adc1grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0xb0
>;
};
接著在 regulators 節(jié)點下設(shè)置ADC的參考電壓,設(shè)置為5V(因為MQ135輸出最大模擬電壓是5V)
/* chenshao ADC vref 5.0V */
reg_vref_adc: regulator@2 {
compatible = "regulator-fixed";
regulator-name = "VREF_5V";
regulator-min-microvolt = <0>;
regulator-max-microvolt = <5000000>;
};
最后在根節(jié)點之外引用adc1節(jié)點,并指定引腳可參考電壓節(jié)點
/* chenshao ADC1 */
&adc1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_adc1>;
num-channels = <2>; /* 2個通道,gpio1_io0占用一個 */
vref-supply = <®_vref_adc>;
status = "okay";
};
2.直接查看ADC值
1.進入iio總線下的設(shè)備目錄
cd /sys/bus/iio/devices/iio:device0/
2.ls查看
------------------------
dev of_node
in_voltage0_raw power
in_voltage1_raw sampling_frequency_available
in_voltage_sampling_frequency subsystem
in_voltage_scale uevent
name
3.查看ADC通道1原始值(由于IMX6ULL ADC為12位,所以最小值為0,最大值為4095(2^12),分別對應(yīng)0V,3.3V或5V)
cat in_voltage1_raw
721
4.查看電壓規(guī)模
cat in_voltage_scale
1.220703125
5.計算實際電壓
in_voltage1_raw * in_voltage_scale 即可,注意單位是毫伏
3.應(yīng)用程序獲取ADC和電壓
讀取 /sys/bus/iio/devices/iio:device0/in_voltage1_raw 文件得到ADC原始值
讀取 /sys/bus/iio/devices/iio:device0/in_voltage_scale 文件得到電源規(guī)模值
兩者相乘,再除以1000即可得到電壓值(單位V)
PS:
讀取文件前使用 rewind函數(shù) 將光標移到最開頭,
可以使用 fscanf 讀取文件
利用 atoi 和 atof 庫函數(shù)轉(zhuǎn)換類型文章來源:http://www.zghlxwxcb.cn/news/detail-663971.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
const char *voltage1_raw = "/sys/bus/iio/devices/iio:device0/in_voltage1_raw";
const char *voltage_scale = "/sys/bus/iio/devices/iio:device0/in_voltage_scale";
int main(int argc, char *argv[])
{
FILE *raw_fd, *scale_fd;
int len1, len2, res;
char data[20];
int raw;
double scale;
while(1){
/* 1.打開文件 */
raw_fd = fopen(voltage1_raw, "r");
if(raw_fd == NULL){
printf("open raw_fd failed!\n");
return -1;
}
scale_fd = fopen(voltage_scale, "r");
if(scale_fd == NULL){
printf("open scale_fd failed!\n");
return -2;
}
/* 2.讀取文件 */
rewind(raw_fd); // 將光標移回文件開頭
res = fscanf(raw_fd, "%s", data);
raw = atoi(data);
memset(data, 0, sizeof(data));
rewind(scale_fd); // 將光標移回文件開頭
res = fscanf(scale_fd, "%s", data);
scale = atof(data);
printf("ADC原始值:%d,電壓值:%.3fV\r\n", raw, raw * scale / 1000.f);
fclose(raw_fd);
fclose(scale_fd);
sleep(2);
}
return 0;
}
測試成功文章來源地址http://www.zghlxwxcb.cn/news/detail-663971.html
# ./adcApp
ADC原始值:390,電壓值:0.476V
ADC原始值:399,電壓值:0.487V
ADC原始值:413,電壓值:0.504V
ADC原始值:416,電壓值:0.508V
ADC原始值:410,電壓值:0.500V
ADC原始值:407,電壓值:0.497V
到了這里,關(guān)于【IMX6ULL驅(qū)動開發(fā)學習】22.IMX6ULL開發(fā)板讀取ADC(以MQ-135為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!