计算机二级什么时候查成绩| 爷爷的爸爸叫什么| hb是什么意思医学| 鼠疮是什么病| 7.7是什么星座| 鸡胸挂什么科| 拉疙瘩屎是什么原因| 血清铁蛋白是检查什么| 梅毒的病原体是什么| 什么叫酮症酸中毒| 行政许可是什么意思| 过敏性皮炎吃什么药好| 前列腺不能吃什么食物| 脑补是什么意思| 病毒性扁桃体发炎吃什么药| 胃痉挛吃什么药最有效| 为什么会长湿疹| 减肥晚上可以吃什么| 混社会的人一般干什么| ag是什么意思| 友人是什么意思| 晚上六点半是什么时辰| 黄瓜为什么会发苦| 内膜薄吃什么增长最快| 出淤泥而不染是什么意思| 黄芪精适合什么人喝| 月经不调吃什么药效果好| 流鼻血不止是什么原因| 被蚊子咬了涂什么药膏| 13朵玫瑰代表什么意思| 7o年属什么生肖| 冢字的意思是什么| 胎位lop是什么意思| 喻字五行属什么| 可尔必思是什么饮料| 唾液酸是什么| 船只是什么意思| 有事钟无艳无事夏迎春是什么意思| 吃什么瘦肚子脂肪最快| 芒果像什么比喻句| 肠道消炎用什么药最好| 院感是什么意思| 农历七月是什么星座| 难能可贵是什么意思| 食欲亢进是什么意思| 天上的星星是什么| 犯贱是什么意思| 动脉血检查是检查什么| 甲状腺球蛋白抗体低说明什么| 四肢无力是什么病| 三观不合指的是什么| 吃什么清肝火最快| 白带发黄是什么原因| 土命适合什么颜色| 纤维瘤挂什么科| 肠息肉是什么| 胃溃疡吃什么食物| 龟苓膏有什么功效| 吃什么东西排酸最快| 屎是黑色的是什么原因| 男性吃什么可以壮阳| levi是什么意思| 寄大件用什么物流便宜| 肝郁血瘀吃什么中成药| 气血不足吃什么中药| 鲍鱼是什么意思| 天台是什么意思| 每天坚持做俯卧撑有什么好处| 贻笑大方是什么意思| 89年的属什么| 石乐读什么| 吃什么补镁| 尿胆原高是什么原因| 匈奴是什么民族| 一个家庭最重要的是什么| 左耳疼痛什么原因引起| 回春是什么意思| 古代宫刑是什么| 全能教是什么| 膝关节积液是什么原因造成的| 中国第一个不平等条约是什么| 猫薄荷是什么| giordano是什么牌子| 晚上吃什么不长肉| 面试要带什么| 伊拉克是什么人种| 晚上一直做梦是什么原因引起的| 怀孕初期会有什么症状| 阿赖耶识是什么意思| 月经提前量少是什么原因| 紫苏是什么东西| 什么的叮咛| 陈皮有什么作用| 丑什么意思| 什么是阴虚| 宫腔粘连是什么原因引起的| 辅警是什么| 胀气吃什么食物好| 你在左边我紧靠右是什么歌| dha中文叫什么| 肚脐连着什么器官| 省政协常委是什么级别| 十月二十八是什么星座| 摸摸头是什么意思| 什么是软饮料| 住院报销需要什么材料| 锴字五行属什么| 尿道发炎吃什么药| 为什么吃荔枝会上火| 梦见婆婆是什么意思| 举足轻重是什么生肖| 清关是什么| 87年五行属什么| 殊途同归是什么意思| 吃什么奶水会增多| 三七粉有什么功效| 菩提手串有什么寓意| 口干口苦挂什么科| 1月生日是什么星座| 水瓶座是什么星座| 喜用神是什么意思| 前方起飞是什么意思| 迪拜货币叫什么| 硕字五行属什么| 舌头中间裂纹是什么病| 龙蛇混杂是什么意思| 尿路感染吃什么药比较好的快| 高压偏低是什么原因造成的| 甲字五行属什么| 老烂腿用什么药最好| 指甲发白是什么原因| 什么病能办低保| 宫禁糜烂用什么药| 足踝外科主要看什么| 值神天刑是什么意思| 湿疹用什么药膏| 戒指戴左手中指是什么意思| 西红柿生吃有什么好处| 白蛋白是什么意思| 睑腺炎是什么原因造成| 男人肾虚吃什么最补| b票能开什么车| 痔疮用什么药好| 七六年属什么| 细菌感染吃什么药好| 药店最怕什么样的举报| 什么水果养胃又治胃病| 辅助生殖是什么意思| 深v是什么意思| 肚子大是什么原因造成的| 水洗标是什么| 乙肝五项25阳性是什么意思| 刷牙时牙酸是什么原因| 左耳疼痛什么原因引起| 相对密度是什么意思| 做梦梦见考试是什么意思| 高血压不能吃什么| 气血不足吃什么补得快| 上皮细胞是什么意思| 好无奈是什么意思| 言外之意是什么意思| 用盐泡脚有什么好处| 潮喷是什么感觉| 静脉曲张做什么检查| 前庭大腺囊肿是什么原因引起的| 钻石是什么材质| 嗓子沙哑吃什么药| 脚麻是什么原因| 免冠是什么意思| 为什么会有口臭| 他喵的什么意思| 吃什么通大便最快| 为什么会偏头痛| 皮肤黄适合穿什么颜色的衣服| 三维b片主治什么病| 热敷眼睛有什么好处| 不动明王是什么属相的本命佛| 为什么睡不着觉会胡思乱想| ks是什么意思| 表彰是什么意思| 欧字五行属什么| 为什么感冒会头痛| 做蛋糕用什么面粉| 亚米是什么意思| 什么叫胆汁反流性胃炎| 阴道杆菌是什么意思| au750是什么意思| 吃什么菜对肝好怎么养肝| 盐碱地适合种什么农作物| 头顶爱出汗是什么原因| 双相是什么| 赤小豆和红豆有什么区别| 饣与什么有关| 补肝血吃什么药| 梦特娇属于什么档次| 什么血压计最准确| 着重号是什么符号| 解除是什么意思| 骨蒸潮热是什么意思| 四月二十一是什么星座| 高压是什么意思| 1985年属什么生肖| 斑秃去医院挂什么科| 子宫脱落有什么症状| 相向是什么意思| 不孕不育的症状是什么| 拉拉裤后面的胶片是做什么用的| 布洛芬起什么作用| 恏是什么意思| 西瓜不能和什么一起吃| 荔枝和什么不能一起吃| 面碱是什么| 食人鱼长什么样子| 杜鹃花什么时候开| 什么物流寄大件便宜| 黄精吃了有什么好处| 生命线分叉代表什么| pose什么意思| abo是什么| 染色体是由什么组成的| 毛肚是什么东西| 米娜桑是什么意思| 宝宝入盆有什么感觉| 拉红色的屎是什么原因| 什么是静脉血栓| 牛欢喜是什么| 头皮毛囊炎用什么药| 益生菌什么时候吃好| 吃什么快速排便| 冷暴力是什么意思| 本子是什么意思| 中华文化的精髓是什么| 尿酸高肌酐高是什么原因呢| 悸动什么意思| 猎奇什么意思| 尿酸是什么意思| 阿司匹林治疗什么病| 摩羯前面是什么星座| 代谢是什么意思| 一片片什么| 口腔上火吃什么药| 腰椎间盘突出有什么症状| 葛优躺是什么意思| 淼念什么| 舌战群儒是什么意思| 真金白银是什么意思| ok镜是什么| 世界第一长河是什么河| 蜂胶有什么作用和功效| 蛋白质是由什么组成的| 什么是食物链| 火高念什么| 猫什么时候绝育| 生小孩需要准备什么| 舌苔白厚是什么原因| 喝什么能解酒| 迷糊是什么原因| 手上的线分别代表什么图解| 什么是高情商| 胆摘除对身体有什么影响| 7月15号是什么星座| 什么花在什么时间开| 11月份生日是什么星座| 女性肝囊肿要注意什么| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? DIY与开源设计 ? 电子DIY ? 【功率监测与控制系统DIY活动过程贴】功率计与LabVIEW数据采集

共1条 1/1 1 跳转至

【功率监测与控制系统DIY活动过程贴】功率计与LabVIEW数据采集

助工
2025-08-04 00:44:46     打赏
百度 这究竟是怎么一回事呢?“我们也是被逼无奈,毕竟假期里的教育资源也相当紧张。

【功率监测与控制系统DIY活动过程贴】功率计与LabVIEW数据采集

本文介绍了 NUCLEO-F411RE 开发板通过硬件 I2C 实现 INA219 功率传感器的驱动与 OLED 显示的功率计,并进一步结合 LabVIEW 上位机,通过串口中断采集功率数据的项目设计。

项目介绍

一、介绍 LabVIEW 软件及其关键组件、工具、模块、VISA 串口程序包等;

二、使用 STM32CubeMX 新建工程,并添加驱动工程代码、串口中断查询代码;

三、创建 LabVIEW 上位机,通过串口发送指令,获取 INA219 传感器数据功率信息;

四、运行 LabVIEW 上位机程序, OLED 实时显示电压、电流和功率信息,同时 LabVIEW 前面板显示功率演化曲线、数据保存,实现功率演化数据的采集。

LabVIEW

LabVIEW (Laboratory Virtual Instrument Engineering Workbench)是 National Instruments(NI)公司开发的一种图形化编程语言。主要用于数据采集、仪器控制、工业自动化以及测试测量系统的开发。

2023年,NI 被艾默生电气(Emerson)收购。

关键组件

1.前面板(Front Panel) 用户交互界面,包含按钮、图表、指示灯等控件。

2.程序框图(Block Diagram) 图形化编程区域,通过连线连接函数、结构和子VI。

3. VI(Virtual Instrument) LabVIEW程序的基本单元,每个VI包含前面板和程序框图,可嵌套使用。

4. 工具包与模块

DAQmx:数据采集驱动;

Vision Development Module:机器视觉处理;

LabVIEW NXG:新一代Web化设计工具。

详见:艾默生旗下测试和测量系统 - NI .


硬件连接

PB9 ---- SDA (INA219)

PB10 ---- SCL (INA219)

PB7 ---- SDA (OLED)

PB6 ---- SCL (OLED)

GND (INA219) ---- Negative (Motor) ---- Negative (Power Supply)

IN+ (INA219) ---- Positive (Power Supply)

IN- (INA219) ---- Positive (Motor)


示意图

oled_motor_ina219_power_uart.jpg


实物连接

uart_ina219_empty.jpg


工程创建

实现 INA219 和 OLED 的硬件 IIC 驱动、串口中断查询信息。

这里使用 STM32CubeMX 快速创建工程。

1.打开 STM32CubeMX 软件,新建 ST 板卡工程;

2.时钟配置:采用默认设置,系统时钟频率 84MHz;

3. Pinout & Configuration 标签下选择 Connectivity - 使能 I2C1 和 I2C2 以及 USART2 ;

4. 勾选使能串口中断,以实现串口发送指令查询数据;

labview_ina219_uart.jpg


5.配置完成后,进入 Project Manager 标签栏,进行项目命名、保存路径设置、编译器选择等操作;

6.点击 Generate Code 按钮,使用 STM32CubeIDE 或 Keil 打开目标工程;

7.编译工程,0 error, 0 warning .


工程代码

结合前面关于 OLED 屏幕以及 INA219 传感器的硬件 IIC 驱动方案,添加 oled.h 、 oled.c 、 oledfont.h 、ina219.h、ina219.c 文件至指定路径。

添加代码实现 printf 重定向、串口输出浮点型数据

    1.进入项目资源管理器,右键项目,选择属性;

    2.在弹出的对话框中,选择 C/C++ Build ,展开 C/C++ Build 并选择 Settings ;

    3.选择 Tool Settings - MCU Settings ;

    4.勾选 Use float with printf from newlib-nano (-u printf float) ;

    5.点击 Apply 应用自动重新构建项目,点击 Apply and Close 保存配置。

    6.右键项目 - 属性 - C/C++ Build - Setting - Tool Settings - MCU GCC Linker - Miscellaneous - Other flags - 点击添加符号,输入 -u_printf_float ,应用并关闭。

详见:【功率监测与控制系统DIY活动过程贴】OLED显示【功率监测与控制系统DIY活动过程贴】INA219功率信息检测与实时显示 .

流程图

flowchart_labview.jpg

main.c 关键代码如下

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "ina219.h"
#include "stdio.h"
#include "oled.h"
#include "string.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* -------- Private variables ------*/
#define CMD_LENGTH 3
uint8_t uart_rx_buffer[CMD_LENGTH];  // 接收指令缓冲区
uint8_t uart_rx_index = 0;          // 接收索引
uint8_t command_received = 0;       // 指令接收完成标志
/* USER CODE END PTD */

/* USER CODE BEGIN PD */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
 HAL_UART_Transmit(&huart2, (uint8_t*)&ch,1,HAL_MAX_DELAY);
    return ch;
}
/* USER CODE END PD */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void process_command(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// 串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2) {
        uart_rx_index++;
        if(uart_rx_index >= CMD_LENGTH) {
            uart_rx_index = 0;
            command_received = 1;  // 设置指令接收完成标志
        }
        // 重新启动接收
        HAL_UART_Receive_IT(&huart2, &uart_rx_buffer[uart_rx_index], 1);
    }
}

// 处理接收到的指令
void process_command(void)
{
    // 检查指令前缀是否为0x55 0xAA
    if(uart_rx_buffer[0] == 0x55 && uart_rx_buffer[1] == 0xAA)
    {
        switch(uart_rx_buffer[2])
        {
            case 0x10:  // 读取电压
            {
                float busVoltage = INA219_GetBusVoltage_V();
                printf("%.2f\r\n",busVoltage);
                break;
            }

            case 0x11:  // 读取电流
            {
                float current = INA219_GetCurrent_mA();
                printf("%.2f\r\n",current);
                break;
            }

            case 0xFF:  // 读取功率
            {
                float power = INA219_GetPower_mW();
                printf("%.2f\r\n",power);
                break;
            }

            default:
                // 无效指令,可以发送错误码
                uint8_t error_code = 0xEE;
                HAL_UART_Transmit_IT(&huart2, &error_code, 1);
                break;
        }
    }
    command_received = 0;  // 清除标志
}

void data_display()
{
     float busVoltage = INA219_GetBusVoltage_V();
  //float shuntVoltage = INA219_GetShuntVoltage_mV();
  float current = INA219_GetCurrent_mA();
  float power = INA219_GetPower_mW();
  OLED_ClearLinePart(2, 45, 99);
  OLED_ClearLinePart(3, 45, 99);
  OLED_ShowDecimal(45,2,current,2,2,16,0);
  OLED_ClearLinePart(4, 45, 99);
  OLED_ClearLinePart(5, 45, 99);
  OLED_ShowDecimal(45,4,busVoltage,2,2,16,0);
  OLED_ClearLinePart(6, 45, 99);
  OLED_ClearLinePart(7, 45, 99);
  OLED_ShowDecimal(45,6,power,2,2,16,0);
}
/* USER CODE END 0 */

int main(void)
{
  HAL_Init();

  /* USER CODE BEGIN Init */
  INA219_Init(&hi2c2);
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_I2C2_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  // 启动串口接收中断
  HAL_UART_Receive_IT(&huart2, &uart_rx_buffer[0], 1);
  // OLED display frame
      OLED_Init();
       OLED_Clear();
       /* --- 1st row --- */
       OLED_ShowString(0,0,"DIY",16,1); // DIY
       OLED_ShowCHinese(24,0,0,1); // 功
       OLED_ShowCHinese(39,0,1,1); // 率
       OLED_ShowCHinese(54,0,2,1); // 监
       OLED_ShowCHinese(69,0,3,1); // 测
       OLED_ShowCHinese(84,0,4,1); // 与
       OLED_ShowCHinese(99,0,5,1); // 控
       OLED_ShowCHinese(113,0,6,1); // 制
       /* --- 2nd row --- */
       OLED_ShowCHinese(0,2,7,0); // 电
       OLED_ShowCHinese(15,2,9,0); // 流
       OLED_ShowChar(30,2,':',16,0);
       OLED_ShowString(100,2,"mA",16,0);
       /* --- 3rd row --- */
       OLED_ShowCHinese(0,4,7,0); // 电
       OLED_ShowCHinese(15,4,8,0); // 压
       OLED_ShowChar(30,4,':',16,0);
       OLED_ShowString(100,4,"V",16,0);
       /* --- 4th row --- */
       OLED_ShowCHinese(0,6,0,0); // 功
       OLED_ShowCHinese(15,6,1,0); // 率
       OLED_ShowChar(30,6,':',16,0);
       OLED_ShowString(100,6,"mW",16,0);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE BEGIN 3 */
   if(command_received)
   {
    process_command();
    data_display();
   }
   HAL_Delay(0);
  }
  /* USER CODE END 3 */
}

★ 注意用户自定义代码需写入 /* USER CODE BEGIN x */ 和 /* USER CODE END x */ 之间,确保CubeMX再次生成工程,代码不会被覆盖。

保存代码,编译工程,运行程序,则固件上传至 NUCLEO-F411RE 开发板,程序运行。

LabVIEW 上位机

介绍了 LabVIEW 上位机向开发板发送串口指令,获取 INA219 传感器电压和电流数据,并绘制功率数值演化曲线。

前面板

功能实现:

1.配置串口

2.运行程序

3.点击 Start 开始采集数据

4.点击 Stop 停止采集

5.点击 Terminate 终止程序。

labview_ina219_uart_motor_panel.jpg

程序框图

Page 1

labview_ina219_uart_motor_block1.jpg

Page 2

labview_ina219_uart_motor_block2.jpg

效果

打开串口调试助手,以十六进制发送 55 AA 10 获得电压信息,发送 55 AA 11 获得电流信息,发送 55 AA FF 获得功率信息。

LabVIEW 上位机演示

演示了开启电机瞬间的电压、电流以及功率的变化情况。

INA219_power_labview_uart.gif

分析

可以看出,直接采集 INA219 传感器获取的数据存在较大的抖动,可采取 滤波算法 (软件滤波、低通滤波、滑动平均等)进行参数优化,使输出功率更为稳定、更符合实际情况。


总结

本文介绍了 NUCLEO-F411RE 开发板通过硬件 I2C 实现 INA219 功率传感器的驱动与 OLED 显示,并进一步结合 LabVIEW 上位机,通过串口中断采集功率数据的项目设计,为相关产品及项目的开发设计提供了参考。





关键词: 功率     监测     LabVIEW     数据采集     INA219    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
容易放屁是什么原因 海星吃什么 竖心旁有什么字 发烧应该挂什么科 石钟乳是什么意思
7.7是什么星座 亚马逊是什么 但微颔之的之是什么意思 包饺子是什么意思 96122是什么电话
喉咙一直有痰是什么原因 女娲姓什么 万艾可是什么 边缘性脐带入口是什么意思 5点到7点是什么时辰
血稠吃什么食物好得快 送伞代表什么意思 袁字五行属什么 什么样的小鱼 奇货可居是什么意思
底细是什么意思luyiluode.com 人的脾脏起什么作用hcv7jop9ns8r.cn 主动脉壁钙化是什么意思hcv8jop2ns0r.cn 岁月不饶人是什么意思hcv9jop0ns1r.cn 尿常规隐血弱阳性什么意思hcv8jop0ns4r.cn
抓龙筋什么意思hcv7jop9ns7r.cn 胆囊炎吃什么药效果最好hcv9jop2ns8r.cn 吃海参有什么功效sanhestory.com 手麻是什么引起的hcv7jop7ns2r.cn 姨妈没来是什么原因hcv8jop6ns6r.cn
小肚子大是什么原因hcv8jop7ns5r.cn 什么东东hcv8jop7ns4r.cn 叶酸偏高有什么影响zsyouku.com 鱼什么而什么hcv7jop5ns2r.cn 消渴症是什么病hcv9jop6ns1r.cn
厥阴病是什么意思hcv7jop9ns7r.cn anca是什么检查hcv8jop7ns9r.cn 膀胱破裂什么症状hcv8jop2ns7r.cn ai是什么bjhyzcsm.com 怀孕了胃不舒服是什么原因hcv8jop4ns1r.cn
百度