STM32-ADC多通道输入实验

之前已经介绍了几个ADC的笔记和实验了,链接如下:

关于ADC的笔记1_Mr_rustylake的博客-优快云博客

STM32-ADC单通道采集实验_Mr_rustylake的博客-优快云博客

STM32-单通道ADC采集(DMA读取)实验_Mr_rustylake的博客-优快云博客

接下来介绍这次的实验要求:

通过ADC1通道0/1/2/3/4/5(PA0/1/2/3/4/5)采集测试电压,并现实ADC转换的数字量和换算后的电压值。

首先确定我们的最小刻度,Vref = 3.3V,所以0V <= Vin <= 3.3V,所以最小刻度是3.3V / 4096(2^12)。

接下来确定转换时间。采样时间239.5个ADC时钟周期为例,可以得到转换时间为21us。

时间转换公式参考如下公式:Tcvtmin=(12.5+X)周期=(12.5 + X)/(12MHz)=21us。

 下图是对应的通道表:

这里的模式考虑到需要多通道扫描,所以启动扫描模式,并启动连续模式。通道数记得改为6,注意设置通道数目和对应的转换顺序。

接下来编写函数的代码:

先编写函数文件adc.h:

#include "./BSP/ADC/adc.h"
 
ADC_HandleTypeDef g_adc_nch_handle;
DMA_HandleTypeDef g_dma_nch_handle;
uint8_t g_adc_dma_sta; //标志DMA的传输是否完成
 
void adc_nch_dam_init(uint32_t mar){
 
    ADC_ChannelConfTypeDef adc_ch_conf;
 
    __HAL_RCC_DMA1_CLK_ENABLE();
 
    g_dma_nch_handle.Instance = DMA1_Channel1;
    g_dma_nch_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;  //外设到内存
    g_dma_nch_handle.Init.PeriphInc = DMA_PINC_DISABLE;  //因为选取的是DMA1的数据寄存器,选择不增量
    g_dma_nch_handle.Init.MemInc = DMA_MINC_ENABLE;  //对于存储器需要存储多个数据,所以选择增量模式
    g_dma_nch_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //外设数据位宽,我们选择16位半字(全字可以理解为全角中文字符)
    g_dma_nch_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;  //存储器数据位宽,我们也选择16位半字
    g_dma_nch_handle.Init.Mode = DMA_NORMAL;   //选择普通模式,因为在传输完成之后我们需要进行进一步操作现实我们获取到的值,所以选择normal
    g_dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;   //只有1个DMA随便选
 
    HAL_DMA_Init(&g_dma_nc
STM32微控制器系列中的ADC(Analog-to-Digital Converter,模数转换器)支持多通道数据采集,它允许同时或交替测量多个模拟信号。以下是基本的工作原理和算法: 1. **初始化设置**: - 配置ADC模块:首先,你需要通过GPIO配置相应的输入通道,然后启用ADC,选择合适的扫描模式(连续、单次等),并设置分辨率(12位或14位)。 ```c ADC_HandleTypeDef hadc; hadc.Instance = ADCx; // 替换x为你使用的ADC实例 HAL_ADC_Init(&hadc); ``` 2. **通道配置**: - 定义每个通道,包括其偏移量和增益。如果你的传感器需要校准,这一步很重要。 ```c ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_0; // 改为你所需的通道 sConfig.Rank = ADC_RANK都没用; // 如果不需要特定排序 sConfig.Offset = ...; // 校准偏移值 sConfig.OffsetType = ADC_OFFSET_NONE; HAL_ADC_ConfigChannel(&hadc, &sConfig); ``` 3. **开启转换**: - 启动ADC转换,可以选择多个通道一起转换,然后处理结果。 ```c ADC箔ValueTypeDef *pResult; HAL_ADC_Start(&hadc, &hadc.Init.ScanConvMode); // 扫描模式 pResult = HAL_ADC_GetConversionValues(&hadc); // 获取最近一次转换的结果 ``` 4. **数据处理**: - 处理获取的多通道数据,比如计算平均值、峰值检测等。 ```c float sum = 0; for (uint8_t i = 0; i < NUM_CHANNELS; ++i) { sum += pResult[i]; } float average = sum / NUM_CHANNELS; ``` 5. **定期采集**: - 循环进行上述步骤,如果需要实时数据,可以设定定时器每隔一段时间触发ADC转换。 6. **错误处理**: - 添加适当的错误检查,例如是否完成转换,以及ADC是否因故障中断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值