本文将描述STM32 中的ADC外设实现ADC采样的过程,其中硬件部分的转换就不做过多描述,仅仅对代码部分进行编写。
初始化
对GPIO和ADC进行初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC的时钟配置
GPIO_InitTypeDef GPIO_InitStructure;//初始化结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
ADC_InitTypeDef ADC_InitStructure;//ADC初始化结构体
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//单个ADC工作
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//采用右对齐模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//使用内部触发
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//不连续触发
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//不扫描
ADC_InitStructure.ADC_NbrOfChannel = 1;//扫描通道
ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC
ADC_Cmd(ADC1, ENABLE);//使能ADC
ADC校准
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
获取指定通道的值
这里封装一个函数用于指定通道获取,可以增加代码的复用率
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
使用
最后在需要调用的地方进行函数初始化和调用即可
uint16_t AD0, AD1, AD2, AD3;
int main(void)
{
AD_Init();
while (1)
{
AD0 = AD_GetValue(ADC_Channel_0);//通道1
AD1 = AD_GetValue(ADC_Channel_1);//通道2
AD2 = AD_GetValue(ADC_Channel_2);//通道3
AD3 = AD_GetValue(ADC_Channel_3);//通道4
Delay_ms(100);
}
}