在电子系统开发与调试过程中,电压监测是最基础却至关重要的环节。无论是锂电池组管理、太阳能发电系统监控,还是工业控制设备的信号采集,都需要精确可靠的电压测量手段。传统万用表无法实现多通道实时监测,而专业数据采集设备又往往价格昂贵。这正是我们选择STM32G431微控制器搭配TI的ADS1118 ADC芯片构建四通道电压监测仪的原因——它完美平衡了性能、成本与灵活性。
这个DIY项目特别适合以下场景:
STM32G431KBU3作为主控芯片具有以下优势:
ADS1118作为ADC芯片的关键特性:
输入保护电路设计推荐方案:
code复制VIN ──┬── 10kΩ限流电阻 ──┬── ADS1118_AINx
│ │
└── 5.1V齐纳二极管 ─┘
│
└── 100pF滤波电容 ── GND
电源连接方案:
ADS1118采用SPI Mode 1通信(CPOL=0,CPHA=1),关键时序参数:
| 参数 | 最小值 | 典型值 |
|---|---|---|
| CS到SCLK建立时间 | 200ns | - |
| SCLK周期 | 400ns | 1μs |
| 转换时间(128SPS) | - | 8ms |
模拟SPI的GPIO初始化代码示例:
c复制void SPI_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// CS(PA4), SCLK(PA5), MOSI(PA7)配置为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// MISO(PA6)配置为开漏输入
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
ADS1118的16位配置寄存器结构:
| 位域 | 名称 | 功能说明 | 典型配置值 |
|---|---|---|---|
| 15 | OS | 单次转换启动位 | 1(启动) |
| 14:12 | MUX | 通道选择 | 100-111 |
| 11:9 | PGA | 增益设置(FSR) | 010(±2.048V) |
| 8 | MODE | 工作模式(0:连续 1:单次) | 1 |
| 7:5 | DR | 数据速率 | 100(128SPS) |
| 0 | TS_MODE | 0:ADC模式 1:温度传感器模式 | 0 |
通道选择宏定义示例:
c复制#define ADS1118_CONFIG_MUX_SINGLE_0 0x4000 // AIN0单端输入
#define ADS1118_CONFIG_MUX_SINGLE_1 0x5000 // AIN1单端输入
#define ADS1118_CONFIG_MUX_SINGLE_2 0x6000 // AIN2单端输入
#define ADS1118_CONFIG_MUX_SINGLE_3 0x7000 // AIN3单端输入
ADS1118在多通道采集时需要注意:
推荐的多通道采集流程:
ADC原始值到实际电压的转换公式:
code复制电压(V) = (原始值 × LSB) / 增益
其中LSB根据量程不同而变化:
| 量程(FSR) | LSB值 |
|---|---|
| ±6.144V | 187.5μV |
| ±4.096V | 125μV |
| ±2.048V | 62.5μV |
| ±1.024V | 31.25μV |
代码实现示例:
c复制float ConvertToVoltage(int16_t raw, uint8_t gain_setting)
{
const float lsb_table[] = {
0.0001875f, // ±6.144V
0.000125f, // ±4.096V
0.0000625f, // ±2.048V
0.00003125f // ±1.024V
};
return (float)raw * lsb_table[gain_setting];
}
利用ADS1118的单次转换模式:
STM32的电源管理:
优化采样速率:
| 输出方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| UART | 简单通用,便于调试 | 速度较慢 | PC端数据显示 |
| USB CDC | 即插即用,速度较快 | 需要USB协议栈支持 | 专业测量设备 |
| OLED | 独立显示,无需PC | 信息量有限 | 便携式检测仪器 |
| SD卡 | 大容量数据存储 | 需要文件系统支持 | 长期数据记录 |
OLED显示示例代码框架:
c复制void DisplayVoltages(float voltages[4])
{
OLED_Clear();
OLED_ShowString(0, 0, "CH0:", 16);
OLED_ShowFloat(32, 0, voltages[0], 3, 16);
// 显示其他通道...
OLED_Refresh();
}
Q1:读取的电压值不稳定
Q2:多通道采集时数据错位
Q3:测量值与万用表差异大
无线传输扩展:
上位机软件开发:
机械结构设计:
这个电压监测仪项目虽然小巧,但涵盖了嵌入式开发的完整流程——从硬件选型、电路设计、驱动开发到应用逻辑实现。通过灵活调整配置,它可以适应从简单的电池电压监测到复杂的工业信号采集等各种场景。