基于TI-MSPM0L1306用于對交流電壓的檢測項目
1 簡介
本文引用地址:http://m.butianyuan.cn/article/202412/465550.htm本交流電壓采樣系統(tǒng)是通過對交流電壓和電流的采樣,直觀的顯示出來。從而獲得在電力系統(tǒng)發(fā)生故障時,可以快速檢測到故障信號,如短路電流、接地電流,例如,通過分析電壓和電流的波形,可以判斷是否存在過電壓、過電流、諧波等問題,從而找出故障的根源。最重要的在實時監(jiān)控這些數(shù)據(jù)后可以立即切斷電源,保障人身和設備的安全,減少安全事故的發(fā)生。設計流程是這樣的:高壓交流電壓-> 電流傳感器->AD620 采樣放大-> 整流(AD轉換)->Mcu 檢測運算。
Bom表(寫明器件型號)
序號 | 名稱 | 型號 | 數(shù)量 | 備注 |
1 | 開發(fā)板 | LP- MSPM0L1306 | 2 | 圖片 |
2 | USB轉串口 | BML12_OM- | 2 | 圖片 |
3 | LCD模組 | PCB SSD1306 | 2 | 圖片 |
4 | 采樣板 | AD620/LM2904 | 2 | 圖片 |
5 | 霍爾傳感器板 | CKSR-50 | 1 | 圖片 |
6 | 直流電源 | MN-152D | 1 | 圖片 |
7 | 交流電插座 | 公牛16A | 1 | 圖片 |
1
2
3
4
5
6
7
2 硬件結構圖
(產(chǎn)品展示圖)
3 軟件開發(fā)
開發(fā)平臺:ti-ccs V12.7.0
4 外設的配置
本項目主要的外設由DCAC 電源(或市電)、DC電源、LCD 、采樣板配置為1M 的速率,同時開啟收接中斷,配置發(fā)送與接收的緩沖區(qū)。
選擇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 寫函數(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 硬件接口
// 這里是調用底層庫的初始化函數(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, ®_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ù)據(jù)
bool I2C_Write(uint8_t dev_addr, uint8_t reg_
addr, uint8_t *data, uint16_t length);
// 從I2C 設備讀取數(shù)據(jù)
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
這個驅動封裝了讀寫兩個驅動,可實現(xiàn)與硬件低層的解耦。具體代碼見附件。
// 發(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驅動程序
#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 設置系統(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(); // 旋轉顯示測試
// 如果不帶觸摸,或者不需要觸摸功能,請注釋
掉下面觸摸屏測試項
}
}
8 程序流程圖
控制端
9 結束語
本項目主要是在利用Ti 的MSPM0L1306這顆優(yōu)秀的MCU來實現(xiàn)對高壓電的監(jiān)控:Ti 的M0芯片采樣交流電壓和直流電壓,并顯示在顯示屏上的研發(fā)。LPMSPM0L1306作為主控芯片,用電流傳感器從高壓交流線上獲取信號,經(jīng)過AD620/LM2904 放大, 再經(jīng)過整流處理,獲得采樣電壓給MCU 的AD 端,獲取數(shù)據(jù)后,mcu 通過算法,控制外線交流電壓。
TI 的MCU 在使用過程中展現(xiàn)出了高性能、低功耗和易于開發(fā)的特點。其豐富的外設接口和強大的處理能力使得開發(fā)者能夠快速地實現(xiàn)各種復雜的功能。同時,TI 還提供了完善的開發(fā)工具和文檔支持,使得開發(fā)過程更加順暢。
MSPM0L1306 在系統(tǒng)中作為核心控制單元,負責整個系統(tǒng)的調度和管理。它接收來自各種傳感器的數(shù)據(jù),經(jīng)過處理后通過顯示器等外設進行輸出。同時,它還負責控制其他外設(如LED、蜂鳴器等)的開關和狀態(tài)。
此外,MSPM0L1306 還通過其低功耗特性確保了系統(tǒng)的長時間穩(wěn)定運行。
(本文來源于《EEPW》202412)
評論