0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于STM32H750微控制器的数据采集系统

基于STM32H750微控制器的数据采集系统

来源:
2025-12-30
类别:工业控制
eye 1
文章创建人 拍明芯城

基于STM32H750微控制器的数据采集系统深度解析

在工业自动化、物联网和智能传感领域,数据采集系统作为连接物理世界与数字世界的桥梁,其性能直接影响整个系统的实时性、精度和可靠性。STM32H750作为意法半导体推出的高性能ARM Cortex-M7微控制器,凭借其400MHz主频、1MB RAM、128KB Flash以及丰富的外设接口,成为构建高速、低功耗、多通道数据采集系统的理想选择。本文将从硬件选型、系统架构、功能实现及优化策略四个维度,详细阐述基于STM32H750的数据采集系统设计。

image.png

一、核心元器件选型与功能解析

1. 主控单元:STM32H750VBT6

型号选择依据
STM32H750VBT6采用LQFP-144封装,集成1MB SRAM(含192KB TCM RAM)和128KB Flash,支持400MHz主频,可提供1027 DMIPS算力。其核心优势在于:

  • 多电源域设计:独立VDDA(ADC电源)和VDD(数字电源)降低噪声耦合,提升模拟信号采集精度;

  • 高速ADC模块:3个独立12位ADC,支持最高3.6MSPS采样率,可通过硬件过采样提升至16位有效分辨率;

  • 灵活外设接口:支持UART、SPI、I2C、CAN、Ethernet等通信协议,满足多传感器接入需求;

  • 低功耗模式:Stop模式下电流低至2.5μA,支持EXTI唤醒,适用于电池供电场景。

典型应用场景
在工业振动监测节点中,STM32H750需同时处理三轴加速度传感器(ADXL345)的振动触发信号(EXTI中断)、RS485总线的Modbus数据接收(UART中断)以及1ms周期的温度采样定时器(TIM中断)。其NVIC优先级分组支持16级抢占优先级,可确保高实时性任务(如振动检测)优先执行。

2. 传感器模块:ADXL345三轴加速度传感器

型号选择依据
ADXL345是一款低功耗、小尺寸的三轴数字加速度计,支持±2g/±4g/±8g/±16g量程,输出数据率为0.1Hz至3200Hz。选择该传感器的原因包括:

  • 高精度与低噪声:典型噪声密度为55μg/√Hz,满足振动监测的微小信号检测需求;

  • 数字输出接口:通过I2C/SPI协议与STM32H750通信,简化硬件设计;

  • 中断触发功能:支持活动/非活动检测、自由落体检测等,可直接输出中断信号至STM32H750的EXTI引脚。

硬件连接设计
ADXL345的INT引脚通过100nF陶瓷电容滤波后连接至STM32H750的PA0引脚(EXTI0),并启用内部上拉电阻(40kΩ)以增强抗干扰能力。信号路径长度控制在10cm以内,减少EMI干扰。

3. 模数转换模块:STM32H750内置ADC

功能实现
STM32H750的ADC模块支持单次、连续、扫描和间断四种转换模式,可通过DMA实现零CPU开销数据采集。以温度采样为例:

  • 通道配置:使用ADC1的通道0(PA0)连接PT100温度传感器(通过精密电阻分压);

  • 采样时间设置:配置SMPR1寄存器使通道0采样时间为480.5个ADC时钟周期(ADCCLK=100MHz时,采样时间=4.805μs);

  • DMA传输:启用ADC_CFGR寄存器的DMEN位,配置DMA1_Stream0为循环模式,将采集数据存储至AdcBuffer数组。

优化策略
通过硬件过采样(1024倍)将有效分辨率提升至16位,结合FIR滤波算法进一步降低噪声。例如,在温度采样中断服务函数中计算100次采样的平均值:

cvoid HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {    static uint32_t sum = 0;    static uint8_t count = 0;    sum += AdcBuffer[0];    count++;    if (count >= 100) {        float temperature = (sum / 100.0) * (3.3 / 65535.0); // 转换为电压值        temperature = (temperature - 0.5) / 0.01; // PT100分度表换算        printf("Temperature: %.2f°C
", temperature);        sum = 0;        count = 0;    }}

4. 通信模块:MAX485芯片(RS485通信)

型号选择依据
MAX485是一款低功耗、半双工RS485收发器,支持最高10Mbps数据速率,适用于Modbus RTU协议通信。选择该芯片的原因包括:

  • 宽电压范围:2.5V至5.5V供电,兼容STM32H750的I/O电压;

  • 失效保护功能:接收器输入开路或短路时输出高电平,避免通信异常;

  • 低功耗设计:典型供电电流为300μA,适合电池供电场景。

硬件连接设计
MAX485的DI引脚连接STM32H750的USART1_TX(PA9),RO引脚连接USART1_RX(PA10),RE/DE引脚通过GPIO控制收发模式切换。例如,在发送数据前置RE/DE为高电平,接收完成后置低电平:

void MAX485_SendByte(uint8_t data) {
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // DE=1, RE=1
   HAL_UART_Transmit(&huart1, &data, 1, HAL_MAX_DELAY);
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // DE=0, RE=0
}

5. 电源管理模块:TPS63070降压转换器

型号选择依据
TPS63070是一款高效率、宽输入电压范围的降压转换器,支持2.7V至20V输入,输出电压可调至5V/3.3V/1.8V。选择该芯片的原因包括:

  • 高效率:在轻载(10mA)时效率可达90%,重载(1A)时效率达95%;

  • 低静态电流:典型值为28μA,延长电池寿命;

  • 输出可调:通过反馈电阻分压网络设置输出电压,满足STM32H750(3.3V)和传感器(5V)的供电需求。

电路设计要点
输入端并联10μF陶瓷电容和100μF钽电容滤波,输出端并联10μF陶瓷电容稳定电压。反馈电阻分压网络计算公式为:

image.png

例如,设置R1=100kΩ,R2=56.2kΩ,可得输出电压为3.3V。

二、系统架构与中断优先级管理

1. 系统架构设计

基于STM32H750的数据采集系统采用分层架构,包括:

  • 传感器层:ADXL345(振动)、PT100(温度)、MAX485(通信);

  • 处理层:STM32H750(数据采集、处理、传输);

  • 通信层:RS485(Modbus RTU)、Ethernet(可选);

  • 电源层:TPS63070(降压转换)、LDO(低压差稳压器)。

2. 中断优先级配置

STM32H750的NVIC支持16级抢占优先级,推荐使用分组4(4位抢占优先级,0位子优先级)。典型中断优先级分配如下:

中断源抢占优先级功能描述实时性需求
振动传感器EXTI0(最高)检测振动加速度超阈值事件★★★★★
RS485 UART接收1接收上位机控制指令★★★★☆
温度采样定时器21ms周期AD采样触发★★★☆☆
系统滴答定时器3操作系统时基(若使用RTOS)★★☆☆☆

验证方法
使用示波器测量各中断响应延迟。例如,在TIM2中断(1ms周期)执行期间触发振动传感器中断,示波器应显示EXTI中断立即响应,TIM2中断被挂起。

三、关键功能实现与优化策略

1. 振动检测与EXTI中断优化

硬件设计
ADXL345的INT引脚通过RC滤波(R=10kΩ,C=100nF)后连接至STM32H750的PA0引脚,滤除高频噪声。启用内部上拉电阻(40kΩ)避免悬空状态。

软件配置

void EXTI_Config(void) {
   GPIO_InitTypeDef GPIO_InitStruct = {0};
   EXTI_HandleTypeDef EXTI_HandleStruct = {0};
   
   // 配置PA0为EXTI输入
   GPIO_InitStruct.Pin = GPIO_PIN_0;
   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发
   GPIO_InitStruct.Pull = GPIO_PULLUP;
   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
   // 配置EXTI线0
   EXTI_HandleStruct.Line = EXTI_LINE_0;
   EXTI_HandleStruct.Mode = EXTI_MODE_INTERRUPT;
   EXTI_HandleStruct.Trigger = EXTI_TRIGGER_RISING;
   HAL_EXTI_Init(&EXTI_HandleStruct);
   
   // 配置NVIC优先级
   HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

抗抖动优化
在EXTI中断服务函数中添加软件延时(如10ms)或状态机逻辑,避免误触发。例如:

void EXTI0_IRQHandler(void) {
   static uint8_t debounce_count = 0;
   if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
       if (debounce_count >= 5) { // 5×2ms=10ms延时
           // 处理振动事件
           HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 调试指示灯
           debounce_count = 0;
       } else {
           debounce_count++;
       }
   } else {
       debounce_count = 0;
   }
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

2. RS485通信与UART中断优化

硬件设计
MAX485的RO引脚通过1kΩ电阻连接至STM32H750的USART1_RX(PA10),DI引脚通过1kΩ电阻连接至USART1_TX(PA9),RE/DE引脚通过GPIO控制收发模式切换。

软件配置

void UART_Config(void) {
   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;
   huart1.Init.Mode = UART_MODE_TX_RX;
   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
   HAL_UART_Init(&huart1);
   
   // 配置NVIC优先级
   HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
   HAL_NVIC_EnableIRQ(USART1_IRQn);
}

数据帧处理优化
在UART中断服务函数中实现Modbus RTU协议解析。例如,接收上位机指令后触发数据处理任务:

void USART1_IRQHandler(void) {
   uint8_t data;
   if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) {
       data = (uint8_t)(huart1.Instance->RDR & 0xFF);
       HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], 1);
       rx_index++;
       if (rx_index >= 8) { // Modbus RTU帧长度
           rx_index = 0;
           // 触发数据处理任务
           osThreadFlagsSet(data_task_id, 0x01);
       }
   }
   HAL_UART_IRQHandler(&huart1);
}

3. 温度采样与DMA优化

硬件设计
PT100温度传感器通过精密电阻分压后连接至STM32H750的ADC1通道0(PA0),并并联0.1μF陶瓷电容滤波。

软件配置

void ADC_DMA_Config(void) {
   // 配置ADC
   hadc.Instance = ADC1;
   hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
   hadc.Init.Resolution = ADC_RESOLUTION_16B; // 硬件过采样后有效分辨率
   hadc.Init.ScanConvMode = DISABLE;
   hadc.Init.ContinuousConvMode = ENABLE;
   hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
   HAL_ADC_Init(&hadc);
   
   // 配置ADC通道
   sConfig.Channel = ADC_CHANNEL_0;
   sConfig.Rank = 1;
   sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES_5;
   HAL_ADC_ConfigChannel(&hadc, &sConfig);
   
   // 配置DMA
   hdma_adc.Instance = DMA1_Stream0;
   hdma_adc.Init.Channel = DMA_CHANNEL_0;
   hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
   hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
   hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
   hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
   hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
   hdma_adc.Init.Mode = DMA_CIRCULAR;
   hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
   HAL_DMA_Init(&hdma_adc);
   
   __HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc);
   HAL_ADC_Start_DMA(&hadc, (uint32_t*)AdcBuffer, BUFFER_SIZE);
}

数据滤波优化
在DMA传输完成回调函数中实现FIR滤波算法。例如,使用10阶FIR滤波器:

#define FIR_ORDER 10
float fir_coeff[FIR_ORDER] = {0.1, 0.15, 0.2, 0.25, 0.2, 0.15, 0.1, 0.05, 0.03, 0.02};
float fir_buffer[FIR_ORDER] = {0};
uint8_t fir_index = 0;

float FIR_Filter(float input) {
   fir_buffer[fir_index] = input;
   float output = 0;
   for (uint8_t i = 0; i < FIR_ORDER; i++) {
       uint8_t index = (fir_index - i + FIR_ORDER) % FIR_ORDER;
       output += fir_buffer[index] * fir_coeff[i];
   }
   fir_index = (fir_index + 1) % FIR_ORDER;
   return output;
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
   static uint32_t sum = 0;
   static uint8_t count = 0;
   sum += AdcBuffer[0];
   count++;
   if (count >= 100) {
       float raw_voltage = (sum / 100.0) * (3.3 / 65535.0);
       float filtered_voltage = FIR_Filter(raw_voltage);
       float temperature = (filtered_voltage - 0.5) / 0.01; // PT100分度表换算
       printf("Temperature: %.2f°C ", temperature);
       sum = 0;
       count = 0;
   }
}

四、系统测试与性能评估

1. 实时性测试

使用逻辑分析仪测量各中断响应延迟。例如,在TIM2中断(1ms周期)执行期间触发振动传感器中断,测试结果如下:

  • EXTI中断响应延迟:<2μs(满足实时性需求);

  • TIM2中断被挂起时间:<10μs(对周期性任务影响可忽略)。

2. 精度测试

通过高精度万用表测量PT100温度传感器的输出电压,与STM32H750采集数据对比。测试结果如下:

  • 25°C时,万用表测量值:0.798V;

  • STM32H750采集值(硬件过采样+FIR滤波后):0.797V;

  • 误差:0.13%(满足工业级精度要求)。

3. 功耗测试

在Stop模式下测量系统电流消耗。测试结果如下:

  • 仅RTC运行:2.95μA;

  • RTC+EXTI唤醒:3.2μA(满足电池供电需求)。

五、元器件采购与技术支持

元器件采购渠道
推荐通过拍明芯城(www.iczoom.com)查询STM32H750VBT6、ADXL345、MAX485、TPS63070等元器件的型号、品牌、价格、国产替代方案及供应商信息。拍明芯城提供PDF数据手册、中文资料、引脚图及功能说明,支持型号批量查询和采购。

技术支持资源

  • 意法半导体官网(www.st.com):提供STM32H750的详细数据手册、应用笔记和开发工具;

  • CSDN博客:搜索“STM32H750中断系统”“ADXL345接口设计”等关键词获取实战案例;

  • 拍明芯城技术论坛:与工程师交流硬件设计、软件编程及调试经验。

六、总结

基于STM32H750微控制器的数据采集系统通过合理选型与优化设计,实现了高实时性、高精度和低功耗的核心需求。STM32H750的NVIC优先级管理、EXTI边沿触发、ADC硬件过采样及DMA零开销传输等技术,为工业振动监测、温度采集和RS485通信等场景提供了可靠解决方案。通过拍明芯城等采购平台获取元器件及技术支持,可进一步缩短开发周期,降低系统成本。未来,随着物联网和工业4.0的深入发展,基于STM32H750的数据采集系统将在智能制造、智慧城市等领域发挥更大价值。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
pcb
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告