FR801X adc两个测量通道怎么使用?下面这种方式对吗?调整LDO为3.3v了。



  • struct adc_cfg_t cfg;

    // uint16_t result_PD4;
    uint16_t result_PD5=0;
    // uint16_t result_PD6;
    uint16_t result_PD7=0;
    // uint16_t ref_vol_get = 0;
    // uint16_t ref_vol_2900 = 2900;
    uint16_t ref_vol_3300 = 3300;
    // float vbat_vol_PD4;
    float vbat_vol_PD5=0;
    // float vbat_vol_PD6;
    float vbat_vol_PD7=0;
    
    memset((void *)&cfg, 0, sizeof(cfg));
    cfg.src = ADC_TRANS_SOURCE_PAD;
    cfg.ref_sel = ADC_REFERENCE_AVDD; // (2904mV 2.9V)
    cfg.channels = 0x0A;              // 可以四个通道同时使能0x0f
    cfg.route.pad_to_sample = 1;
    cfg.clk_sel = ADC_SAMPLE_CLK_24M_DIV13;
    cfg.clk_div = 0x3f;
    adc_init(&cfg);
    adc_enable(NULL, NULL, 0); //  以中断方式返回结果    还有一种回调方式,需要设置回调函数
    // adc_get_result(ADC_TRANS_SOURCE_PAD, 0x01, &result_PD4); // PD4
    adc_get_result(ADC_TRANS_SOURCE_PAD, 0x02, &result_PD5); // PD5
    // adc_get_result(ADC_TRANS_SOURCE_PAD, 0x04, &result_PD6); // PD6
    adc_get_result(ADC_TRANS_SOURCE_PAD, 0x08, &result_PD7); // PD7
    adc_disable();
    
    // ref_vol_get = adc_get_ref_voltage(ADC_REFERENCE_AVDD); // 注意:该参考电压是对ALDO 2.9v做的校准,如果软件配置ALDO电压改变了,该校准值ref_vol就没有太大参考价值了
    // vbat_vol = (result * ref_vol_get) / 1024.0;            // mV.
    // printf("result: %d, ref_vol_get: %dmV, vbat_vol: %fmv, ", result, ref_vol_get, vbat_vol); // 2904?进行了校准 从29000->2904 ADC_REFERENCE_AVDD
    
    // vbat_vol = (result * ref_vol_2900) / 1024.0; // mV.
    // printf("ref_vol_2900 - > adc_value: %fmV, ", vbat_vol);
    
    vbat_vol_PD5 = (result_PD5 * ref_vol_3300) / 1024.0; // mV.
    vbat_vol_PD7 = (result_PD7 * ref_vol_3300) / 1024.0; // mV.
    printf("ref_3300, vbat_vol_PD5: %fmV, vbat_vol_PD7: %fmV\n", vbat_vol_PD5, vbat_vol_PD7);


  • 多通道采集时,一般在adc_enable之后做个delay,保证采样完成; 比如分频配置0x01,
    clk = 56k/2/15 = 1.86k = 540us左右,两个通道转换完需要1ms以上。



  • @刘流鎏FR801X adc两个测量通道怎么使用?下面这种方式对吗?调整LDO为3.3v了。 中说:
    谢谢。但是我加入 co_delay_100us(100); 还是有些问题,我用一个通道进行测量是准确的,用两个通道测量结果就是不准确的。
    我搭建了一个分压电路,产生1.97v和0.59v,供给两个通道。使用两个通道进行测量结果是:
    ref_vol: 2904, result: 551mV, vol_PD4: 1562.601563mV
    ref_vol: 2904, result: 247mV, vol_PD5: 700.476563mV
    (我将LDO调回2.9v,并配置使用PD4,PD5)



  • @刘流鎏 谢谢。但是我加入 co_delay_100us(100); 还是有些问题,我用一个通道进行测量是准确的,用两个通道测量结果就是不准确的。
    我搭建了一个分压电路,产生1.97v和0.59v,供给两个通道。使用两个通道进行测量结果是:
    ref_vol: 2904, result: 551mV, vol_PD4: 1562.601563mV
    ref_vol: 2904, result: 247mV, vol_PD5: 700.476563mV
    (我将LDO调回2.9v,并配置使用PD4,PD5)



  • @always123FR801X adc两个测量通道怎么使用?下面这种方式对吗?调整LDO为3.3v了。 中说:

    用一个通道进行

    struct adc_cfg_t cfg;
    uint16_t result[2],ref_vol,voltage_vol1,voltage_vol2;
    system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_ADC0);
    system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_ADC1);
    memset((void*)&cfg, 0, sizeof(cfg));
    cfg.src = ADC_TRANS_SOURCE_PAD;
    cfg.ref_sel = ADC_REFERENCE_AVDD;
    cfg.channels = 0x03;
    cfg.route.pad_to_sample = 1;
    cfg.clk_sel = ADC_SAMPLE_CLK_64K_DIV13;FR801xH ADC 使用说明 V0.1
    软件配置 9 / 13
    cfg.clk_div = 0x1f;
    adc_init(&cfg);
    adc_enable(NULL, NULL, 0);
    co_delay_100us(20); // delay 2ms
    adc_get_result(ADC_TRANS_SOURCE_PAD, 0x03, result);
    ref_vol = adc_get_ref_voltage(ADC_REFERENCE_AVDD);
    voltage_vol1 = (result[0] * ref_vol) / 1024;
    voltage_vol2 = (result[1] * ref_vol) / 1024;



  • @刘流鎏 ok, 非常感谢