基于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顺畅通信啦。

程序代码实现

  1. 数据采集部分

从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位数据,最后拉高片选线。获取到原始数据后,再经过一系列运算就能得到实际的电压、电流等参数。

  1. 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项目,从原理图设计到程序代码实现,都围绕着精确采集和稳定通信展开。整个项目成熟稳定,对于想要深入了解电力参数测量和工业通信的朋友来说,是个不错的参考。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐