yyyyyyyy 发表于 2023-4-21 17:10:53

ADC通道采集

static uint32_t GetVOLSample_POLL(uint32_t channel, uint32_t *ADCRdresult)
{
    uint32_t counter = 0;
    uint32_t EOC_Flag;
    uint8_t State;
    FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV8);                  //配置ADC工作时钟分频
    FL_VREF_EnableVREFBuffer(VREF);                                 //使能VREF BUFFER,
    //为了考虑功耗BUFFER可关闭,从使能到ADC可以正常采样需要100us的建立时间,本例程配置慢速通道较长的采样时间,来保证建立时间满足。
                FL_DelayMs(100);
    FL_ADC_DisableSequencerChannel(ADC, FL_ADC_ALL_CHANNEL);      //清空打开的通道
    FL_ADC_EnableSequencerChannel(ADC, channel);    //通道选择

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

    do
    {
      EOC_Flag = FL_ADC_IsActiveFlag_EndOfConversion(ADC);
      counter++;
    } while((counter != 0xFFFFFFFFU) && (EOC_Flag == 0U));         //等待转换完成

    if(EOC_Flag == 0x01U)
    {
      FL_ADC_ClearFlag_EndOfConversion(ADC);                        //清标志
      *ADCRdresult = FL_ADC_ReadConversionData(ADC);               //获取采样值

      FL_ADC_Disable(ADC);                                          //关闭ADC
      FL_ADC_DisableSequencerChannel(ADC, channel); //通道关闭
      FL_VREF_DisableVREFBuffer(VREF);                              //关闭VREF BUFFER
      State = 0;
    }
    else
    {
      State = 1 ;
    }

    return State;
}
GetTSample_State = GetVOLSample_POLL(FL_ADC_INTERNAL_TS, &GetTSSample);
为什么这样用采集到的数据与例程里面的不一样啊:dizzy:
以下是例程:
GetTSample_State = GetTSSample_POLL(&GetTSSample);
static uint32_t GetTSSample_POLL(uint32_t *ADCRdresult)
{
    uint32_t counter = 0;
    uint32_t EOC_Flag;
    uint8_t State;

    FL_RCC_SetADCPrescaler(FL_RCC_ADC_PSC_DIV8);                  //配置ADC工作时钟分频
    FL_VREF_EnableVPTATBuffer(VREF);                              //使能PTATBUFFER
    //为了考虑功耗BUFFER可关闭,从使能到ADC可以正常采样需要100us的建立时间,本例程配置慢速通道较长的采样时间,来保证建立时间满足。
    FL_ADC_DisableSequencerChannel(ADC, FL_ADC_ALL_CHANNEL);      //清空打开的通道
    FL_ADC_EnableSequencerChannel(ADC, FL_ADC_INTERNAL_TS);       //通道选择

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

    do
    {
      EOC_Flag = FL_ADC_IsActiveFlag_EndOfConversion(ADC);
      counter++;
    } while((counter != 0xFFFFFFFFU) && (EOC_Flag == 0U));         //等待转换完成

    if(EOC_Flag == 0x01U)
    {
      FL_ADC_ClearFlag_EndOfConversion(ADC);                      //清标志
      *ADCRdresult = FL_ADC_ReadConversionData(ADC);               //获取采样值

      FL_ADC_Disable(ADC);                                        //关闭ADC
      FL_ADC_DisableSequencerChannel(ADC, FL_ADC_INTERNAL_TS);    //通道关闭
      State = 0;
    }
    else
    {
      State = 1 ;
    }

    return State;
}

yyyyyyyy 发表于 2023-4-21 17:49:50

用DMA也会出现这种情况,但是AVREF不受影响。。。。

顾博文 发表于 2023-4-25 16:43:41

yyyyyyyy 发表于 2023-4-21 17:49
用DMA也会出现这种情况,但是AVREF不受影响。。。。

一个是采集电压通道,一个是采集温度通道。不是同一个通道。你怎么做的比较。

yyyyyyyy 发表于 2023-4-25 20:34:55

顾博文 发表于 2023-4-25 16:43
一个是采集电压通道,一个是采集温度通道。不是同一个通道。你怎么做的比较。...

就是用上面两种方式分别对TS与AVREF两个通道进行采集,结果AVREF用两种方式得到的值是一样的,但是TS不一样

顾博文 发表于 2023-5-4 08:46:02

yyyyyyyy 发表于 2023-4-25 20:34
就是用上面两种方式分别对TS与AVREF两个通道进行采集,结果AVREF用两种方式得到的值是一样的,但是TS不一 ...

你是不是 ms_config.c 里的adc初始化配置不一样。 例程的算出温度对不对,如果对就按例程去配。例程的主频是8M,你如果跑高速,adc的预分频按比例加。
页: [1]
查看完整版本: ADC通道采集