查看: 2620|回复: 2

【ADC】ADC转换速率太慢了,没办法在0.5ms内完成ADC转换

[复制链接]

1

主题

2

帖子

47

积分

初级工程师

Rank: 1

积分
47
发表于 2023-6-25 18:16:58 | 显示全部楼层 |阅读模式
如题,近日想用LPTIM结合ADC,令LPTIM每0.5ms进入一次中断,并在每次中断中进行一次ADC的采样处理,0.5ms中断是形成了,但发现一旦加入了bsp_adc_get_poll(FL_ADC_EXTERNAL_CH4);这个函数,中断的时间就不再是0.5ms,变成大概30ms进一次中断了。想问问各位朋友有可能是那些地方出了问题,是不是因为内部处理过慢导致的异常?
下图是ADC的初始化代码
1.png

ADC转换部分代码是借鉴了站内大佬的:
static uint32_t bsp_get_vref(void)
{
                uint16_t adc_result;
    uint8_t i = 0;
    FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV8);
    FL_VREF_EnableVREFBuffer(VREF);//使能VREF BUFFER
    FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_VREF1P2);//通道选择VREF
       
                FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
    FL_ADC_Enable(ADC);      // 启动ADC
    FL_ADC_EnableSWConversion(ADC);  // 开始转换
       
        // 等待转换完成
    while(FL_ADC_IsActiveFlag_EndOfConversion(ADC) == FL_RESET)
    {
        if(i >= 5)
        {
            break;
        }

        i++;
        FL_DelayMs(1);
    }
       
                FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
    adc_result = FL_ADC_ReadConversionData(ADC); //获取采样值

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

static uint32_t bsp_get_channel_poll(uint32_t channel)
{
    uint16_t adc_result;
    uint8_t i = 0;
    FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV1);
    FL_ADC_EnableSequencerChannel(ADC, channel);//通道选择

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

    // 等待转换完成
    while(FL_ADC_IsActiveFlag_EndOfConversion(ADC) == FL_RESET)
    {
        if(i >= 5)
        {
            break;
        }

        i++;
        FL_DelayMs(1);
    }

    FL_ADC_ClearFlag_EndOfConversion(ADC);//清标志
    adc_result = FL_ADC_ReadConversionData(ADC); //获取采样值

    FL_ADC_Disable(ADC);    // 关闭ADC
    FL_ADC_DisableSequencerChannel(ADC, channel);//通道
    // 转换结果
    return adc_result;
}

uint32_t bsp_adc_get_poll(uint32_t channel)
{
    uint32_t vrefint_data, adc_voltage;
    uint64_t adc_data;
                //uint32_t adc_voltage;

//    if(vrefint_data == 0)
//                {
//                        vrefint_data = bsp_get_vref();
//                }
                vrefint_data = bsp_get_vref();
    adc_data = bsp_get_channel_poll(channel);
    adc_voltage = (adc_data * 3000 * (VREFINT_CAL)) / (vrefint_data * 4095);
    // 转换结果
    return adc_voltage;
}


烦请各位好心人帮帮小菜鸟吧~真的很急着解决这个问题。私以为,肯定还是本人代码上有纰漏,不至于在0.5ms之内没办法完成一次ADC的转换的吧。
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2023-7-3 08:36:13 | 显示全部楼层
你那个delay 1ms 不能加,一开始如果没有检测到转换完成, 不就需要等1ms了么。最新例程等待1us
回复

使用道具 举报

1

主题

2

帖子

47

积分

初级工程师

Rank: 1

积分
47
 楼主| 发表于 2023-7-3 15:21:04 | 显示全部楼层
顾博文 发表于 2023-7-3 08:36
你那个delay 1ms 不能加,一开始如果没有检测到转换完成, 不就需要等1ms了么。最新例程等待1us
...

好的!十分感谢!犯了低级错误
回复

使用道具 举报

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

本版积分规则

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