stm32 ADC学习

一、ADC模数转换器

1)ADC基础知识

  • ADC (Analog-Digital Converter)模拟-数字转换器可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  • 拥有12位逐次逼近型ADC,1us转换时间
  • 输入电压范围03.3V,转换结果04095
  • 拥有18个输入通道,可测量16个外部和2个内部信号源
  • 拥有规则组和注入组两个转换单元
  • 拥有模拟看门狗自动检测输入电压范围
  • STM32F103C8T6的ADC资源:ADC1,ADC2,10个外部通道

在这里插入图片描述
在这里插入图片描述
图1-2 ADC基础结构

  • 了解双ADC模式,转换和扫描模式,数据对齐(一般右对齐)

在这里插入图片描述图3 ADC转换模式

在这里插入图片描述
图4 数据对齐方式

2)ADC转换

  • ADC转换的步骤:采样,保持,量化,编码
  • ADC的总转换时间 = 采样时间 + 12.5个ADC周期
  • 当ADCCLK=14MHz时,采样时间为1.5个ADC周期,也就是1us
  • ADC有一个内置校准模式,建议每次上电之后进行一次校准

在这里插入图片描述
图5 硬件电路

二、DMA直接存储器访问

1)DMA基础知识

  • DMA(Direct Memory Access) 直接存储器存取
  • 可以提供外设存储器或两存储器之间的高速传输,无需CPU干预
  • 拥有12个独立可配置通道DMA1有七个,DMA2有五个,每个通道都支持软件触发和特定的硬件触发
  • STM32F103C8T6的DMA资源只有DMA1七个

在这里插入图片描述
图5 DMA基本结构

2)存储器映像

  • ROM是只读存储器,一般从RAM中存取数据

在这里插入图片描述
图6存储器映像

三、实验

1)AD单通道

常用函数:

// 初始化ADC
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
// 四个ADC校准函数
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
// 配置ADC通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); //填充菜单
// 获取AD值
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
ADC_GetConversionValue(ADC1);

在这里插入图片描述

2)AD多通道

在这里插入图片描述

3)DMA数据转运

常用函数
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); //恢复缺省配置
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); //初始化
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); //初始化
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); //启动
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); //配置中断
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //DMA设置当前寄存器
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); //DMA获取当前寄存器
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); //标志位
void DMA_ClearFlag(uint32_t DMAy_FLAG);
ITStatus DMA_GetITStatus(uint32_t DMAy_IT); //中断
void DMA_ClearITPendingBit(uint32_t DMAy_IT);

在这里插入图片描述

4)DMA+AD多通道

常用代码:

ADC_DMACmd(ADC1, ENABLE);

在这里插入图片描述

附学习参考网址

  1. STM32入门教程-2023版 细致讲解 中文字幕
  2. 黄卫伟:管理的最高境界是无为而治,无为而治本质是实现政策治理
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐