STM32的ADC采样(非DMA方式)

例如,每隔30ms读取4个AD口的数值,官方的例程只给出ADC+DMA的方式,这里采用非DMA方式。

先配置IO口:

GPIO_InitTypeDef gpioInitStruct;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;

gpioInitStruct.GPIO_Pin = GPIO_Pin_3;
gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &gpioInitStruct);

gpioInitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &gpioInitStruct);

配置ADC:
将ADC配置成非扫描方式(就是每次处理时不会扫描本组内的所有端口),因为采用规则组时只有一个寄存器保存adc结果;单次模式。

ADC_InitTypeDef adcInitStruct;
adcInitStruct.ADC_Mode = ADC_Mode_Independent;
adcInitStruct.ADC_ScanConvMode = DISABLE;
adcInitStruct.ADC_ContinuousConvMode = DISABLE;
adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;
adcInitStruct.ADC_NbrOfChannel = 1;

ADC自校验:

timeOut = 10000;
ADC_ResetCalibration(ADC1);
while((ADC_GetResetCalibrationStatus(ADC1)) && (timeOut--));

timeOut = 10000;
ADC_StartCalibration(ADC1);
while((ADC_GetCalibrationStatus(ADC1)) && (timeOut--));

每次扫描时调用函数:

void sysGetAdcResult(void)
{
u8 i;

for(i=0; i<4; i++)
{
_adcResult[i] = 0x0FFF;

switch (i)
{
case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_239Cycles5); break;
case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5); break;
case 2: ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5); break;
case 3: ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_239Cycles5); break;
}
// 必须先调用ADC_Cmd()

ADC_Cmd(ADC1, ENABLE);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

// 需要等待一段时间
sysDelay(200);
_adcResult[i] = ADC_GetConversionValue(ADC1);

ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
ADC_TempSensorVrefintCmd(DISABLE);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
ADC_Cmd(ADC1, DISABLE);
}
}



相关主题
相关文档
最新文档