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或扫描左侧二维码关注)