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
HADC电源同时也是DAC模块的工作电源,HADC和DAC任何一个模块工作,都需要初始化HADC电源
HADC电源初始化顺序:avddcp –> avddr –> avbg –> avcm
HADC配置是遵循CIC使用配置表,使用表外的配置时,不能保证硬件性能
1.4.1. HADC输出频率计算方法及CIC配置表
1.4.1.1. 输出频率计算公式
过采样率计算方法:
输出频率计算方法:
例如:
1.4.1.2. CIC配置表
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();
}
}