starck 发表于 2023-6-6 11:47:56

请教ADC转换的问题

在LG0的例程中,计算ADC的值为什么是这样的    GetChannelVoltage = ((uint64_t)DMAResult * ADC_VREF * 3000) / (DMAResult * 4095);
具体代码如下:
uint16_t DMAResult;
void GetDMAChannelSample(uint32_t channel)
{
    FL_VREF_EnableVREFBuffer(VREF);//使能VREF BUFFER
    FL_ADC_DisableSequencerChannel(ADC, FL_ADC_ALL_CHANNEL);//清空打开的通道
    FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2);//通道选择VREF
    FL_ADC_EnableSequencerChannel(ADC, channel);//通道选择ADC_1
    ADC_DMA(DMAResult, 2);

    FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
    FL_ADC_Enable(ADC);      // 启动ADC
    FL_ADC_EnableSWConversion(ADC);// 开始转换

    // 等待转换完成
    while(!FL_DMA_IsActiveFlag_TransferComplete(DMA, FL_DMA_CHANNEL_0));

    FL_DMA_ClearFlag_TransferComplete(DMA, FL_DMA_CHANNEL_0);

    FL_ADC_Disable(ADC);    // 关闭ADC
    FL_ADC_DisableSequencerChannel(ADC, channel);//通道关闭ADC_1
    FL_ADC_DisableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2);//通道关闭VREF
    FL_VREF_DisableVREFBuffer(VREF);//关闭VREF BUFFER
    // 转换结果
}

uint32_t GetSingleChannelVoltage_DMA(uint32_t channel)
{
    uint32_t GetChannelVoltage;
    GetDMAChannelSample(channel);
    GetChannelVoltage = ((uint64_t)DMAResult * ADC_VREF * 3000) / (DMAResult * 4095);

    return GetChannelVoltage;
}

顾博文 发表于 2023-6-8 09:25:14

手册ADC章节有介绍,通过内部1.22V,计算当前参考电压,然后通过参考电压,计算当前电压。
页: [1]
查看完整版本: 请教ADC转换的问题