色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

          1   簡介

          本文引用地址:http://cafeforensic.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ā)送起始信號和目標(biāo)地址(包括寫位)

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

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

          (本文來源于《EEPW》



          評論


          相關(guān)推薦

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

          關(guān)閉