1.4. HADC

本芯片内置一个高精度24bit测量ADC,可应用于血压计,体重秤,体脂秤、血氧仪等医疗应用场景。 在标准模式下,本HADC具有良好的性能,硬件最高支持19bit的NFB,SNDR可达116DB。该HADC最高支持1M的工作频率,最低支持250KHz的工作频率。 硬件原生可支持7.6Hz~7.7kHz的输出采样率,工作带宽为3.9Hz~6.8KHz。 详细的示例代码请参考SDK “cpu/demo/hadc_demo.c”

Note

  1. HADC电源同时也是DAC模块的工作电源,HADC和DAC任何一个模块工作,都需要初始化HADC电源

  2. HADC电源初始化顺序:avddcp –> avddr –> avbg –> avcm

  3. HADC配置是遵循CIC使用配置表,使用表外的配置时,不能保证硬件性能

1.4.1. HADC输出频率计算方法及CIC配置表

1.4.1.1. 输出频率计算公式

过采样率计算方法:

\[OSR = (dsr_{0}\times 4 + 5)\times dsr_{1}\]

输出频率计算方法:

\[F_{out} = HADC_{clk} / OSR\]

例如:

\[HADC_{clk} = 500000 \quad dsr_{0} = 155 \quad dsr_{1} = 16 \quad F_{out} = 500000 / ((155\times 4 + 5)\times 16) = 50\]
\[HADC_{clk} = 600000 \quad dsr_{0} = 155 \quad dsr_{1} = 16 \quad F_{out} = 500000 / ((155\times 4 + 5)\times 16) = 60\]

1.4.1.2. CIC配置表

HADC配置表

WORK_MODE

CLK(kHz)

DSR0

ORDER0

DSR1

ORDER1

OSR

Fo(Hz)

0

500

15

4

DIS

2

65

7692

0

500

31

4

DIS

2

129

3875

0

500

63

4

DIS

2

257

1945

0

500

254

4

DIS

2

1021

498

0

500

254

4

4

2

4084

122

0

500

254

4

8

2

8168

61.2

0

500

254

4

16

2

16336

30.6

0

500

254

4

32

2

32672

15.3

0

600

30

4

16

2

2000

300

0

600

155

4

16

2

10000

60

0

500

155

4

16

2

10000

50

1.4.2. HADC基本模拟接口

1.4.2.1. hadc_avbg_init_for_fast_boot

快速启动时切换关闭avbg快速上电模式

原型:

void hadc_avbg_init_for_fast_boot(void);

1.4.2.2. hadc_avddcp_init_for_fast_boot

快速启动时切换hadc avddcp电源时钟为PLLCLK,软关机快速上电时调用

原型:

void hadc_avddcp_init_for_fast_boot(void);

1.4.2.3. hadc_avddcp_config

初始avddcp电源,支持直通或者升压模式,升压模式电压可调

原型:

void hadc_avddcp_config(u8 en, enum avddcp_mode_sel mode, enum avddcp_vol_sel avddcp_vol);
参数:

en

1:开启 0:关闭

mode

直通模式 or 升压模式

avddcp_vol

升压模式下,升压档位设置

返回值

1.4.2.4. hadc_avddr_config

初始avddr电源,支持电压可调,在avddcp电源初始化之后调用

原型:

void hadc_avddr_config(u8 en, enum avddr_vol_sel avddr_vol);
参数:

en

1:开启 0:关闭

avddr_vol

档位设置

返回值

1.4.2.5. hadc_avbg_config

初始化avbg电源,支持快速启动,在avddr初始化之后调用,该电源会校准至1.2V.

原型:

void hadc_avbg_config(u8 en, u8 faston_en, u8 with_cap);
参数:

en

1:开启 0:关闭

faston_en

1:开启快速上电 0:关闭快速上电

with_cap

1:有外挂电容 0:无外挂电容

返回值

1.4.2.6. hadc_avcm_config

初始化avbg电源,在avbg初始化之后调用,该电源固定1.2V.

原型:

void hadc_avcm_config(u8 en, u8 with_cap);
参数:

en

1:开启 0:关闭

with_cap

1:有外挂电容 0:无外挂电容

返回值

1.4.2.7. hadc_temp_sensor_config

配置内部温度传感器,需要采集内部问题传感器通道时开启

原型:

void hadc_temp_sensor_config(u8 en);
参数:

en

1:开启 0:关闭

返回值

1.4.2.8. hadc_pga_config

HADC内部PGA初始化,切换通道时应该先关闭再切换通道

原型:

void hadc_pga_config(u8 en, enum hadc_muxp_sel muxp, enum hadc_muxn_sel muxn, enum hadc_gain_sel gain);
参数:

en

1:开启 0:关闭

muxp

PGA P端信号选择

muxn

PGA N端信号选择

gain

PGA增益选择

返回值

1.4.2.9. hadc_opa_config

HADC内部OPA初始化,切换通道时应该先关闭再切换通道

原型:

void hadc_opa_config(u8 en, u8 cmp_en, enum hadc_opa_muxp_sel muxp, enum hadc_opa_muxn_sel muxn, enum hadc_opa_muxi_sel muxi, enum hadc_opa_muxo_sel muxo);
参数:

en

1:开启 0:关闭

cmp_en

比较器模式使能

muxp

OPA P端输入通道选择

muxn

OPA N端输入通道选择

muxi

OPA N端体脂信号输入通道选择

muxo

OPA O端输出通道选择

返回值

1.4.2.10. hadc_pa_config

DAC通路PA初始化,切换通道时应该先关闭再切换通道

原型:

void hadc_pa_config(u8 en, u8 cmp_en, enum hadc_pa_muxp_sel muxp, enum hadc_pa_muxn_sel muxn, enum hadc_pa_gain_sel gain);
参数:

en

1:开启 0:关闭

cmp_en

比较器模式使能

muxp

PA P端输入通道选择

muxn

PA N端输入通道选择

gain

PA 增益选择

返回值

1.4.2.11. hadc_vbim_config

VBIM模块测量内部阻抗通道配置

原型:

void hadc_vbim_config(u8 en, enum hadc_vbim_chl_sel chl);
参数:

en

1:开启 0:关闭

chl

BIM模块通道选择

返回值

1.4.3. HADC基本数字接口

1.4.3.1. hadc_open

初始化HADC数字模块,open后需要调用hadc_start开启数字逻辑

原型:

void hadc_open(struct hadc_platform_data *data);
参数:

data

配置参数结构体

返回值

1.4.3.2. hadc_close

关闭HADC模块,关闭后再使用时需要调用hadc_open

原型:

void hadc_close(void);

1.4.3.3. hadc_stop

暂停HADC数字逻辑,暂停后再继续可以调用hadc_start

原型:

void hadc_stop(void);

1.4.3.4. hadc_start

启动HADC数字逻辑,hadc_open后调用

原型:

void hadc_start(void);

1.4.3.5. hadc_set_out_freq

切换hadc输出频率

原型:

void hadc_set_out_freq(struct cic_data *cic0, struct cic_data *cic1);
参数:

cic0

cic0滤波器设置参数

cic1

cic1滤波器设置参数

返回值

一般使用流程:

hadc_stop();
hadc_set_out_freq(cic0, cic1);
hadc_start();

1.4.4. HADC使用示例代码

static const struct hadc_platform_data hadc_test_data = {
    .clock = 500000L,
    .cic[0].en = 1,
    .cic[0].dsr = 155,
    .cic[0].order = CIC0_4ORDER,
    .cic[1].en = 1,
    .cic[1].dsr = 16,
    .cic[1].order = CIC1_2ORDER,
    .isr_cb = hadc_isr_callback,
    .points = 1,
};

static void hadc_isr_callback(int *buffer, u32 buffer_len)
{
    for (u32 i = 0; i < buffer_len; i++) {
        log_info("hdac res : %d\n", buffer[i]);
    }
}

void hadc_demo_test(void)
{
    hadc_avddcp_config(1, AVDDCP_MODE_SEL_NORMAL, AVDDCP_VOL_SEL_3P60);
    hadc_avddr_config(1, AVDDR_VOL_SEL_3P0);
    hadc_avbg_config(1, 0, 1);
    hadc_avcm_config(1, 1);
    hadc_open((struct hadc_platform_data *)(&hadc_test_data));
    hadc_start();
    while (1) {
        wdt_clear();
    }
}