SSU_ADC使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 10/30/2022

    1. 概述

    1.1. 概述

    CHIP有两部分的ADC,包括10bit精度的SAR-ADC和12bit精度的PWM-ADC。

    SAR-ADC有2个Channel,获取到的值范围在0~0x3ff之间,参考电压有两个挡位,分别为1.8V和1.0V。

    PWM-ADC有24个Channel,获取到的值的范围在0~0xFFF之间,参考电压有三个挡位。分别为1.5V、3.3V和1.8V。

    1.2. 说明

    ADC的主要功能是将连续变量的模拟信号转换为离散的数字信号,即可以将输入电压V转换为表示一定比例下的寄存器数值,当已知参考电压,计算公式为:

    电压 = ( 寄存器数值 / 满量程 )* 参考电压

    因此SAR-ADC和PWM-ADC的主要功能都是模数转换,两者的区别在于:SAR-ADC只支持Freerun模式下的不间断采样,而PWM-ADC支持设定通道采样顺序、多种触发方式下的间断或不间断采样,并且允许DMA模式下的采样数值存储,具体展开如下:

    1. Regular Channel / Inject Channel采样,Regular Channel的采样模式更多是在空闲状态下的电压采样,而Inject Channel的采样模式则更多是使用在某个特定时刻的电压检测,因为Inject Channel的采样会优先于Regular Channel。

    2. Regular Channel的采样序列所能支持的最大通道数为23个ADC采样通道,Inject Channel的采样序列所能支持的最大通道数为12个ADC采样通道。

    3. 在触发模式方面,Regular Channel / Inject Channel采样都支持PWM触发、SW触发、External触发,差异的地方是Inject Channel不支持Freerun模式,而Regular Channel支持,并且支持设置Freerun模式下每个通道之间的的采样间隔时间。

    4. 在采样模式方面,Regular Channel / Inject Channel都支持Single / Continuous模式,即完成一个采样序列之后是选择继续采样还是停止采样。

    5. 为了应对高速采样模式下,寄存器数值不能及时存储的问题,支持开启ADC的DMA模式,可以将数据暂时存储于内存中,等到需要的时候再去对应地址获取。

    2. Kernel Space配置

    2.1. SAR-ADC

    2.1.1. menuconfig配置

    Device Drivers --->
    
        [*] SStar SoC platform drivers --->
    
            <*> sar driver
    

    2.1.2. DTS配置

    1.    sar: sar {
    2.        compatible = "sstar,infinity-sar";
    3.        clocks = <&CLK_sar>;
    4.        reg = <0x1F002800 0x200>;
    5.        status = "ok";
    6.    };
    

    2.1.3. Padmux配置

    SAR-ADC无需进行padmux的配置。

    2.1.4. 驱动路径

    kernel/drivers/sstar/sar/mdrv_sar.c

    2.2. PWM-ADC

    2.2.1. menuconfig配置

    Device Drivers --->
    
        [*] SStar SoC platform drivers --->
    
            [*] PWM OUT driver
    

    2.2.2. DTS配置

    7.    pwmout: pwmout {
    8.         compatible = "sstar,pmwout";
    9.         reg = <0x1F203600 0x200>, <0x1F200E00 0x200>;
    10.        clocks = <&CLK_pwm_adc>;
    11.        interrupts = <GIC_SPI INT_FIQ_ADC_FIQ IRQ_TYPE_LEVEL_HIGH>;
    12.        frequency = <12000000>;
    13.        /*
    14.         * reference voltage setting
    15.         * 0->1.5V
    16.         * 1->3.3V
    17.         * 2->1.8V
    18.         */
    19.        voltage = <0>;
    20.        //chan-sel = <0 1 2>;
    21.        //chan-num = <3>;
    22.        status = "okay";
    23.    };
    
    属性 描述 备注
    compatible 用于匹配驱动进行驱动注册 禁止修改
    reg 寄存器映射的物理地址 禁止修改
    clock 时钟节点 禁止修改
    interrupts 中断号及属性 禁止修改
    frequency 时钟频率 根据需要配置
    voltage 参考电压的挡位设置 根据需要配置,0表示1.5V,1表示3.3V,2表示1.8V
    chan-sel 表示初始化的时候要加入采样的具体通道序号 根据需要配置,搭配chan-num使用
    chan-num 表示初始化的时候要加入采样的总通道个数 根据需要配置,搭配chan-sel使用
    status 驱动开关 根据需要配置,okay/disabled

    如果设备树中没有配置chan-sel和chan-num,则采样序列中会默认存在一个无效channel

    2.2.3. Padmux配置

    1.    <PAD_SAR_ADC_0   PINMUX_FOR_ADC0_MODE1   MDRV_PUSE_PWMADC0>,
    2.    <PAD_SAR_ADC_1   PINMUX_FOR_ADC1_MODE1   MDRV_PUSE_PWMADC1>,
    3.    <PAD_SAR_ADC_2   PINMUX_FOR_ADC2_MODE1   MDRV_PUSE_PWMADC2>,
    4.    <PAD_SAR_ADC_3   PINMUX_FOR_ADC3_MODE1   MDRV_PUSE_PWMADC3>,
    5.    <PAD_SAR_ADC_4   PINMUX_FOR_ADC4_MODE1   MDRV_PUSE_PWMADC4>,
    6.    <PAD_SAR_ADC_5   PINMUX_FOR_ADC5_MODE1   MDRV_PUSE_PWMADC5>,
    7.    <PAD_SAR_ADC_6   PINMUX_FOR_ADC6_MODE1   MDRV_PUSE_PWMADC6>,
    8.    <PAD_SAR_ADC_7   PINMUX_FOR_ADC7_MODE1   MDRV_PUSE_PWMADC7>,
    9.    <PAD_SAR_ADC_8   PINMUX_FOR_ADC8_MODE1   MDRV_PUSE_PWMADC8>,
    10.    <PAD_SAR_ADC_9   PINMUX_FOR_ADC9_MODE1   MDRV_PUSE_PWMADC9>,
    11.    <PAD_SAR_ADC_10  PINMUX_FOR_ADC10_MODE1  MDRV_PUSE_PWMADC10>,
    12.    <PAD_SAR_ADC_11  PINMUX_FOR_ADC11_MODE1  MDRV_PUSE_PWMADC11>,
    13.    <PAD_SAR_ADC_12  PINMUX_FOR_ADC12_MODE1  MDRV_PUSE_PWMADC12>,
    14.    <PAD_SAR_ADC_13  PINMUX_FOR_ADC13_MODE1  MDRV_PUSE_PWMADC13>,
    15.    <PAD_SAR_ADC_14  PINMUX_FOR_ADC14_MODE1  MDRV_PUSE_PWMADC14>,
    16.    <PAD_SAR_ADC_15  PINMUX_FOR_ADC15_MODE1  MDRV_PUSE_PWMADC15>,
    17.    <PAD_SAR_ADC_16  PINMUX_FOR_ADC16_MODE1  MDRV_PUSE_PWMADC16>,
    18.    <PAD_SAR_ADC_17  PINMUX_FOR_ADC17_MODE1  MDRV_PUSE_PWMADC17>,
    19.    <PAD_SAR_ADC_18  PINMUX_FOR_ADC18_MODE1  MDRV_PUSE_PWMADC18>,
    20.    <PAD_SAR_ADC_19  PINMUX_FOR_ADC19_MODE1  MDRV_PUSE_PWMADC19>,
    21.    <PAD_SAR_ADC_20  PINMUX_FOR_ADC20_MODE1  MDRV_PUSE_PWMADC20>,
    22.    <PAD_SAR_ADC_21  PINMUX_FOR_ADC21_MODE1  MDRV_PUSE_PWMADC21>,
    23.    <PAD_SAR_ADC_22  PINMUX_FOR_ADC22_MODE1  MDRV_PUSE_PWMADC22>,
    24.    <PAD_SAR_ADC_23  PINMUX_FOR_ADC23_MODE1  MDRV_PUSE_PWMADC23>,
    

    2.2.4. 驱动路径

    kernel/drivers/sstar/pwm/drv_pwm_out

    3. User Space使用SAR-ADC

    3.1. 电压采样

    3.1.1. 配置步骤

    1. 选择采样的通道Channel$n

      1.    echo $n > /sys/class/mstar/sar/channel
      
    2. 获取采样后的值

      1.    cat /sys/class/mstar/sar/channel
      

    3.1.2. Sample

    1.    echo 0 > /sys/class/mstar/sar/channel
    2.    cat /sys/class/mstar/sar/channel
    

    4. User Space使用PWM-ADC

    4.1. 参考电压的设置

    4.1.1.配置步骤

    1. 设置参考电压的挡位, 0表示1.5V,1表示3.3V,2表示1.8V

      1. echo channel 0/1/2 > /sys/devices/virtual/mstar/pwmout/adc_refvol
      
    2. 当参考电压为3.3V的时候,需要输入对应channel的外部电阻的阻值,单位为Ohm

      1. echo channel r_ext > /sys/devices/virtual/mstar/pwmout/adc_rext
      

    4.1.2.sample

    1. echo 0 1 > /sys/devices/virtual/mstar/pwmout/adc_refvol
    2. echo 0 2000 > /sys/devices/virtual/mstar/pwmout/adc_rext
    

    4.2. Regular Channel采样

    4.2.1. 配置步骤

    1. enable/disable PWM_ADC

      1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_en
      
    2. 设置PWM_ADC采样的通道个数total_number和具体的通道序列,提供24个通道可以选择

      1. echo total_number s0 s1 s2 … > /sys/devices/virtual/mstar/pwmout/adc_regu_seq
      
    3. 设置PWM_ADC采样的触发类型,0~11表示PWM_PN触发,12表示sw触发,13表示外部触发,14表示freerun;设置trigger method,1表示每次触发完成一个sequence的采样,0表示每次触发完成一个channel的采样

      1. echo trigger_mode trigger_method > /sys/devices/virtual/mstar/pwmout/adc_regu_tri
      
    4. 设置采样的模式,0表示single mode,当完成一个采样序列后会停止采样,1表示continuous mode,当完成一个采样序列之后不会停止采样,而是继续采样

      1. echo conversion_mode > /sys/devices/virtual/mstar/pwmout/adc_regu_con
      
    5. 开始/结束Regular Channel的采样,选择continuous mode的时候,可以通过该条命令停止采样

      1. echo 1/0 > /sys/devices/virtual/mstar/pwmout/adc_regu_star
      
    6. 选择sw触发类型的时候,通过该命令进行触发,1表示Regular Channel的sw触发

      1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_sw_tri
      
    7. 获取Channel$n的采样结果

      1. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_data
      
      2. cat /sys/devices/virtual/mstar/pwmout/adc_data
      

    4.2.2. Sample

    1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_en
    
    2. echo 8 0 1 2 3 4 5 6 7 > /sys/devices/virtual/mstar/pwmout/adc_regu_seq
    
    3. echo 14 1 > /sys/devices/virtual/mstar/pwmout/adc_regu_tri
    
    4. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_regu_con
    
    5. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_regu_star
    
    6. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_data
    
    7. cat /sys/devices/virtual/mstar/pwmout/adc_data
    

    4.3. Inject Channel 采样

    4.3.1. 配置步骤

    1. enable/disable PWM_ADC

      1. echo 0/1 > /sys/devices/virtual/mstar/pwmout/adc_en
      
    2. 设置PWM_ADC采样的通道个数total_number和具体的通道序列,提供24个通道可以选择

      1. echo total_number s0 s1 s2 … > /sys/devices/virtual/mstar/pwmout/adc_inj_seq
      
    3. 设置PWM_ADC采样的触发类型,0~11表示PWM_PN触发,12表示sw触发,13表示外部触发;设置trigger method,1表示每次触发完成一个sequence的采样,0表示每次触发完成一个channel的采样

      1. echo trigger_mode trigger_method > /sys/devices/virtual/mstar/pwmout/adc_inj_tri
      
    4. 设置采样的模式,0表示single mode,当完成一个采样序列后会停止采样,1表示continuous mode,当完成一个采样序列之后不会停止采样,而是继续采样

      1. echo conversion_mode > /sys/devices/virtual/mstar/pwmout/adc_inj_con
      
    5. 开始/结束Inject Channel的采样,选择continuous mode的时候,可以通过该条命令停止采样

      1. echo 1/0 > /sys/devices/virtual/mstar/pwmout/adc_inj_star
      
    6. 选择sw触发类型的时候,通过该命令进行触发,0表示Inject Channel的sw触发

      1. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_sw_tri
      
    7. 获取Channel$n的采样结果

      1. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_data
      
      2. cat /sys/devices/virtual/mstar/pwmout/adc_data
      

    4.3.2. Sample

    1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_en
    
    2. echo 8 0 1 2 3 4 5 6 7 > /sys/devices/virtual/mstar/pwmout/adc_inj_seq
    
    3. echo 12 0 > /sys/devices/virtual/mstar/pwmout/adc_inj_tri
    
    4. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_inj_con
    
    5. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_inj_star
    
    6. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_sw_tri // 触发一次
    
    7. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_data
    
    8. cat /sys/devices/virtual/mstar/pwmout/adc_data
    

    4.4. ADC DMA mode

    4.4.1. 配置步骤

    1. 设置用于存储ADC数据的内存大小,单位Byte

      1. echo size > /sys/devices/virtual/mstar/pwmout/adc_dma_con
      
    2. 设置数据对齐方式,1表示左对齐,0表示右对齐;并enable DMA mode

      1. echo align enable > /sys/devices/virtual/mstar/pwmout/adc_dma_en
      

    4.4.2. Sample

    1. echo 0x100 > /sys/devices/virtual/mstar/pwmout/adc_dma_con
    
    2. echo 0 1 > /sys/devices/virtual/mstar/pwmout/adc_dma_en
    

    4.5. 采样间隔设置

    4.5.1. 配置步骤

    1. 设置每个通道的采样次数,支持四档的采样次数设置,0:1 time;1:4 times;2:8 times;3:16 times;以及每个通道的采样的时间:sampling_time * 167 ns
      1. echo average_count sampling_time > /sys/devices/virtual/mstar/pwmout/adc_freerun
      

    4.5.2. Sample

    1. echo 1 255 > /sys/devices/virtual/mstar/pwmout/adc_freerun
    

    4.6. 覆盖序列设定

    4.6.1. 配置步骤

    1. 设置采样通道的时候,可以选择是否覆盖之前的采样序列设定,0表示在当前采样序列上叠加,1表示覆盖当前采样序列
      1. echo 0/1 > /sys/devices/virtual/mstar/pwmout/adc_chan_cover
      

    4.6.2. Sample

    1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_chan_cover
    

    5. Uboot 使用PWM-ADC

    5.1. 初始配置

    1. 设置PWM_ADC采样的初始配置,包括通道序列、采样模式、触发类型、触发模式,默认将采样序列配置为0~22,总共23路。若需要单个调整某个设置,可参考下方命令:

      1. pwmadc init [ch_sel] [trimode] [trimethod] [conmode_sel] [enable]
      

      [ch_sel] 为1表示regular channel,为0表示inject channel。

      [trimode] 为0~11表示PWM_PN触发,为12表示sw触发,为13表示外部触发,为14表示freerun。

      [trimethod] 为0表示每次触发完成一个channel的采样,为1表示每次触发完成一个sequence的采样。

      [conmode_sel] 为0表示single mode,为1表示continuous mode。

      [enable] 为1表示enable,为0表示disable。

    5.2. 采样数据的获取

    1. 获取某个通道的采样数据。

      1. pwmadc data [channel_id]
      

      [channel_id] 表示所要获取采样值的ADC通道序号

    5.3. 采样序列的设置

    1. 设置PWM_ADC采样的通道序列,提供24个通道可以选择。

      1. pwmadc seq [ch_sel] [channel_id] [channel_id] [channel_id] ...
      

      [ch_sel] 为1表示regular channel,为0表示inject channel

      [channel_id] [channel_id] ... 表示具体要设置的序列,如:0 3 2 4 5 13 18...

    5.4. 采样模式的设置

    1. 设置PWM_ADC采样的模式,single mode:当完成一个采样序列后会停止采样;continuous mode:当完成一个采样序列之后不会停止采样,而是继续采样。

      1. pwmadc con [ch_sel] [conmode_sel]
      

      [ch_sel] 为1表示regular channel,为0表示inject channel

      [conmode_sel] 为0表示single mode,为1表示continuous mode

    5.5. 采样触发类型的设置

    1. 设置PWM_ADC采样的触发类型。

      1. pwmadc tri [ch_sel] [trimode] [trimethod]
      

      [ch_sel] 为1表示regular channel,为0表示inject channel

      [trimode] 0~11表示PWM_PN触发,12表示sw触发,13表示外部触发,14表示freerun。需要注意的是,regular channel支持freerun的触发方式,但inject channel不支持

      [trimethod] 为0表示每次触发完成一个channel的采样,为1表示每次触发完成一个sequence的采样

    2. 进行sw触发,支持regular channel、inject channel的sw触发。

      1. pwmadc sw [ch_sel]
      

      [ch_sel] 为1表示regular channel,为0表示inject channel

    5.6. 采样模式的开始和结束

    1. 开始/结束PWM_ADC采样,选择continuous mode的时候,可以通过该条命令停止采样。

      1. pwmadc start [ch_sel]
      2. pwmadc end [ch_sel]
      

      [ch_sel] 为1表示regular channel,为0表示inject channel

    5.7. 参考电压的设置

    1. 设置参考电压的挡位,支持1.5V、3.3V和1.8V三档。

      1. pwmadc set_vol [channel_id] [ref_voltage]
      

      [channel_id] 表示所要设置的ADC通道序号

      [ref_voltage] 为0表示设置参考电压为1.5V,为1表示设置参考电压为3.3V,为2表示设置参考电压为1.8V

    2. 获取参考电压的挡位,共1.5V、3.3V和1.8V三档。

      1. pwmadc get_vol [channel_id]
      

      [channel_id] 表示所要设置的ADC通道序号

    5.8. 传递引脚的外部电阻阻值

    1. 在参考电压为3.3V的时候,需要输入对应channel引脚的外部电阻的具体阻值,单位为Ohm。

      1. pwmadc rxet [channel_id] [r_external]
      

      [channel_id] 表示所要设置ADC通道序号

      [r_external] 外部电阻的具体阻值,单位为Ohm