0

我想将 ADC 中的一堆 uint16_t 值转换为浮点电压。

为此,我使用 for 循环遍历 uint16_t 数组并将值写入浮点数组。

但是 float 数组保持为 0,就好像没有进行任何分配一样。在 for 循环之外,转换工作。

当我使用调试器单步执行程序时,我看到了合理的浮点值,但它们最终并没有被写入数组。为什么?

临时浮点值显然是 1.847: 显然是 1.847

临时数组索引显然是 0显然是 0

所以我希望 adc_voltages[0] 为 1.847,但事实并非如此: 它不是

代码:

全局变量:

volatile uint16_t adc_dma_buffer[SG_MK2_ADC1_CHANNELS * SG_MK2_ADC1_N_SAMPLES];
float adc_voltages[SG_MK2_ADC1_CHANNELS * SG_MK2_ADC1_N_SAMPLES];

稍后在 main() 中:

float temp = 0.0f;
    uint8_t index = 0;
    for(uint8_t i=0; i<8; i++){
        temp = BSP_convU1(adc_dma_buffer[i*SG_MK2_ADC1_CHANNELS+0]);
        index = i*SG_MK2_ADC1_CHANNELS+0;
        adc_voltages[index] = temp; // BSP_convU1(adc_dma_buffer[i*SG_MK2_ADC1_CHANNELS+0]);
        adc_voltages[i*SG_MK2_ADC1_CHANNELS+1] = BSP_convU2(adc_dma_buffer[i*SG_MK2_ADC1_CHANNELS+1]);
        adc_voltages[i*SG_MK2_ADC1_CHANNELS+2] = BSP_convU3(adc_dma_buffer[i*SG_MK2_ADC1_CHANNELS+2]);
        adc_voltages[i*SG_MK2_ADC1_CHANNELS+3] = BSP_internalTemperature(adc_dma_buffer[i*SG_MK2_ADC1_CHANNELS+3]);
    }

函数返回浮点数的地方:

float BSP_convU1(uint32_t adc_val){
    float adc_vsense = SG_MK2_ADC_VREF/4096.0f * (float)adc_val;
    return adc_vsense * BSP_CONV_U1_FACTOR + BSP_CAL_U1_OFFSET;
}

编辑:

感谢您从现在开始使用的所有评论和良好实践提示。特别是使用二维数组。我只是能够解决这个问题。我仍然不确定为什么会这样。“在循环外工作”也不正确,它只有在BSP_conv_I_MPPT()直接在 printf 语句内评估时才有效。

无论如何,下面的二维数组代码现在可以工作了。

if(flag_SDADC_cplt){
    flag_SDADC_cplt=0;
    for(int i=0; i<SG_MK2_SDADC1_N_SAMPLES; i++){
        adc_currents[i][0] = BSP_conv_I_Boost (sdadc_dma_buffer[i][0]);
        adc_currents[i][1] = BSP_conv_I_MPPT  (sdadc_dma_buffer[i][1]);
        adc_currents[i][2] = BSP_conv_I_Solar (sdadc_dma_buffer[i][2]);
        // order: adc[sample][channel]
    }
    printf("DCDC\tMPPT\tPV\n");
    printf("%.3fA\t%.3fA\t%.3fA\n", adc_currents[0][0], adc_currents[1][0], adc_currents[2][0]); // order[channel][sample]
}

if(flag_ADC_cplt){
    flag_ADC_cplt = 0;
    for(int i=0; i<SG_MK2_ADC1_N_SAMPLES; i++){
        adc_voltages[i][0] = BSP_convU1(adc_dma_buffer[i][0]);
        adc_voltages[i][1] = BSP_convU2(adc_dma_buffer[i][1]);
        adc_voltages[i][2] = BSP_convU3(adc_dma_buffer[i][2]);
        adc_voltages[i][3] = BSP_internalTemperature(adc_dma_buffer[i][3]);
    }
    printf("\nPV\tCAN\tBat\tTemp\n");
    printf("%.2fV\t%.2fV\t%.2fV\t%.1fC\n", adc_voltages[0][0], adc_voltages[0][1], adc_voltages[0][2], adc_voltages[0][3]);
}
4

0 回答 0