CUBEMX 配置STM32F103 ADC+DMA

ADC配置

Mode是ADC工作模式 我们设置为independent mode(独立模式)因为只需要单独ADC使用,如果是多个ADC联合使用才需要更改。

Clock Prescaler是ADC工作频率,这里PCLK2在F103上为72MHZ,再6分频为12MHZ,所以ADC工作频率为12MHZ,一秒有12M个ADC周期,一个ADC周期为1/(12M)s。

Resolution 是选择ADC分辨率以及得到一个ADC值的时间=采样时间+转换时间,转换时间一般是固定的例如:F103为12.5个ADC周期(Datasheet - STM32F103xC, STM32F103xD, STM32F103xE - High-density performance line Arm®-based 32-bit MCU with 256 to 512KB Flash, USB, CAN, 11 timers, 3 ADCs, 13 communication interfaces第106页,最下面的tCONV),采样时间在Rank->Sampling Time里配置,这里我采样时间选择3个ADC周期。

Data Alignment是数据对齐方式,一般配置为右对齐,如果是12位分辨率会存储在uint16_t的[11:0]位,其他位为干扰。

Scan Conversion Mode是多通道模式,顾名思义,这里不需要,为Disabled。

Continuous Conversion Mode是连续捕获模式,一般为Enabled,实际上开不开都可以正常使用,但是开了数据更新速度明显加快。

Discontinuous Conversion Mode是不连续捕获,Disabled。

DMA Continuous Requests是DMA连续请求模式,这个十分主要,例如HAL_ADC_START_DMA(&hadc1,(uint32_t *)buf,200) 这个语句,使用ADC1和DMA,数据放入buf数组内,放200个数据。如果DMA连续请求去能的话,这个语句传完200个数据后自动关闭ADC1和DMA。反之,使能后,语句执行完后会又会连续从头开始传输数据,实际为buf数组中的值一直在更新。

Number Of Conversion是规则组通道数量这里我只要一个通道,如果是多个通道前面的多通道模式要使能。

External Trigger Conversion Source规则组通道采样的触发源,这里我们软件触发,也可以配置为定时器触发。

External Trigger Conversion Edge规则组通道采样的触发源的触发方式,一般有上升沿触发,或下降沿触发,这里我们不需要。

Rank配置规则组通道的采样顺序和各通道的采样时间,这里我们只有一个通道,所以只需要配置采样时间3ADC周期

之后是注入组,实际为我们特定时候需要采样用的,感觉像在中断里面的ADC。到此ADC基本配置完毕。

DMA配置

Add->Select->ADC1配置ADC与DMA建立联系。

Priority->High优先级高。

Mode->Circular DMA工作模式,一般为循环模式,没想到什么情况只需要传一个数据还要DMA的。

increment Address为地址自增,一般外设地址是固定的,但是我们数据存储是在数组内,所以需要存储完后自动移到下一个位子再存数据。

Use Fifo使用FIFO一个缓冲空间,一般用于匹配速度的。

Data Width数据长度Word为字有4字节32位长度、Half Word为半字有2字节16位、Byte字节8位。注意ADC分辨率我们是12位。

到此ADC和DMA配置完毕。

计算ADC采样率

由于有DMA所以单片机在ADC采样的时候不需要去代码获取,可以尽量保证ADC采样点之间间隔的ADC周期数一样。同时我们代码也要

尽量避免ADC采样时不要有其他工作,数据处理放在采完一轮之后处理。

按上面的配置ADC工作频率21MHZ,一个ADC周期47.619ns

一个AD值时间=采样时间+转换时间=3+12=15ADC周期=0.71us=1.4MHZ

所以一秒钟可以采1.4M个AD值,ADC的采样率为1.4M,对应FFT中的Fs

计算ADC电压值

由于我用的开发板,内部供电3.3V,按上面配置的ADC分辨率为12位,2^12=4096

所以ADC采集的电压值=(ADC的采集值*3.3)/(2^12) V

例如:ADC采集值为2000,则对应电压值为1.611328V

你可能感兴趣的:(c语言)