最近学习完了STM32系列单片机,所以准备对所学习的知识进行总结,以便以后查阅。
文章的单片机以
MCU:STM32F103C8T6
标准准库:V3.5.0
开发环境:Keil5
一、ADC介绍
- STM32内部集成ADC转换器,分辨率最高为12位,一种逐次逼近型模拟数字转换器。各通道的A/D转换可以单次、连续、扫描或间断模式执行。
- ADC通道分组,STM32有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。
我一般情况下使用规则组,STM32的引脚只能输入0~3.3V的电压,所以在采样高电压时要做好高低压的隔离。ADC的时钟频率最高为14MHZ。
二、ADC使用
在使用ADC之前除了初始化ADC所对应的IO口以外,还需要配置ADC结构体的相关参数。下面是对ADC初始化结构体的成员描述。
typedef struct
{
uint32_t ADC_Mode; //设置 ADC 工作在独立或者双 ADC 模式
FunctionalState ADC_ScanConvMode; //规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式
FunctionalState ADC_ContinuousConvMode; //规定了模数转换工作在连续还是单次模式
uint32_t ADC_ExternalTrigConv; //定义了使用外部触发来启动规则通道的模数转换
uint32_t ADC_DataAlign; //规定了 ADC 数据向左边对齐还是向右边对齐
uint8_t ADC_NbrOfChannel; //规定了顺序进行规则转换的 ADC 通道的数目
}ADC_InitTypeDef;
初始化流程
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//六分频 72/6 = 12MHZ
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
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_Cmd(ADC1, ENABLE); // 开启adc1
// 校准adc
ADC_ResetCalibration(ADC1); // 复位校准
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1); // 开始校准
while (ADC_GetCalibrationStatus(ADC1) == SET);
}
/* 获取ADC的值*/
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始转换
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 规则组 转换标志位获取
return ADC_GetConversionValue(ADC1); //获取转换结果
}