HS6621 芯片 ADC检测调试
一、函数接口
- 工程中给我们提供了三种直接使用 ADC 的接口函数
- 获取当前芯片供电电源电压
- 获取单个 GPIO 引脚电压
- 获取两个 GPIO 引脚电压差值,
所以返回值为 int16_t, 他允许负数的存在,所以返回值存储时需要注意
- 函数最后一个参数是调用该函数所采集 ADC 值的次数,返回值为多次返回值的平均值,单位是 mv
/**
* @brief adc read voltage with channel
*
* @param[in] cb call the callback when adc sample done
*
* @return voltage (mV)
**/
int16_t adc_battery_voltage_read(adc_callback_t cb);
/**
* @brief adc read voltage with channel, use single_ended
*
* @param[in] ch_p adc channel.
* @param[in] gain adc gain. or the measure range(V)
* @param[in] cb call the callback when adc sample done
* @param[in] sample_num measure count
*
* @return voltage (mV)
**/
int16_t adc_battery_voltage_read_by_single_pin(adc_channel_t ch_p, adc_pga_gain_t gain, adc_callback_t cb, int sample_num);
/**
* @brief adc read voltage with channel, use differential mode
*
* @param[in] ch_p adc channel, adc_inp.
* @param[in] ch_n adc channel. adc_nnp
* @param[in] gain adc gain. or the measure range(V)
* @param[in] cb call the callback when adc sample done
* @param[in] sample_num measure count
*
* @return voltage (mV)
**/
int16_t adc_battery_voltage_read_by_dif_pin(adc_channel_t ch_p, adc_channel_t ch_n, adc_pga_gain_t gain, adc_callback_t cb, int sample_num);
二、电压引脚初始化通道选择
HS6621CG 这款芯片能够使用 ADC 检测的引脚有:PIN2, PIN3, PIN7, PIN8, PIN9, PIN10, PIN11, PIN12
- 在 GPIO 引脚初始化函数 pinmux_config(); 中进行设置
typedef enum
{
//......
// Analog mode
PINMUX_ANALOG_BEGIN_CFG = 200,
PINMUX_ANALOG_CH0_PIN8_CFG,
PINMUX_ANALOG_CH1_PIN9_CFG,
PINMUX_ANALOG_CH2_PIN2_CFG,
PINMUX_ANALOG_CH3_PIN3_CFG,
PINMUX_ANALOG_CH4_PIN10_CFG,
PINMUX_ANALOG_CH5_PIN11_CFG,
PINMUX_ANALOG_CH6_PIN12_CFG,
PINMUX_ANALOG_CH7_PIN7_CFG,
}pinmux_t;
三、 测量电压范围设置
/// ADC PGA Gain
typedef enum {
ADC_PGA_GAIN_0P125 = 0, /* when measuring voltage, the range is 0-4.2v. */
ADC_PGA_GAIN_0P25 , /* when measuring voltage, the range is 0-3.2v. */
ADC_PGA_GAIN_0P5 , /* when measuring voltage, the range is 0-1.6v. */
ADC_PGA_GAIN_1 , /* when measuring voltage, the range is 0-0.8v. */
ADC_PGA_GAIN_2 , /* when measuring voltage, the range is 0-0.4v. */
ADC_PGA_GAIN_4 , /* when measuring voltage, the range is 0-0.2v. */
ADC_PGA_GAIN_MAX
} adc_pga_gain_t;
四、调用函数接口时的 ADC 通道选择
/// ADC Channel type
typedef enum {
ADC_CHANNEL_CHIP_TEMPERATURE = 0, /* b0000 channel temperature. bit */
ADC_CHANNEL_CHIP_BATTERY , /* b0001 channel battery. */
ADC_CHANNEL_CHIP_VCM , /* b0010 channel vcm. */
ADC_CHANNEL_EXTERN_CH0 , /* b0011 channel 0. */
ADC_CHANNEL_EXTERN_CH1 , /* b0100 channel 1. */
ADC_CHANNEL_EXTERN_CH2 , /* b0101 channel 2. */
ADC_CHANNEL_EXTERN_CH3 , /* b0110 channel 3. */
ADC_CHANNEL_EXTERN_CH4 , /* b0111 channel 4. */
ADC_CHANNEL_EXTERN_CH5 , /* b1000 channel 5. */
ADC_CHANNEL_EXTERN_CH6 , /* b1001 channel 6. */
ADC_CHANNEL_EXTERN_CH7 , /* b1010 channel 7. */
ADC_CHANNEL_VIP_CHG , /* b1011 channel vip chg. */
ADC_CHANNEL_VCC_VBAT_CHG , /* b1100 channel vcc vbat chg. */
ADC_CHANNEL_NUM
} adc_channel_t;
五、源码示例
void example_adc(void)
{
float ret = 0.0;
pinmux_config(7, PINMUX_ANALOG_CH7_PIN7_CFG);
pinmux_config(8, PINMUX_ANALOG_CH0_PIN8_CFG);
pinmux_config(9, PINMUX_ANALOG_CH1_PIN9_CFG); //对 GPIO,7、8、9 引脚设置为 ADC 检测引脚
while(1)
{
//打印当前供电电压
log_debug("battery = %f\n", adc_battery_voltage_read(NULL));
//获取GPIO 7 上的 ADC 值
ret = adc_battery_voltage_read_by_single_pin(ADC_CHANNEL_EXTERN_CH7, ADC_PGA_GAIN_0P125, NULL, 10);
log_debug("single battery = %f\n", ret);
//获取GPIO 8、9 上的 ADC 差值
ret = adc_battery_voltage_read_by_dif_pin(ADC_CHANNEL_EXTERN_CH0,
ADC_CHANNEL_EXTERN_CH1,
ADC_PGA_GAIN_0P125,
NULL,
10);
log_debug("diff battery = %f\n", ret);
co_delay_ms(500);
}
}