先讲下目的: 三个通道分别采集不同项目,同一时刻,可能工作一个通道、两个通道或者三个通道。 大牛看下程序: 配置部分: 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的朋友,帮忙看看,不胜感激! |
要有完整的程序才能分析出来,在程序中多加几个断点看看,程序为什么出现了异常。 |