Page 1 of 1

【求助】BK3431-SDK的ADC读取不准

Posted: 2023年 Apr 21日 08:42
by jasen

adc_init初始化后,adc_get_value取值,ADC读取不准,偏大很多


Re: 【求助】BK3431-SDK的ADC读取不准

Posted: 2023年 Apr 21日 10:52
by it_xh

您好。BK3431Q芯片平台的ADC是10位的,采样范围在 init_analog_xvr_reg() 函数中配置。
我们提供的sdk已根据不同版本芯片(D/G版本)设定不同的采样范围,关系如下:
对于D版本芯片,0x00对应的是0V,0x3FF对应1.2V;
对于G版本芯片,0x00对应的是0V,0x3FF对应1.0V;


对应的换算,通过adc_ger_value读取adc值后,通过下面的公式换算成Vadc值。
D版本:Vadc=(1.2 * adc ) / 1023,单位:v
G版本:Vadc=(1.0 * adc) / 1023,单位:v
此时可用Vadc与用工具测量测点电压值比较下是否存在误差。


如外部电路有对应分压,按比例再换算成最终值。


Re: 【求助】BK3431-SDK的ADC读取不准

Posted: 2023年 Apr 21日 19:32
by it_xh

抱歉,经查adc_get_value这个函数,有个地方不对(对adc结果多做了移位操作),调整成如下即可:

Code: Select all

uint16_t adc_get_value(void)
{
    uint16_t adc_cnt;
    adc_cnt=0;
    adc_flag =0;
    REG_APB7_ADC_CFG |= SET_ADC_EN+(0x01 << BIT_ADC_MODE );
    
while (!adc_flag) { adc_cnt++; if(adc_cnt>300) { //UART_PRINTF("g_adc_value_timeout\r\n"); break; } Delay_us(10); } if(adc_flag==1) { g_adc_value=(REG_APB7_ADC_DAT); //UART_PRINTF("g_adc_value=%x\r\n",g_adc_value); } REG_APB7_ADC_CFG &= ~(SET_ADC_EN+(0x03 << BIT_ADC_MODE )); //ADC值读取完成后必须把使能位清除 return g_adc_value; }