先讲下目的:
三个通道分别采集不同项目,同一时刻,可能工作一个通道、两个通道或者三个通道。
大牛看下程序:
配置部分:
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的朋友,帮忙看看,不胜感激!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>