1. 项目概述:STM32WBA65RI开发板与ADC采样
最近在测评ST新推出的NUCLEO-WBA65RI开发板,这是一款基于STM32WBA52CG微控制器的评估套件。作为ST生态中的新成员,WBA系列主打无线连接能力与高性能模拟特性。本次测评重点验证其ADC采样功能,并通过串口输出采样值,这是嵌入式开发中最基础也最实用的功能验证方式之一。
选择这个测试方案有几个实际考量:首先,ADC采样是大多数嵌入式项目的必备功能,从环境监测到工业控制都离不开模拟信号采集;其次,串口输出是最直观的调试手段,不需要额外显示设备就能验证结果;最后,这个组合能全面测试开发板的模拟外设性能和基础通信能力。我使用的开发环境是STM32CubeIDE 1.13.1,这也是ST官方推荐的标准开发工具。
2. 硬件准备与电路连接
2.1 开发板硬件资源分析
NUCLEO-WBA65RI板载资源非常丰富,核心是STM32WBA52CG芯片,内置12位ADC模块,采样率最高可达4.7Msps。板载Arduino接口和ST Morpho扩展接口,方便连接各种外设。特别值得注意的是,这块开发板自带ST-LINK调试器,省去了额外购买调试工具的麻烦。
ADC输入通道方面,我选择了PA0引脚(Arduino接口的A0),这个引脚直接连接到芯片的ADC1_IN5通道。不需要额外电路,开发板已经内置了必要的滤波电容。如果测试外部信号,建议在信号源和ADC输入之间加入RC低通滤波,抑制高频噪声干扰。
2.2 最小系统搭建
虽然NUCLEO开发板可以即插即用,但为了获得准确的ADC采样结果,有几个硬件细节需要注意:
- 供电稳定性:确保使用质量可靠的USB线缆供电,劣质线缆可能引入电源噪声
- 参考电压:开发板默认使用VDDA作为参考电压,实测电压为3.3V
- 接地处理:如果使用外部信号源,务必确保开发板与信号源共地
重要提示:首次使用前,建议用万用表测量开发板的3.3V输出是否准确,这直接影响ADC采样的基准电压。
3. 软件开发环境配置
3.1 STM32CubeIDE工程创建
在STM32CubeIDE中新建工程时,选择正确的芯片型号STM32WBA52CG。初始化配置步骤如下:
- 在Pinout & Configuration界面启用ADC1
- 配置ADC通道(选择IN5对应PA0)
- 设置ADC参数:12位分辨率,右对齐,单次转换模式
- 启用USART1作为串口输出,波特率设为115200
- 生成初始化代码
关键配置代码片段:
c复制// ADC初始化
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);
// USART初始化
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&huart1);
3.2 ADC采样代码实现
在主循环中实现ADC采样和串口输出的核心逻辑:
c复制uint32_t adc_value = 0;
char msg[50] = {0};
while (1) {
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
adc_value = HAL_ADC_GetValue(&hadc1);
float voltage = adc_value * 3.3f / 4095.0f;
sprintf(msg, "ADC Value: %lu, Voltage: %.2fV\r\n", adc_value, voltage);
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
}
HAL_Delay(500);
}
这段代码实现了每500ms采样一次ADC,将原始值和换算后的电压值通过串口输出。注意三点优化:
- 使用HAL库的轮询模式简化代码结构
- 将原始ADC值转换为实际电压值,更直观
- 添加回车换行符(\r\n)确保终端正确显示
4. 实测结果与性能分析
4.1 基础功能测试
连接PA0到3.3V和GND进行极限值测试,结果如下:
| 输入电压 | ADC原始值 | 计算电压 | 误差 |
|---|---|---|---|
| 0V | 0 | 0.00V | 0% |
| 3.3V | 4095 | 3.30V | 0% |
| 1.65V | 2048 | 1.65V | 0% |
测试结果显示ADC线性度非常好,在极限值处没有明显的偏移。实际应用中,建议对ADC值进行软件滤波,比如移动平均或中值滤波,可以提高稳定性。
4.2 动态性能测试
使用信号发生器输入1kHz正弦波,观察ADC采样结果:
- 无软件滤波时,采样值波动约±3LSB
- 加入10点移动平均滤波后,波动降低到±1LSB
- 最高采样率下,实测可以达到标称的4.7Msps
对于需要高速采样的应用,建议:
- 使用DMA传输减轻CPU负担
- 适当降低分辨率换取更高采样率
- 优化PCB布局减少信号串扰
5. 常见问题与解决方案
5.1 ADC采样值不稳定
可能原因及解决方法:
- 电源噪声:检查供电质量,增加去耦电容
- 信号源阻抗过高:在ADC输入端加入电压跟随器
- 参考电压波动:测量VREF+引脚电压,必要时使用外部基准
5.2 串口无输出
排查步骤:
- 确认串口线连接正确(TX-RX交叉)
- 检查终端软件波特率设置是否匹配
- 用逻辑分析仪抓取USART引脚信号
- 验证时钟树配置是否正确
5.3 开发板识别问题
如果STM32CubeIDE无法识别开发板:
- 检查ST-LINK驱动是否安装
- 尝试复位开发板
- 更新ST-LINK固件
- 更换USB接口或线缆
6. 项目扩展与进阶应用
完成基础功能后,可以考虑以下扩展方向:
- 多通道ADC扫描:同时采集多个模拟信号
- 定时器触发采样:实现精确的定时采集
- 无线传输:利用WBA的蓝牙功能发送采样数据
- 数据存储:将采样值保存到外部Flash或SD卡
一个实用的改进方案是加入阈值报警功能,当采样值超过设定范围时通过LED或蜂鸣器提示。代码实现也很简单:
c复制#define VOLTAGE_THRESHOLD 2.5f
if (voltage > VOLTAGE_THRESHOLD) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮板载LED
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}
通过这个项目,我验证了NUCLEO-WBA65RI开发板的ADC性能和串口通信稳定性。实际使用中发现,ST的HAL库虽然抽象程度高、易于上手,但在性能敏感的场景下,直接操作寄存器可能更高效。对于刚接触STM32的开发者,建议先从HAL库开始,熟悉后再逐步深入底层。
