查看: 1000|回复: 1

请教ADC转换的问题

[复制链接]

1

主题

1

帖子

275

积分

高级工程师

Rank: 3Rank: 3

积分
275
发表于 2023-6-6 11:47:56 | 显示全部楼层 |阅读模式
在LG0的例程中,计算ADC的值为什么是这样的    GetChannelVoltage = ((uint64_t)DMAResult[0] * ADC_VREF * 3000) / (DMAResult[1] * 4095);
具体代码如下:
uint16_t DMAResult[2];
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[0] * ADC_VREF * 3000) / (DMAResult[1] * 4095);

    return GetChannelVoltage;
}

回复

使用道具 举报

151

主题

845

帖子

4405

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4405
发表于 2023-6-8 09:25:14 | 显示全部楼层
手册ADC章节有介绍,通过内部1.22V,计算当前参考电压,然后通过参考电压,计算当前电压。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表