SAR使用参考
1. 概述¶
公板提供2组Sar接口,SAR口的ADC精度是8bit(回读的数据是10bit)。
本文主要介绍sar口如何配置以及如何在用户层使用sar口。
2. Dts配置¶
2.1. Demo 板支持的SAR adc接口¶
Sar interface | PAD |
---|---|
Sar 0 | PAD_SAR_GPIO0 |
Sar 1 | PAD_SAR_GPIO1 |
2.2. 配置SAR节点属性¶
pioneer3 -demo.dtsi:
2.3. Padmux中将对应的pin配置成sar mode¶
pioneer3-ssc020a-s01a-padmux.dtsi
3. Kernel配置¶
Kernel config中打开CONFIG_MS_SAR
配置完成后,重新编译kernel,替换kernel image到project烧录
4. UBOOT测试¶
4.1. Uboot config中打开SAR driver和CMD¶
打开menuconfig中的Command line interface -> Device access commands -> sar和 Device Drivers -> Mstar drivers -> SSTAR SAR
4.2. 测试SAR¶
编译开启sar driver和cmd的uboot并将其烧录到板子,通过SAR的cmd进行测试。
命令格式为:sar channel数(实际支持的channel数与板子有关)
可参考boot/common/cmd_sar.c
。
5. SAR控制¶
5.1. SAR控制概述¶
SAR驱动程序为用户提供ioctl接口,用做初始化SAR并获取SAR_ADC值。
5.2. 用户层使用SAR¶
5.2.1. SAR 设备¶
"/dev/sar”
5.2.2. SAR IOCTL 命令¶
IOCTL 命令 | 参数 | 描述 |
---|---|---|
IOCTL_SAR_INIT | NULL | initialize |
IOCTL_SAR_SET_CHANNEL_READ_VALUE | typedef struct { int channel_value; //[IN] int adc_value; //[OUT] } SAR_ADC_CONFIG_READ; channel_value: sar channel number(possible value: 0 or 1) adc_value: sar adc value | Get sar adc value |
5.2.3. 举例¶
#include <stdio.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> typedef struct { int channel_value; int adc_value; } SAR_ADC_CONFIG_READ; #define SARADC_IOC_MAGIC 'a' #define IOCTL_SAR_INIT _IO(SARADC_IOC_MAGIC, 0) #define IOCTL_SAR_SET_CHANNEL_READ_VALUE _IO(SARADC_IOC_MAGIC, 1) int main(void) { int i; SAR_ADC_CONFIG_READ adcCfg; adcCfg.channel_value = 0; //注意:PAD_SAR_GPIO0 = 0 PAD_SAR_GPIO1 = 1 PAD_SAR_GPIO2 = 2 int fd = open("/dev/sar", O_WRONLY); if(fd == -1) { int err = errno; printf("\n!!! FAILED to open /dev/sar, errno: %d %s\n", err, strerror(err)); return -1; } if (ioctl(fd, IOCTL_SAR_INIT, NULL) < 0) { int err = errno; printf("\n!!! IOCTL_SAR_INIT FAILED, errno: %d, %s\n", err, strerror(err)); } for (i=0; i < 500; i++) { if (ioctl(fd, IOCTL_SAR_SET_CHANNEL_READ_VALUE, &adcCfg) < 0) { int err = errno; printf("\n!!! IOCTL_SAR_SET_CHANNEL_READ_VALUE FAILED, errno: %d, %s\n", err, strerror(err)); } else { printf("SAR: get value %04d, 0x%03x \n", adcCfg.adc_value, adcCfg.adc_value); } usleep(100000); } return 0; }
6. DEMO示例¶
6.1. Kernel demo示例¶
测试源码test_sar.c
接入滑动变阻器,通过调节滑动变阻来调节电压,测试如下:
SAR读取为10位电压数据,通过读取值计算对应的电压值,在与实际测量电压进行比较。
例如,0636对应电压为 636 * 3.3 / 1024,计算约为2.05V,实际测量电压为2.08V。测量结果与计算结果差异在误差范围内。