SSU_ADC使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 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模式下的采样数值存储,具体展开如下:
-
Regular Channel / Inject Channel采样,Regular Channel的采样模式更多是在空闲状态下的电压采样,而Inject Channel的采样模式则更多是使用在某个特定时刻的电压检测,因为Inject Channel的采样会优先于Regular Channel。
-
Regular Channel的采样序列所能支持的最大通道数为23个ADC采样通道,Inject Channel的采样序列所能支持的最大通道数为12个ADC采样通道。
-
在触发模式方面,Regular Channel / Inject Channel采样都支持PWM触发、SW触发、External触发,差异的地方是Inject Channel不支持Freerun模式,而Regular Channel支持,并且支持设置Freerun模式下每个通道之间的的采样间隔时间。
-
在采样模式方面,Regular Channel / Inject Channel都支持Single / Continuous模式,即完成一个采样序列之后是选择继续采样还是停止采样。
-
为了应对高速采样模式下,寄存器数值不能及时存储的问题,支持开启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. 配置步骤¶
-
选择采样的通道Channel$n
1. echo $n > /sys/class/mstar/sar/channel
-
获取采样后的值
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.配置步骤¶
-
设置参考电压的挡位, 0表示1.5V,1表示3.3V,2表示1.8V
1. echo channel 0/1/2 > /sys/devices/virtual/mstar/pwmout/adc_refvol
-
当参考电压为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. 配置步骤¶
-
enable/disable PWM_ADC
1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_en
-
设置PWM_ADC采样的通道个数total_number和具体的通道序列,提供24个通道可以选择
1. echo total_number s0 s1 s2 … > /sys/devices/virtual/mstar/pwmout/adc_regu_seq
-
设置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
-
设置采样的模式,0表示single mode,当完成一个采样序列后会停止采样,1表示continuous mode,当完成一个采样序列之后不会停止采样,而是继续采样
1. echo conversion_mode > /sys/devices/virtual/mstar/pwmout/adc_regu_con
-
开始/结束Regular Channel的采样,选择continuous mode的时候,可以通过该条命令停止采样
1. echo 1/0 > /sys/devices/virtual/mstar/pwmout/adc_regu_star
-
选择sw触发类型的时候,通过该命令进行触发,1表示Regular Channel的sw触发
1. echo 1 > /sys/devices/virtual/mstar/pwmout/adc_sw_tri
-
获取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. 配置步骤¶
-
enable/disable PWM_ADC
1. echo 0/1 > /sys/devices/virtual/mstar/pwmout/adc_en
-
设置PWM_ADC采样的通道个数total_number和具体的通道序列,提供24个通道可以选择
1. echo total_number s0 s1 s2 … > /sys/devices/virtual/mstar/pwmout/adc_inj_seq
-
设置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
-
设置采样的模式,0表示single mode,当完成一个采样序列后会停止采样,1表示continuous mode,当完成一个采样序列之后不会停止采样,而是继续采样
1. echo conversion_mode > /sys/devices/virtual/mstar/pwmout/adc_inj_con
-
开始/结束Inject Channel的采样,选择continuous mode的时候,可以通过该条命令停止采样
1. echo 1/0 > /sys/devices/virtual/mstar/pwmout/adc_inj_star
-
选择sw触发类型的时候,通过该命令进行触发,0表示Inject Channel的sw触发
1. echo 0 > /sys/devices/virtual/mstar/pwmout/adc_sw_tri
-
获取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. 配置步骤¶
-
设置用于存储ADC数据的内存大小,单位Byte
1. echo size > /sys/devices/virtual/mstar/pwmout/adc_dma_con
-
设置数据对齐方式,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. 配置步骤¶
- 设置每个通道的采样次数,支持四档的采样次数设置,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. 配置步骤¶
- 设置采样通道的时候,可以选择是否覆盖之前的采样序列设定,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. 初始配置¶
-
设置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. pwmadc data [channel_id]
[channel_id] 表示所要获取采样值的ADC通道序号
5.3. 采样序列的设置¶
-
设置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. 采样模式的设置¶
-
设置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. 采样触发类型的设置¶
-
设置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的采样
-
进行sw触发,支持regular channel、inject channel的sw触发。
1. pwmadc sw [ch_sel]
[ch_sel] 为1表示regular channel,为0表示inject channel
5.6. 采样模式的开始和结束¶
-
开始/结束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.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
-
获取参考电压的挡位,共1.5V、3.3V和1.8V三档。
1. pwmadc get_vol [channel_id]
[channel_id] 表示所要设置的ADC通道序号
5.8. 传递引脚的外部电阻阻值¶
-
在参考电压为3.3V的时候,需要输入对应channel引脚的外部电阻的具体阻值,单位为Ohm。
1. pwmadc rxet [channel_id] [r_external]
[channel_id] 表示所要设置ADC通道序号
[r_external] 外部电阻的具体阻值,单位为Ohm