RK3588s带有一个 SARADC (successive approximation register) 控制器。内核里面使用IIO驱动,能够支持Linux下的标准IIO框架编程。
板上引出两路ADC,分别为通道3和通道4,位置如下。
在Linux下对应的设备节点分别是 /sys/bus/iio/devices/iio:device0/in_voltage3_raw /sys/bus/iio/devices/iio:device0/in_voltage4_raw.下面以通道3为例介绍其用法。
找一个电位器,电位器的采用3.3V供电,接线如下
调整电位器的电阻值,使得输出端的电压低于1.8V(板上ADC参考电压值为1.8V, 如果超过1.8V,需要加上电阻分压电路再测量),然后使用万用表测得此时电压约为1.013V
读取ADC值
cat /sys/bus/iio/devices/iio\:device0/in_voltage3_raw
执行结果如下,可以看到读取到的值为2307
然后计算电压值
2307/4096*1.8 = 1.01382V
与万用表测得的值基本一致
通过连接 libperipheral_api.a 静态库,可以使用C语言调用以下接口来操作ADC
/**
* @name: user_adc_get_value
* @description: 获取adc值
* @param adc_num: adc通道号
* @param value: 读取的原始值
* @return 等于0 - 成功 小于0 - 失败
*/
int user_adc_get_value(int adc_num, unsigned int *value);
测试demo如下,以操作 adc3 为例。这里采用连续采样5次取平均值
#include "peripheral_api.h"
void adc_api_test()
{
unsigned int adc_raw_value[5] = {0};
float voltage = 0.0;
user_adc_get_value(3,adc_raw_value);
usleep(1000);
user_adc_get_value(3,adc_raw_value+1);
usleep(1000);
user_adc_get_value(3,adc_raw_value+2);
usleep(1000);
user_adc_get_value(3,adc_raw_value+3);
usleep(1000);
user_adc_get_value(3,adc_raw_value+4);
voltage = (float)(adc_raw_value[0]+adc_raw_value[1]+adc_raw_value[2]+adc_raw_value[3]+adc_raw_value[4])/(5*4096)*1.8;
printf("voltage %f\n", voltage);
return;
}
int main()
{
adc_api_test();
return 0;
}
将peripheral_api.a静态库、peripheral_api.h和测试demo源码test.c放到同一路径下,编译命令如下
aarch64-none-linux-gnu-gcc test.c peripheral_api.a -I. -o adctest
运行结果如下