你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32f030的ADC单通道采集问题

[复制链接]
无帝老三 提问时间:2016-7-4 11:19 /
先讲下目的:
三个通道分别采集不同项目,同一时刻,可能工作一个通道、两个通道或者三个通道。
大牛看下程序:
配置部分:
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的朋友,帮忙看看,不胜感激!


收藏 评论1 发布时间:2016-7-4 11:19

举报

1个回答
五哥1 回答时间:2018-5-2 18:23:48
要有完整的程序才能分析出来,在程序中多加几个断点看看,程序为什么出现了异常。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版