stm32f030的ADC单通道采样问题

2019-08-13 20:13发布

先讲下目的:
三个通道分别采集不同项目,同一时刻,可能工作一个通道、两个通道或者三个通道。
大牛看下程序:
配置部分:
void ADC_Configer(void)
{
    ADC_InitTypeDef  ADC_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    ADC_StructInit(&ADC_InitStruct);
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
    //ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;                      //关闭连续转换模式
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;                      //关闭连续转换模式
    ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward;
    ADC_Init(ADC1,&ADC_InitStruct);

    ADC_GetCalibrationFactor(ADC1);                                          //ADC校准      
    //ADC_StopOfConversion(ADC1);
    ADC_Cmd(ADC1,ENABLE);
}

数据采集部分:
UINT16 getadcvalue(UINT32 ADC_Channel)
{
    UINT16 adcresult = 0;
    UINT16 idx;           
    UINT16 atomizevalue[ADCCONV_NUM];            //采样电流保存数组

    ADC_CHNL_NONE;                                //先把采样通道清0
    ADC_ChannelConfig(ADC1, ADC_Channel, ADC_SampleTime_1_5Cycles);    //单独配置需要采样的通道
   
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADRDY) == DISABLE);
    ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
    ADC_ClearFlag(ADC1, ADC_FLAG_OVR);
    ADC_StartOfConversion(ADC1);
    for(idx = 0;idx < ADCCONV_NUM;idx++)
    {
        while (!(ADC1->ISR & 0x04));
        atomizevalue[idx] = ADC1->DR;
    }
    ADC_StopOfConversion(ADC1);
    adcresult = buffer_avg((void *)atomizevalue);   
    return adcresult;
}
问题描述:
主程序中,实时监测温度变化,定时器中断定时采集另一个,调用的时候根据传入的通道不同采集不同通道数据,
调试中发现,通道数据会发生串位现象,比如温度的AD字很大,突然会出现一个很小的,是由于另一个通道的数据被当做温度采集走了!

有没有熟悉f030的朋友,帮忙看看,不胜感激!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
无帝老三
1楼-- · 2019-08-14 00:36
 精彩回答 2  元偷偷看……
无帝老三
2楼-- · 2019-08-14 00:39
没有路过的大神指点一下吗?
憨厚诚实大叔
3楼-- · 2019-08-14 04:37
我直接用DMA接收的,好像没出现过这情况
机械式teli
4楼-- · 2019-08-14 09:49
你好 我想问一下 从adc通道16读出温度之后 对数据怎么计算处理的呢

一周热门 更多>