基于STM32 + ATT7022芯片的三相交流电测量RTU项目分享
基于STM32ATT7022芯片三相交流电测量RTU 可测量电压、电流、功率、功率因素、频率、电量等参数MCU主控为STM32F103C8T6支持485通信Modbus 协议成熟稳定项目。 注意只提原理图文件、程序代码最近搞了个基于STM32 ATT7022芯片的三相交流电测量RTU项目感觉还挺有意思和大家分享下。这个项目可以测量电压、电流、功率、功率因素、频率、电量等一堆参数主控MCU用的是STM32F103C8T6 并且支持485通信采用Modbus 协议相当成熟稳定。原理图设计要点原理图设计是整个项目的基础。在这个项目里STM32F103C8T6与ATT7022芯片的连接至关重要。ATT7022负责采集三相交流电的各项数据然后将处理后的数据传输给STM32。比如说ATT7022的SPI接口要和STM32的SPI外设正确连接像SCK时钟线、MOSI主机输出从机输入、MISO主机输入从机输出以及CS片选线都要一一对应接好。// 简单示意SPI初始化代码假设用SPI1 void SPI_Init(void) { SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // PA5 - SCK, PA6 - MISO, PA7 - MOSI GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_Init(GPIOA, GPIO_InitStructure); SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }这里代码主要是对SPI1进行初始化先使能SPI1和对应的GPIO时钟然后配置GPIO口为复用推挽输出模式接着设置SPI的工作模式、数据大小、时钟极性等参数最后使能SPI1。通过这个SPI接口STM32就能和ATT7022顺畅通信啦。程序代码实现数据采集部分从ATT7022采集数据是关键。通过SPI读取ATT7022内部寄存器的值进而获取到电压、电流等原始数据。// 读取ATT7022寄存器示例代码 uint16_t ATT7022_ReadReg(uint8_t regAddr) { uint16_t data; SPI_CS_LOW; // 拉低片选 SPI_SendByte(regAddr | 0x80); // 发送读命令和寄存器地址 data SPI_ReceiveByte(); // 接收高字节 data 8; data | SPI_ReceiveByte(); // 接收低字节 SPI_CS_HIGH; // 拉高片选 return data; }这段代码实现了从ATT7022读取一个寄存器值的功能。先拉低片选线发送带有读命令的寄存器地址然后分两次接收16位数据最后拉高片选线。获取到原始数据后再经过一系列运算就能得到实际的电压、电流等参数。485通信与Modbus协议实现485通信部分主要依赖STM32的USART外设。而Modbus协议它规定了数据的传输格式和交互规则。// 简单的Modbus数据打包发送示例 void Modbus_SendData(uint8_t funcCode, uint16_t startAddr, uint16_t numRegs) { uint8_t buffer[10]; uint8_t crc[2]; buffer[0] SLAVE_ADDRESS; // 从机地址 buffer[1] funcCode; buffer[2] (startAddr 8) 0xFF; buffer[3] startAddr 0xFF; buffer[4] (numRegs 8) 0xFF; buffer[5] numRegs 0xFF; // 计算CRC校验 crc16(buffer, 6, crc); buffer[6] crc[0]; buffer[7] crc[1]; USART_SendData(USART1, buffer, 8); // 通过USART1发送数据 }这里简单演示了如何打包Modbus数据并发送。先填充从机地址、功能码、起始地址和寄存器数量等信息到缓冲区然后计算CRC校验值并添加到缓冲区末尾最后通过USART1发送出去。接收数据时也类似要按照Modbus协议解析接收到的数据验证CRC校验等。基于STM32ATT7022芯片三相交流电测量RTU 可测量电压、电流、功率、功率因素、频率、电量等参数MCU主控为STM32F103C8T6支持485通信Modbus 协议成熟稳定项目。 注意只提原理图文件、程序代码这个基于STM32 ATT7022芯片的三相交流电测量RTU项目从原理图设计到程序代码实现都围绕着精确采集和稳定通信展开。整个项目成熟稳定对于想要深入了解电力参数测量和工业通信的朋友来说是个不错的参考。