跳转至

ADC 模数转换器

ADC简介

ADC (Analog-Digital Conerter) 模拟-数字转换器

 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。

  • 12位逐次逼近型ADC,1us转换时间。
  • 输入电压范围:0~3.3V,转换结果范围:0~4095。
  • 18个输入通道,可测量16个外部和2个内部信号源。
  • 规则组和注入组两个转换单元。
  • 模拟看门狗自动监测输入电压范围
STM32F103C8T6 ADC资源

ADC1,ADC2,10个外部输入通道。

  • AD转换的步骤:采样、保持、量化、编码。

STM32初始化ADC

开启RCC时钟

开启ADCGPIO的时钟。

并且配置ADCCLK预分频器。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //六分频

配置GPIO

将需要使用的GPIO口配置为模拟输入的模式。

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;   //模拟输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_x;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOx,&GPIO_InitStructure);

配置多路开关

将GPIO通道接入到AD转换器的规则组列表中

ADC_RegularChannelConfig(ADCx,);

ADC_RegularChannelConfig函数的参数取值

选择使用的ADC通道

可以选择如下17个通道:

  • ADC_Channel_0
  • ADC_Channel_1
  • ADC_Channel_2
  • ADC_Channel_3
  • ADC_Channel_4
  • ADC_Channel_5
  • ADC_Channel_6
  • ADC_Channel_7
  • ADC_Channel_8
  • ADC_Channel_9
  • ADC_Channel_10
  • ADC_Channel_11
  • ADC_Channel_12
  • ADC_Channel_13
  • ADC_Channel_14
  • ADC_Channel_15
  • ADC_Channel_16
  • ADC_Channel_17

用以配置规则组中16个序列

一共可以选择如下值,其中值越小采样速度越快。

  • ADC_SampleTime_1Cycles5
  • ADC_SampleTime_7Cycles5
  • ADC_SampleTime_13Cycles5
  • ADC_SampleTime_28Cycles5
  • ADC_SampleTime_41Cycles5
  • ADC_SampleTime_55Cycles5
  • ADC_SampleTime_71Cycles5
  • ADC_SampleTime_239Cycles5

配置ADC转换器

ADC_InitTypeDef ADC_InitStructure;
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(ADCx,&ADC_InitStructure);

ADC初始化结构体

配置ADC工作模式。

  • 独立模式:ADC_Mode_Independent

双ADC模式:

  • ADC_Mode_RegInjecSimult
  • ADC_Mode_RegSimult_AlterTrig
  • ADC_Mode_InjecSimult_FastInterl
  • ADC_Mode_InjecSimult_SlowInterl
  • ADC_Mode_InjecSimult
  • ADC_Mode_RegSimult
  • ADC_Mode_FastInterl
  • ADC_Mode_SlowInterl
  • ADC_Mode_AlterTrig

数据对齐方式。

  • 右对齐:ADC_DataAlign_Right
  • 左对齐:ADC_DataAlign_Left

外部触发转换选择,选择触发控制的触发源。

不使用外部触发,也就是内部软件触发。 * ADC_ExternalTrigConv_None

其它触发源待完善。

连续转换模式,选择连续转换或者单次转换。

  • 连续模式:ENABLE
  • 单次模式:DISABLE

扫描转换模式,选择扫描模式或者非扫描模式。

  • 扫描模式:ENABLE
  • 非扫描模式:DISABLE

通道数目,用于指定在扫描模式下,总共会用到几个通道。

  • 这个参数必须在1~16之间

开启ADC

ADC_Cmd(ADCx,ENABLE);

使用ADC

校准ADC

ADC_ResetCalibration(ADCx); //复位校准
while (ADC_GetResetCalibrationStatus(ADCx) == SET){;    //等待复位校准完毕
}

ADC_StartCalibration(ADCx); //开始校准
while (ADC_GetCalibrationStatus(ADCx) == SET){; //等待开始校准完毕
}

ADC软件开始转换控制

触发转换

软件触发转换。

ADC_SoftwareStartConvCmd(ADCx,ENABLE);

等待转换完成

等待EOC标志位置1

while (ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC) == RESET){
}

转换完成标志位的几种选择

看门狗标志位。

EOC,规则组转换完成标志位。

JEOC,注入组转换完成标志位。

JSRT,注入组开始转换标志位。

STRT,规则组开始转换标志位。

获取ADC转换值

ADC_GetConversionValue(ADCx);

读取ADC数据寄存器