当前位置: 首页 > news >正文

基于STM32驱动ADS1118实现电压采样并输出到串口

基于STM32驱动ADS1118实现电压采样并输出到串口


一、硬件连接方案

1. 引脚连接(以STM32F103为例)
STM32引脚ADS1118引脚功能说明
PA4(SPI1_NSS)CS片选信号(低电平有效)
PA5(SPI1_SCK)SCK时钟信号
PA6(SPI1_MISO)DOUT数据输出
PA7(SPI1_MOSI)DIN数据输入
3.3VVDD电源供电
GNDGND地线
2. 电路设计要点
  • 电源滤波:在VDD和GND间添加10μF电解电容+0.1μF陶瓷电容
  • 信号完整性:
    • SPI线使用22Ω电阻串联(SCK/DIN/DOUT)
    • CS线添加49.9Ω上拉电阻
  • 参考电压:使用内部1.25V参考(配置寄存器设置)

二、软件实现(HAL库+标准外设库)

1. SPI初始化(CubeMX配置)
// SPI1配置参数
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // 125kHz
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi1);
2. ADS1118驱动代码
#define ADS1118_CS_PIN    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define ADS1118_CS_RELEASE HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)// 寄存器地址
#define ADS_CONFIG_REG    0x01
#define ADS_CONVERSION_REG 0x00// 配置值(16位补码格式)
uint8_t config_data[3] = {ADS_CONFIG_REG,     // 寄存器地址0x85,               // 单次转换+增益1+128SPS0x00              // 保留
};// 初始化ADS1118
void ADS1118_Init() {ADS1118_CS_RELEASE;HAL_Delay(100);  // 复位时间HAL_SPI_Transmit(&hspi1, config_data, 3, 1000);ADS1118_CS_RELEASE;
}// 读取转换结果
int16_t ADS1118_Read() {uint8_t rx_data[2] = {0};ADS1118_CS_RELEASE;HAL_SPI_Transmit(&hspi1, (uint8_t*)&ADS_CONVERSION_REG, 1, 1000);HAL_SPI_Receive(&hspi1, rx_data, 2, 1000);ADS1118_CS_RELEASE;return (rx_data[0] << 8) | rx_data[1];
}
3. 电压计算与串口输出
// 电压转换函数
float ADS1118_GetVoltage(int16_t adc_value) {float voltage = (adc_value * 1.25f) / 32768.0f;  // 内部参考电压1.25Vreturn voltage * 1000;  // 转换为mV
}// 串口打印函数(重定向printf)
int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;
}// 主循环
int main(void) {HAL_Init();SystemClock_Config();MX_USART1_UART_Init();MX_SPI1_Init();ADS1118_Init();while(1) {int16_t adc_val = ADS1118_Read();float voltage = ADS1118_GetVoltage(adc_val);printf("ADC: %d, Voltage: %.2f mV\r\n", adc_val, voltage);HAL_Delay(1000);}
}

参考源码 使用STM32驱动ADS1118,电压采样信息打印到串口上 youwenfan.com/contentcsa/70055.html

三、关键调试技巧

1. 波形验证(示波器观察)
  • SPI时序:确保SCK在CS拉低后开始,MOSI与SCK同步上升沿
  • 数据有效性:DOUT在CS拉低后20μs内变为低电平表示数据就绪
2. 常见问题解决
现象可能原因解决方案
数据全0SPI模式不匹配检查CPOL/CPHA设置
数据跳变电源噪声干扰添加LC滤波(10μH+100nF)
通信超时片选信号未正确控制检查CS引脚电平状态
电压漂移参考电压不稳定添加外部精密基准源(如REF3030)
3. 性能优化
  • DMA传输:使用SPI DMA接收减少CPU占用

    // DMA配置示例
    DMA_HandleTypeDef hdma_spi1_rx;
    hdma_spi1_rx.Instance = DMA1_Channel2;
    hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
    HAL_DMA_Init(&hdma_spi1_rx);
    HAL_SPI_Receive_DMA(&hspi1, rx_buffer, 2);
    
  • 中断处理:使用SPI接收中断提升实时性

    void SPI1_IRQHandler() {HAL_SPI_IRQHandler(&hspi1);if(__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_RXNE)) {uint8_t data = hspi1.Instance->DR;// 处理接收数据}
    }
    

四、扩展功能实现

1. 多通道轮询采集
// 多通道配置表(差分输入)
uint8_t channel_config[4] = {0x83, 0xA3, 0xC3, 0xE3}; // AIN0-1, AIN2-3等void ADS1118_MultiChannel() {for(uint8_t i=0; i<4; i++) {HAL_SPI_Transmit(&hspi1, channel_config, 1, 1000);HAL_Delay(10);adc_val[i] = ADS1118_Read();}
}
2. 温度补偿
// 读取芯片温度(需要配置温度寄存器)
float ADS1118_ReadTemperature() {HAL_SPI_Transmit(&hspi1, (uint8_t*)0x02, 1, 1000); // Lo_thresh寄存器HAL_SPI_Transmit(&hspi1, (uint8_t*)0x03, 1, 1000); // Hi_thresh寄存器uint16_t temp_raw = ADS1118_Read();return (temp_raw * 0.03125f) - 256.0f; // 转换为摄氏度
}

五、PCB设计建议

  1. 电源完整性
    • 采用四层板结构,中间层为完整GND平面
    • ADS1118电源引脚添加0.1μF和10μF去耦电容
  2. 信号完整性
    • SPI线做包地处理(两侧走GND线)
    • 关键信号线做等长匹配(长度差<5mil)
  3. EMC防护
    • 在SPI总线上串联TVS管(SMBJ12A)
    • 添加共模电感(10μH)抑制高频噪声

该方案通过SPI接口实现ADS1118的高效驱动,结合串口输出实现实时数据监控。实际应用中需根据具体硬件环境调整滤波参数和时序配置,建议通过示波器验证关键信号波形。

http://www.dtcms.com/a/293573.html

相关文章:

  • PetaLinux 使用技巧与缓存配置
  • 从零搭建 OpenCV 项目(新手向)-- 第二天 OpenCV图像预处理(一)
  • 第四章 Freertos物联网实战DHT11温湿度模块
  • 嵌入式学习-(李宏毅)机器学习(1)-day28
  • 本地电脑映射端口到外网访问的开启方法和注意事项,内网服务提供跨网使用简单操作实现
  • 神经网络和机器学习的一些基本概念
  • 某种物联网SIM卡流量查询方法
  • BQ4050RSMR DIOTEC高精度锂电池保护与电量监测芯片 集成保护+计量+通信
  • 2025年Zigbee技术白皮书:全球物联网无线通信的关键创新
  • 【Linux | 网络】应用层(HTTPS)
  • 如何在 Ubuntu 20.04 Linux 上安装 TeamSpeak 客户端
  • SparkSQL 聚合函数 MAX 对 NULL 值的处理
  • AWS Lambda IoT数据处理异常深度分析:从告警到根因的完整排查之路
  • Notepad++工具操作技巧
  • BitDistiller:通过自蒸馏释放 Sub-4-Bit 大语言模型的潜力
  • React Native + Expo 入坑指南:从核心概念到实战演练
  • Android 测试全指南:单元测试与UI测试框架详解
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——3. QML入门:像搭积木一样构建UI
  • 论文笔记:Tuning Language Models by Proxy
  • 图机器学习(16)——图数据与自然语言处理
  • qiankun 和 Element UI 影响 el-cascader 宽度问题
  • 计算机毕设分享-基于SpringBoot的房屋租赁系统(开题报告+源码+Lun文+开发文档+数据库设计文档)
  • win11安装erlang和rabbitmq
  • 基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(上)
  • Kafka——Kafka中的位移提交
  • ITIL 4:云计算与微服务对组织架构的影响
  • Elasticsearch(ES)介绍和安装
  • 20250704-基于强化学习在云计算环境中的虚拟机资源调度研究
  • ElasticSearch基础数据管理详解
  • CSS3文本阴影特效全攻略