MOTORTANK 发表于 2023-6-25 18:16:58

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

如题,近日想用LPTIM结合ADC,令LPTIM每0.5ms进入一次中断,并在每次中断中进行一次ADC的采样处理,0.5ms中断是形成了,但发现一旦加入了bsp_adc_get_poll(FL_ADC_EXTERNAL_CH4);这个函数,中断的时间就不再是0.5ms,变成大概30ms进一次中断了。想问问各位朋友有可能是那些地方出了问题,是不是因为内部处理过慢导致的异常?
下图是ADC的初始化代码


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的转换的吧。

顾博文 发表于 2023-7-3 08:36:13

你那个delay 1ms 不能加,一开始如果没有检测到转换完成, 不就需要等1ms了么。最新例程等待1us

MOTORTANK 发表于 2023-7-3 15:21:04

顾博文 发表于 2023-7-3 08:36
你那个delay 1ms 不能加,一开始如果没有检测到转换完成, 不就需要等1ms了么。最新例程等待1us
...

好的!十分感谢!犯了低级错误
页: [1]
查看完整版本: 【ADC】ADC转换速率太慢了,没办法在0.5ms内完成ADC转换