打印
[STM32H7]

高性能实时控制:基于STM32H743的I2C数据采集设计与实现

[复制链接]
46|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Uriah|  楼主 | 2024-11-30 07:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式系统中,I2C总线作为一种简单、高效的串行通信方式,广泛应用于传感器数据采集等领域。本文基于ST的高性能微控制器STM32H743,设计并实现了一个I2C通信的完整案例,展示如何快速、高效地采集传感器数据。
项目背景STM32H743以其高达480MHz的主频、丰富的外设支持及低功耗特性,成为高性能应用的首选。在数据采集场景中,I2C的主从结构为连接多种传感器提供了极大的便利性。本文通过模拟温湿度传感器的通信过程,介绍STM32H743如何通过I2C获取传感器数据,并在终端输出。
硬件连接我们使用以下硬件完成实验:
  • STM32H743 Nucleo开发板
  • HTU21D温湿度传感器
  • 若干连接线
将HTU21D的SCL、SDA分别连接至STM32H743的PB6和PB7(I2C1接口),并确保电源和地正确连接。
软件设计使用STM32CubeMX生成初始化代码,并在Keil MDK中编写主程序。以下是完整代码:
#include "main.h"  
#include "i2c.h"  
#include "usart.h"  
#include "gpio.h"  

#define HTU21D_ADDRESS 0x40  
#define TEMP_MEASURE_NO_HOLD 0xF3  

void SystemClock_Config(void);  
float Read_Temperature(void);  

int main(void) {  
    HAL_Init();  
    SystemClock_Config();  
    MX_GPIO_Init();  
    MX_I2C1_Init();  
    MX_USART1_UART_Init();  
   
    while (1) {  
        float temperature = Read_Temperature();  
        char buffer[50];  
        sprintf(buffer, "Temperature: %.2f C\r\n", temperature);  
        HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);  
        HAL_Delay(1000);  
    }  
}  

float Read_Temperature(void) {  
    uint8_t cmd = TEMP_MEASURE_NO_HOLD;  
    uint8_t data[2];  
    HAL_I2C_Master_Transmit(&hi2c1, HTU21D_ADDRESS << 1, &cmd, 1, HAL_MAX_DELAY);  
    HAL_Delay(50);  
    HAL_I2C_Master_Receive(&hi2c1, HTU21D_ADDRESS << 1, data, 2, HAL_MAX_DELAY);  
   
    uint16_t raw_temp = (data[0] << 8) | data[1];  
    raw_temp &= 0xFFFC;  
    return -46.85 + 175.72 * ((float)raw_temp / 65536.0);  
}  

void SystemClock_Config(void) {  
    // CubeMX自动生成的时钟配置代码  
}  
代码解读
  • 初始化模块
    系统初始化包括GPIO、I2C和UART模块的配置。STM32CubeMX工具自动生成这些代码,极大地减少了开发时间。
  • I2C通信实现

    • 使用HAL_I2C_Master_Transmit发送命令以启动温度测量。
    • 等待数据准备好后,调用HAL_I2C_Master_Receive读取返回的两字节数据。
  • 数据处理与输出
    传感器返回的原始数据经过公式转换,计算出实际温度,并通过UART接口打印到串口终端。

注意事项
  • 硬件连接时注意I2C线的上拉电阻配置,通常为4.7kΩ。
  • 如果出现通信问题,可通过逻辑分析仪查看波形,检查时序是否正确。
  • 温湿度传感器通常需要短暂延时等待数据稳定,实际项目中可根据数据手册调整延时。
扩展应用本文的实现可直接拓展至更多I2C传感器,例如压力传感器、气体传感器等。同时,STM32H743的强大性能也适合复杂的实时控制和数据处理任务,如FFT分析和图像处理。

使用特权

评论回复
沙发
公羊子丹| | 2024-11-30 07:44 | 只看该作者
太棒了!STM32H743性能确实强大,这个案例很实用!

使用特权

评论回复
板凳
周半梅| | 2024-11-30 08:13 | 只看该作者
有没有测试过采集频率的极限性能?

使用特权

评论回复
地板
帛灿灿| | 2024-11-30 08:16 | 只看该作者
温湿度传感器可以换成其他型号吗?适配起来复杂吗?

使用特权

评论回复
5
童雨竹| | 2024-11-30 08:17 | 只看该作者
I2C通信里延时如何精准控制?对实时性要求高的项目会有影响吗?

使用特权

评论回复
6
万图| | 2024-11-30 08:17 | 只看该作者
看了代码,HAL库封装得确实方便,学习了!

使用特权

评论回复
7
Wordsworth| | 2024-11-30 08:17 | 只看该作者
UART输出的波特率设置可以调高点,会不会更快?

使用特权

评论回复
8
Pulitzer| | 2024-11-30 08:17 | 只看该作者
这种实时数据采集能否同步保存到SD卡?

使用特权

评论回复
9
Bblythe| | 2024-11-30 08:18 | 只看该作者
I2C总线挂多个传感器时,地址冲突该怎么解决?

使用特权

评论回复
10
Clyde011| | 2024-11-30 08:18 | 只看该作者
你有用STM32H743跑过FreeRTOS吗?和裸机比有啥体验?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

3775

帖子

0

粉丝