基于TI-MSPM0L1306用于对交流电压的检测项目

基于TI-MSPM0L1306用于对交流电压的检测项目
2024年12月18日 09:52 电子产品世界

1   简介

本文引用地址:

本交流电压采样系统是通过对交流电压和电流的采样,直观的显示出来。从而获得在电力系统发生故障时,可以快速检测到故障信号,如短路电流、接地电流,例如,通过分析电压和电流的波形,可以判断是否存在过电压、过电流、谐波等问题,从而找出故障的根源。最重要的在实时监控这些数据后可以立即切断电源,保障人身和设备的安全,减少安全事故的发生。设计流程是这样的:高压交流电压-> 电流传感器->AD620 采样放大-> 整流(AD转换)->Mcu 检测运算。

Bom表(写明器件型号)

1

2

3

4

5

6

7

2   硬件结构图

(产品展示图)
(产品展示图)
(产品展示图)

3   软件开发

开发平台:ti-ccs V12.7.0

4   外设的配置

本项目主要的外设由DCAC 电源(或市电)、DC电源、LCD 、采样板配置为1M 的速率,同时开启收接中断,配置发送与接收的缓冲区。

选择ADC接口选择PA25

保存后生成工程。

5   公共代码

void I2C_INST_IRQHandler(void)

{

switch (DL_I2C_getPendingInterrupt(I2C_

INST)) {

case DL_I2C_IIDX_CONTROLLER_RX_

DONE:

gI2cControllerStatus = I2C_STATUS_RX_

COMPLETE;

break;

case DL_I2C_IIDX_CONTROLLER_TX_

DONE:

DL_I2C_disableInterrupt(

I2C_INST, DL_I2C_INTERRUPT_

CONTROLLER_TXFIFO_TRIGGER);

gI2cControllerStatus = I2C_STATUS_TX_

COMPLETE;

break;

case DL_I2C_IIDX_CONTROLLER_

RXFIFO_TRIGGER:

gI2cControllerStatus = I2C_STATUS_RX_

INPROGRESS;

/* Receive all bytes from target */

w h i l e ( D L _ I 2 C _

isControllerRXFIFOEmpty(I2C_INST) != true) {

if (gRxCount < gRxLen) {

gRxPacket[gRxCount++] =

D L _ I 2 C _

receiveControllerData(I2C_INST);

} else {

/* Ignore and remove from FIFO if the

buffer is full */

DL_I2C_receiveControllerData(I2C_

INST);

}

break;

case DL_I2C_IIDX_CONTROLLER_

TXFIFO_TRIGGER:

gI2cControllerStatus = I2C_STATUS_TX_

INPROGRESS;

/* Fill TX FIFO with next bytes to send */

if (gTxCount < gTxLen) {

gTxCount + = DL_I2C_

fillControllerTXFIFO(

I2C_INST, &gTxPacket[gTxCount],

gTxLen - gTxCount);

}

break;

/* Not used for this example */

case DL_I2C_IIDX_CONTROLLER_

ARBITRATION_LOST:

case DL_I2C_IIDX_CONTROLLER_

NACK:

if ((gI2cControllerStatus == I2C_

STATUS_RX_STARTED) ||

(gI2cControllerStatus == I2C_STATUS_

TX_STARTED)) {

/ * NACK interrupt if I2C Target is

disconnected */

gI2cControllerStatus = I2C_STATUS_

ERROR;

}

case DL_I2C_IIDX_CONTROLLER_

RXFIFO_FULL:

case DL_I2C_IIDX_CONTROLLER_

TXFIFO_EMPTY:

case DL_I2C_IIDX_CONTROLLER_

START:

case DL_I2C_IIDX_CONTROLLER_STOP:

case DL_I2C_IIDX_CONTROLLER_

EVENT1_DMA_DONE:

case DL_I2C_IIDX_CONTROLLER_

EVENT2_DMA_DONE:

default:

break;

}

6   IIC驱动

/*i2c_app.c 文件*/

#include “i2c_app.h”

// 底层I2C 写函数

bool HAL_I2C_Write(uint8_t dev_addr, uint8_t

*data, uint16_t length) {

// 底层I2C 写操作

// 返回true 表示成功,false 表示失败

return true;

}

// 底层I2C 读函数

bool HAL_I2C_Read(uint8_t dev_addr, uint8_t

*buffer, uint16_t length) {

// 底层I2C 读操作

// 返回true 表示成功,false 表示失败

return true; // 示例中总是返回成功

}

void I2C_Init(void) {

// 初始化I2C 硬件接口

// 这里是调用底层库的初始化函数

// 例如:HAL_I2C_Init(&hi2c1);

}

bool I2C_Write(uint8_t dev_addr, uint8_t reg_

addr, uint8_t *data, uint16_t length) {

uint8_t tx_buffer[length + 1]; // +1 for register

address

tx_buffer[0] = reg_addr;

for (uint16_t i = 0; i < length; i++) {

tx_buffer[i + 1] = data[i];

}

return HAL_I2C_Write(dev_addr, tx_buffer,

length + 1);

}

bool I2C_Read(uint8_t dev_addr, uint8_t reg_

addr, uint8_t *buffer, uint16_t length) {

// 发送寄存器地址

if (!HAL_I2C_Write(dev_addr, ®_addr, 1)) {

return false;

}

// 读取数据

return HAL_I2C_Read(dev_addr, buffer,

length);

}

/*i2c_app.h 文件*/

#ifndef I2C_APP_H

#define I2C_APP_H

#include

// 初始化I2C 接口

void I2C_Init(void);

// 向I2C 设备写入数据

bool I2C_Write(uint8_t dev_addr, uint8_t reg_

addr, uint8_t *data, uint16_t length);

// 从I2C 设备读取数据

bool I2C_Read(uint8_t dev_addr, uint8_t reg_

addr, uint8_t *buffer, uint16_t length);

#endif // I2C_APP_H

在工程中添加i2c 的驱动封装i2c_app.c/h

这个驱动封装了读写两个驱动,可实现与硬件低层的解耦。具体代码见附件。

// 发送起始信号和目标地址(包括写位)

if ( I2C_MasterSendStart(OLED_I2C_

ADDRESS | I2C_WRITE) != I2C_NO_ERR) {

return -1; // 发送起始信号失败

}

// 发送数据字节

if (I2C_MasterSendByte(cmd, true) != I2C_

NO_ERR) {

return -2; // 发送数据字节失败

}

// I2C_MasterSendStop();

return 0; // 成功

}

7   LCD驱动程序

#include “delay.h”

#include “sys.h”

#include “lcd.h”

#include “touch.h”

#include “gui.h”

#include “test.h”

int main(void)

{

SystemInit();// 初始化RCC 设置系统主频为

72MHZ

delay_init(72); // 延时初始化

LCD_Init(); // 液晶屏初始化

// 循环测试

while(1)

{

main_test(); // 测试主界面

Test_Color(); // 简单刷屏填充测试

Test_FillRec(); //GUI 矩形绘图测试

Test_Circle(); //GUI 画圆测试

Test_Triangle(); //GUI 三角形绘图测试

English_Font_test(); // 英文字体示例测试

Chinese_Font_test(); // 中文字体示例测试

Pic_test(); // 图片显示示例测试

Rotate_Test(); // 旋转显示测试

// 如果不带触摸,或者不需要触摸功能,请注释

掉下面触摸屏测试项

}

8   程序流程图

控制端

9   结束语

本项目主要是在利用Ti 的MSPM0L1306这颗优秀的MCU来实现对高压电的监控:Ti 的M0芯片采样交流电压和直流电压,并显示在显示屏上的研发。LPMSPM0L1306作为主控芯片,用电流传感器从高压交流线上获取信号,经过AD620/LM2904 放大, 再经过整流处理,获得采样电压给MCU 的AD 端,获取数据后,mcu 通过算法,控制外线交流电压。

TI 的MCU 在使用过程中展现出了高性能、低功耗和易于开发的特点。其丰富的外设接口和强大的处理能力使得开发者能够快速地实现各种复杂的功能。同时,TI 还提供了完善的开发工具和文档支持,使得开发过程更加顺畅。

MSPM0L1306 在系统中作为核心控制单元,负责整个系统的调度和管理。它接收来自各种传感器的数据,经过处理后通过显示器等外设进行输出。同时,它还负责控制其他外设(如LED、蜂鸣器等)的开关和状态。

此外,MSPM0L1306 还通过其低功耗特性确保了系统的长时间稳定运行。

电压
新浪科技公众号
新浪科技公众号

“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)

创事记

科学探索

科学大家

苹果汇

众测

专题

官方微博

新浪科技 新浪数码 新浪手机 科学探索 苹果汇 新浪众测

公众号

新浪科技

新浪科技为你带来最新鲜的科技资讯

苹果汇

苹果汇为你带来最新鲜的苹果产品新闻

新浪众测

新酷产品第一时间免费试玩

新浪探索

提供最新的科学家新闻,精彩的震撼图片