新聞中心

EEPW首頁 > 測試測量 > 設(shè)計應(yīng)用 > 基于TI-MSPM0L1306用于對交流電壓的檢測項目

基于TI-MSPM0L1306用于對交流電壓的檢測項目

作者:汪波竹 時間:2024-12-17 來源:EEPW 收藏

1   簡介

本文引用地址:http://2s4d.com/article/202412/465550.htm

本交流電壓采樣系統(tǒng)是通過對交流電壓和電流的采樣,直觀的顯示出來。從而獲得在電力系統(tǒng)發(fā)生故障時,可以快速檢測到故障信號,如短路電流、接地電流,例如,通過分析電壓和電流的波形,可以判斷是否存在過電壓、過電流、諧波等問題,從而找出故障的根源。最重要的在實時監(jiān)控這些數(shù)據(jù)后可以立即切斷電源,保障人身和設(shè)備的安全,減少安全事故的發(fā)生。設(shè)計流程是這樣的:高壓交流電壓-> 電流傳感器->AD620 采樣放大-> 整流(AD轉(zhuǎn)換)->Mcu 檢測運算。

Bom表(寫明器件型號)

序號
名稱
型號
數(shù)量
備注
1開發(fā)板
LP- L1306
2
圖片
2USB轉(zhuǎn)串口
BML12_OM-
2
圖片
3LCD模組
PCB SSD1306
2
圖片
4采樣板
AD620/LM2904
2
圖片
5霍爾傳感器板
CKSR-50
1
圖片
6直流電源
MN-152D
1
圖片
7交流電插座
公牛16A
1
圖片

image.png

1

image.png

2

image.png

3

image.png

4

image.png image.png

5

image.png

6

image.png

7

2   硬件結(jié)構(gòu)圖

1734441805931692.png

image.png

(產(chǎn)品展示圖)

3   軟件開發(fā)

開發(fā)平臺:ti-ccs V12.7.0

4   外設(shè)的配置

本項目主要的外設(shè)由DCAC 電源(或市電)、DC電源、LCD 、采樣板配置為1M 的速率,同時開啟收接中斷,配置發(fā)送與接收的緩沖區(qū)。

1734465001282592.png

選擇ADC接口選擇PA25

1734465037947562.png

保存后生成工程。

1734465072939979.png

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驅(qū)動

/*i2c_app.c 文件*/

#include “i2c_app.h”

// 底層I2C 寫函數(shù)

bool HAL_I2C_Write(uint8_t dev_addr, uint8_t

*data, uint16_t length) {

// 底層I2C 寫操作

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

return true;

}

// 底層I2C 讀函數(shù)

bool HAL_I2C_Read(uint8_t dev_addr, uint8_t

*buffer, uint16_t length) {

// 底層I2C 讀操作

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

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

}

void I2C_Init(void) {

// 初始化I2C 硬件接口

// 這里是調(diào)用底層庫的初始化函數(shù)

// 例如: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) {

// 發(fā)送寄存器地址

if (!HAL_I2C_Write(dev_addr, &reg_addr, 1)) {

return false;

}

// 讀取數(shù)據(jù)

return HAL_I2C_Read(dev_addr, buffer,

length);

}

/*i2c_app.h 文件*/

#ifndef I2C_APP_H

#define I2C_APP_H

#include <stdint.h>

#include <stdbool.h>

// 初始化I2C 接口

void I2C_Init(void);

// 向I2C 設(shè)備寫入數(shù)據(jù)

bool I2C_Write(uint8_t dev_addr, uint8_t reg_

addr, uint8_t *data, uint16_t length);

// 從I2C 設(shè)備讀取數(shù)據(jù)

bool I2C_Read(uint8_t dev_addr, uint8_t reg_

addr, uint8_t *buffer, uint16_t length);

#endif // I2C_APP_H

在工程中添加i2c 的驅(qū)動封裝i2c_app.c/h

image.png

這個驅(qū)動封裝了讀寫兩個驅(qū)動,可實現(xiàn)與硬件低層的解耦。具體代碼見附件。

1734465224523729.png

// 發(fā)送起始信號和目標地址(包括寫位)

if ( I2C_MasterSendStart(OLED_I2C_

ADDRESS | I2C_WRITE) != I2C_NO_ERR) {

return -1; // 發(fā)送起始信號失敗

}

// 發(fā)送數(shù)據(jù)字節(jié)

if (I2C_MasterSendByte(cmd, true) != I2C_

NO_ERR) {

return -2; // 發(fā)送數(shù)據(jù)字節(jié)失敗

}

// I2C_MasterSendStop();

return 0; // 成功

}

7   LCD驅(qū)動程序

#include “delay.h”

#include “sys.h”

#include “l(fā)cd.h”

#include “touch.h”

#include “gui.h”

#include “test.h”

int main(void)

{

SystemInit();// 初始化RCC 設(shè)置系統(tǒng)主頻為

72MHZ

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

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

// 循環(huán)測試

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(); // 旋轉(zhuǎn)顯示測試

// 如果不帶觸摸,或者不需要觸摸功能,請注釋

掉下面觸摸屏測試項

}

}

8   程序流程圖

控制端

image.png

9   結(jié)束語

本項目主要是在利用Ti 的L1306這顆優(yōu)秀的MCU來實現(xiàn)對高壓電的監(jiān)控:Ti 的M0芯片采樣交流電壓和直流電壓,并顯示在顯示屏上的研發(fā)。LPL1306作為主控芯片,用電流傳感器從高壓交流線上獲取信號,經(jīng)過AD620/LM2904 放大, 再經(jīng)過整流處理,獲得采樣電壓給MCU 的AD 端,獲取數(shù)據(jù)后,mcu 通過算法,控制外線交流電壓。

TI 的MCU 在使用過程中展現(xiàn)出了高性能、低功耗和易于開發(fā)的特點。其豐富的外設(shè)接口和強大的處理能力使得開發(fā)者能夠快速地實現(xiàn)各種復(fù)雜的功能。同時,TI 還提供了完善的開發(fā)工具和文檔支持,使得開發(fā)過程更加順暢。

在系統(tǒng)中作為核心控制單元,負責整個系統(tǒng)的調(diào)度和管理。它接收來自各種傳感器的數(shù)據(jù),經(jīng)過處理后通過顯示器等外設(shè)進行輸出。同時,它還負責控制其他外設(shè)(如LED、蜂鳴器等)的開關(guān)和狀態(tài)。

此外, 還通過其低功耗特性確保了系統(tǒng)的長時間穩(wěn)定運行。

(本文來源于《EEPW》



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉