SAR使用参考

Version 1.0


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。测量结果与计算结果差异在误差范围内。