adc和dma的使用原理和过程
ADC(Analog-Digital Converter)模拟-数字转换器;
积分、逐次逼近、并行\串行比较
使用过程:
首先我们开启时钟CLOCK,START给予一个脉冲信号,让ADC开始转换。我们可能有多路的输入,这时候可以根据,地址所存译码器,选择对应通道,输入电压A,然后SAR给DAC数据,DAC根据SAR的数据输出对应的电压B,比较器比较B和A的大小关系。然后SAR采用二分法的方法输出数据给DAC,使得DAC输出的电压B,不断和A的缩小差距近似相等。当近似相等时候,SAR将数据传递给8位锁存器,并将EOC置0,标志着转换完成,我们就可以根据8位地址锁存器的数据,DAC参考电压,与255~0的对应关系进行转换就可以得到数据,这里电压我以3.3举例(具体以实际为准)。
采样时间的计算
STM32 ADC的总转换时间为:TCONV = 采样时间 + 12.5个ADC周期
配置
1.时钟使能(ADC, GPIO, ADC预分频ADCCLK)
2.配置GPIO为ADC采样输入
3.选择通道(配置多路开关)
4.配置ADC结构体(采样模式, 时钟分频, 采样时间,单次还是连续)
5.配置校准器(复位校准和开始校准)
6.软件触发开启ADC采样
7.设置合适的采样时间
8.进行数据采样
9.进行数据转换(采样值/2^(ADC位数)*参考电压)
相关HAL库函数
HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
注:该函数一定要使用在采样之前或者之后
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc,100);
HAL_ADC_Stop(&hadc1);
DMA(直接存储器访问)
将数据通过独立的DMA通道绕开CPU进行传输
特点:
双向的AHB主端口,GPDMA:两个端口
可以实现从外设/内存到外设/内存的数据传输
并发
GPDMA有16个通道
GPDMA的通道分配
给专用的通道使用专用的FIFO单元
FIFO的大小决定了通道能够有效处理最大DMA突发大小(突发长度与数据宽度的乘积)
端口0分配给与外设之间的传输,因为在这个端口和APB外设之间有一条直接的硬件数据路径,位于AHB矩阵之外;
端口1分配给内存之间的传输,用户可以自由选择用于访问源位置和目标位置的端口。
DMA传输模式
普通or循环 前者搬运了设定长度的数据后会产生一个中断,DMA此时停止工作,需要关断DMA使能后再重新配置才能使用;后者产生中断标志后再接收到数据会覆盖之前的数据
相关HAL库函数
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,\ uint8_t *pData, uint16_t Size)
__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)
HAL_UART_DMAStop(&huart1);