查看: 4532|回复: 4

ADC通道采集

[复制链接]

2

主题

4

帖子

58

积分

中级工程师

Rank: 2

积分
58
发表于 2023-4-21 17:10:53 | 显示全部楼层 |阅读模式
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);
为什么这样用采集到的数据与例程里面的不一样啊
以下是例程:
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;
}

回复

使用道具 举报

2

主题

4

帖子

58

积分

中级工程师

Rank: 2

积分
58
 楼主| 发表于 2023-4-21 17:49:50 | 显示全部楼层
用DMA也会出现这种情况,但是AVREF不受影响。。。。
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2023-4-25 16:43:41 | 显示全部楼层
yyyyyyyy 发表于 2023-4-21 17:49
用DMA也会出现这种情况,但是AVREF不受影响。。。。

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

使用道具 举报

2

主题

4

帖子

58

积分

中级工程师

Rank: 2

积分
58
 楼主| 发表于 2023-4-25 20:34:55 | 显示全部楼层
顾博文 发表于 2023-4-25 16:43
一个是采集电压通道,一个是采集温度通道。不是同一个通道。你怎么做的比较。  ...

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

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2023-5-4 08:46:02 | 显示全部楼层
yyyyyyyy 发表于 2023-4-25 20:34
就是用上面两种方式分别对TS与AVREF两个通道进行采集,结果AVREF用两种方式得到的值是一样的,但是TS不一 ...

你是不是 ms_config.c 里的adc初始化配置不一样。 例程的算出温度对不对,如果对就按例程去配。例程的主频是8M,你如果跑高速,adc的预分频按比例加。
回复

使用道具 举报

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

本版积分规则

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