介绍:
STM32系列中ADC为12位逐次逼近型模拟数字转换器,最大转换显示数字范围4096,线性对应输入的电压,可以测量16个外部通道以及2个内部通道,输入时钟不能超过14Mhz,一般采用6分频即采用12Mhz时钟频率。
ADC可以采用软件进行触发,也可以采用硬件触发(来自定时器、外部中断触发),工作模式有单次模式、扫描模式,连续模式、间断模式,转换单元有规则组以及注入组模式,同时可以模拟看门狗事件,在转换完成均产生标志位可以连接至NVIC进行产生中断。
规则组是常规转换单元,可以配置16个序列通道(外部或者内部),转换结果均存在数据寄存器DR低十六位中,会进行覆盖,一般与DMA配合使用。注入组一般用于执行高优先级任务,最多执行4通道,每个通道有单独寄存器。可以由外部事件触发,可以产生中断,两者可以同时工作,规则组转换期间产生注入触发,将暂停规则组转换,待注入组转换完成在继续。
工作模式:
规则组工作模式可以分为单次、扫描,间断、连续工作模式,单次、间断模式仅在序列一中填入通道,转换一次结束,单词连续模式连续对序列1进行转换工作,输出到DR寄存器中,扫描间断模式对n个序列中通道进行扫描,会数据覆盖,配合DMA使用进行转运,到最后一个填写的通道结束,扫描连续模式则该次转换完成后继续转换。
运行流程:
1:开启时钟,GPIO(模拟输入),ADC时钟,配置时钟(12Mhz)
2:配置ADC通道,需要哪些通道在序列几进行配置
3:初始化:选择工作模式(独立,双ADC),是否连续扫描,是否连续转换,软件还是硬件触发,数据对齐,选中的通道数目是多少。
4:其他需求:中断等
5:开启ADC
6:校准:固定方法:
复位校准
复位校准完成(while等待完成==set)
开始校准
等待校准完成(while等待完成==set)
7:软件触发的话需要使用库函数进行触发
相关库函数:
RCC_ADCCLKConfig:ADC时钟配置
ADC_Init:
mode:选择独立模式independence还是双ADC模式
dataalign:数据对齐右对齐
ADC_ExternalTrigConv:外部触发源选择:None就是选择内部软件触发
ADC_NbrOfChannel:本次需要转换的通道数目是多少个
ADC_ScanConvMode:单次连续扫描模式
ADC_ContinuousConvMode:连续转换模式
ADC_RegularChannelConfig(通道设置,在序列几写入通道几,需要几个复制几个函数)
ADC_DMACmd:使用DMA输出数据时需要用这个开启
ADC_ITConfig:通往NVIC
ADC_SoftwareStartConvCmd:软件触发开启开关,执行该命令开始转换,cmd为上电命令
ADC_GetFlagStatus:检查EOC标志位是否置1了,检查转换是否结束,waiting,EOC,while(RESET)
ADC_GetConversionValue:获取转换值
DMA:直接存储器存取
通过独立通道将数据从外设到存储器,存储器到外设,存储器到存储器的数据传输,无需CPU干预,减轻CPU负担。
12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)(数据转运路径),每个通道都支持软件触发(存储器——存储器)以及特定的硬件触发(存储器——外设)
工作模式:
确定数据传输方向:外设(存储器)——存储器,确定地址、数据传输宽度、是否自增(外设不自增,存储器需要自增)
可以选择软件触发以及特定通道的硬件触发,触发次数依据计数器值来进行确定,注意,软件触发不能与自动重装一起使用,硬件触发可以使用。
DMA工作三大条件:传输计数器大于0、触发源有信号、DMA使能
DMA库函数:
DMA_Init:初始化
DMA_PeripheralBaseAddr起始地址(外设地址,当存储器-存储器时,该地址为存储器地址)(32位) (地址需要转为32位)
DMA_PeripheralDataSize(数据宽度)
DMA_PeripheralInc(是否自增)
DMA_DIR:传输方向
DMA_BufferSize:传输计数器大小
DMA_Mode:是否启用自动重装
DMA_M2M:选择硬件还是软件触发
DMA_Priority:优先级
DMA_SetCurrDataCounter:设置传输计数器,写计数值时,必须先关闭DMA,disable函数
DMA_GetFlagStatus:获取标志位:需要手动清除标志位。
ADC与DMA联动:
在标准组扫描模式中,需要对数据进行及时转运,否则DR寄存器中数据将被覆盖,可以源地址写DR寄存器,目标地址写SRAM存储器地址(变量数组地址),外设不自增,存储器需要自增来进行数据读取记录。