您的位置:首页 > 其它

ADC多通道逐次转换(不用DMA)

2017-12-07 18:16 323 查看
之前看到一篇文章【STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)】原博主用的是规则组间断模式,但是我参考他的例程自己读取出来的结果每次都只有最后一通道的值,原因暂时不明。

因为我用的通道不多,就用了一个比较笨的方法。

ADC配置如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

ADC_DeInit(ADC1);

/* ADC1 configuration ----------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

切换并使能ADC通道的函数如下:

void ADC_Time(void)
{
if(++AdcTime > 10)
{
AdcTime = 0;
Adc1Flag =~AdcFlag;

if(Adc1Flag)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_41Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
else
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_41Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
}
}


读取数据在中断子程序中完成:

void ADC_Handler(void)
{
if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == SET)
{
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);

if(Adc1Flag)
{
Value1=ADC_GetConversionValue(ADC1);
AdcOverFlag1 = 1;
}
else
{
Value2=ADC_GetConversionValue(ADC1);
AdcOverFlag2 = 1;
}
}
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: