基于STM32 + ATT7022芯片的三相交流电测量RTU项目分享
基于STM32+ATT7022芯片三相交流电测量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校验等。

基于STM32+ATT7022芯片三相交流电测量RTU 可测量电压、电流、功率、功率因素、频率、电量等参数,MCU主控为STM32F103C8T6,支持485通信,Modbus 协议,成熟稳定项目。 注意:只提原理图文件、程序代码

这个基于STM32 + ATT7022芯片的三相交流电测量RTU项目,从原理图设计到程序代码实现,都围绕着精确采集和稳定通信展开。整个项目成熟稳定,对于想要深入了解电力参数测量和工业通信的朋友来说,是个不错的参考。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)