stm32 ADC 简介

ADC通道与GPIO对应表(图片来自整点原子STM32F1开发指南库函数版本)

Stm32 ADC学习-LMLPHP


规则通道组注入通道组

所谓规则通道组和注入通道组其实应该就是通道的分组吧,按照OOP的思想来理解,通道组是一个基类,注入通道组和规则通道组派生自通道组这个基类,通道组这个基类中包含了一个保存各个通道的数组.

为什么要对通道进行分组呢,这个有待深究,以后再说.


ADC相关的寄存器

ADC_CR1

各个位描述如下图:

Stm32 ADC学习-LMLPHP

  • scan位:

    设置扫描模式,1为使用扫描模式,0则关闭.扫描模式下,有ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换,此时如果设置了EOCIE或JEOCIE,则只有在最后一个通道转换完毕后才会产生EOC或JEOC中断
  • DUALMOD位:

    设置ADC的操作模式,详细的看下面的来自<<stm32中文参考手册>>截图

    Stm32 ADC学习-LMLPHP

ADC_CR2

各个位描述如下图:

Stm32 ADC学习-LMLPHP

  • ADON位:用于开关AD转换器
  • CONT位:用于设置是否进行连续转换,使用单次转换CONT位必须设置为0.
  • EXTSEL[2:0]:用于选择启动规则转换组转换的外部事件

    Stm32 ADC学习-LMLPHP

    如果需要使用软件触发,就将这三个位设置为 111

ADC采样事件寄存器(ADC_SMPR1和ADC_SMPR2)

各个位描述如下图:

Stm32 ADC学习-LMLPHP

Stm32 ADC学习-LMLPHP

ADC规则序列寄存器(ADC_SQR1~3)

Stm32 ADC学习-LMLPHP

  • L[3:0]:用于存储规则序列的长度

ADC数据寄存器(ADC_DR)

这个没什么好说的,用来存放AD转换后的结果

ADC状态寄存器(ADC_SR)

Stm32 ADC学习-LMLPHP


通过库函数配置ADC1通道1进行AD转换

查看手册可以知道ADC1通道1对应着PA1,如下图

Stm32 ADC学习-LMLPHP



1.外设使能

  • STM32F103ZET6的ADC通道1在PA1上所以我们先要使能 PORTA的时钟 和 ADC1时钟,然后设置 PA1为模拟输入.

2.复位ADC1,同时设置ADC1的分频因子

  • 开启了ADC1的时钟后,要复位ADC1,将ADC1的全部寄存器重设位缺省值,然后通过RCC_CFGR设置ADC1的分频因子,并且分频因子要确保ADC1的时钟不超过14MHz!

    //ADC复位 ADC_DeInit();

    RCC_ADCCLKConfig(RCC_PCLK2_DIV6); //设置分配因子的库函数

3.初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息.

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);// ADC初始化

4.使能ADC并校准

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); //使能指定的ADC

void ADC_ResetCalibration(ADC_TypeDef* ADCx);//复位校准

while(ADC_GetResetCalibrationStatus(ADCx));//等待复位校准结束

void ADC_StartCalibration(ADC_TypeDef* ADCx);//执行ADC校准

while(ADC_GetCalibrationStatus(ADCx));//等待AD校准结束

5.设置规则序列1里面的通道,读取ADC的值

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); //设置规则序列通道以及采样周期

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//允许软件开启ADC转换

while(!ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC));//等待转换结束

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);//获取转 换结果数据

MDK5中实现代码

  • 配置stm32f103库函数编程环境,我用的是正点原子的那一套,不多记录了;

  • ADC1_Init() 函数

  • ADC_GetConvValue()

  • ADC_GetAverageConvValue()

  • ADC_SampleValue2ReadableValue()

  • main.c文件代码

  • 在main.c中使用的 USART_WriteLine(const char*str,...)函数 是我自己封装的串口函数,也可以使用正点原子 System文件夹 下提供的printf()函数;

总结库函数配置ADC的步骤

  </div>
05-11 22:12