1、 对于ADC来说,我们关注的是它的分辨率、转换速度、ADC类型、参考电压范围。
A、 分辨率,12位分辨率,最小量化单位LSB=VREF+/212
B、 转换时间,可编程的,采样一次至少要用14个ADC时钟周期,而ADC时钟频率最高为14MHz,也就是说它的最短采样时间为1us
C、 ADC类型,类型决定了性能的极限,stm32是逐次比较型ADC
D、 参考电压范围,当需要测量负电压或测量的信号超出范围时,要先经过运算电路进行平移或利用电阻分压
2、 ADC工作过程分析,ADC部件要受到触发信号才开始进行转换,如EXTI外部触发、定时器触发,也可以软件触发。ADC部件在接收到触发信号后,在ADCCLK时钟的驱动下对输入通道信号进行采样,并进行模数转换。其中,ADCCLK来自ADC的预分频器
3、 DMA在传输时,由于不是内核执行的指令,所以修改变量值是绝对不会出现赋值语句的。
4、 在ADC_Init( )中完成对ADC和DMA配置后,ADC就不停地采集数据,而DMA就自动把ADC采集到的数据转移至内存中的变量ADC_ConvertedValue.因此,它是一个实时值
5、 ADC1_GPIO_Config( )的功能就是使能DMA时钟、GPIO时钟、ADC1时钟。然后把ADC1的通道11使用的GPIO引脚PC1配置成模拟输入模式
6、 配置DMA,ADC模式及其DMA传输方式都在ADC_Mode_Config( )中实现,ADC的DMA整体上被配置为:使用DMA1的通道1
7、 配置ADC模式:主要对ADC的初始化结构体进行赋值,下面是它的结构体成员:
A、.ADC_Mode,多个ADC,不同的ADC又是共用相同的通道,根据同一个通道的先后顺序、时间间隔,可划分10种模式(测量电压分压后的电压值,要求不高,用一个ADC就可以了)
B、.ADC_ScanConvMode,当有多个通道需要采集信号时,可配置为按一定顺序对各个通道进行扫描转换,即轮流采集各通道的值,若采集多个通道,必须开启此模式
C、ADC_ContinuousConvMode,连续转换模式,即在上一次转换完后,立即开启下一次的转换
D、ADC_ExternalTrigConv,外部触发,若使用软件触发,则ADC_ExternalTrigConv_None
E、.ADC_DataAlign,数据对齐方式
F、.ADC_NbrOfChannel,这个成员保存了要进行ADC数据转换的通道数
8、ADC初始化使用ADC_Init( )函数,但要调用ADC_Cmd( )函数来使能ADC外设,用ADC_DMACmd( )函数来使能ADC的DMA接口
9、ADC转换时间配置:RCC_ADCCLKConfig( )设置分频值,ADC转换时间不仅与ADC的时钟有关,还与采样周期有关
10、stm32中 ADC采样时间计算公式:Tconv=采样周期+12.5个周期,公式中的采样周期就是本函数配置的ADC_SampleTime,后面再加上12.5个固定周期值。所以,转换时间=采样时间/分频值
11、ADC自校准,在ADC转换前,要启动ADC的自校准,校准可以大幅度减少准精度误差
12、软件触发可以调用库函数ADC_SoftwareStartConvCmd( )来开启软件触发
13、Volatile定义的变量,使用该关键词来修饰,为的是不要让编译器去优化变量
14、用volatile声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。 因为ADC_ConvertedValue这个变量值随时都是会被DMA控制器改变的,所以我们用volatile来修饰它,确保每次读取到的都是实时的ADC转换值。
15、ADC通用的电压计算公式:实际电压值=ADC转换值*LSB