考验是什么意思| 秽是什么意思| 什么是狂躁症| 吃藕是什么意思| 螺旋杆菌是什么病| 安乃近是什么药| 补钾用什么药| 部队政委是什么级别| 措施是什么意思| 手发痒是什么原因| 痔疮初期症状是什么| 做梦梦到狗是什么征兆| 1985年牛五行属什么| 有机和无机是什么意思| 提前来大姨妈是什么原因| 心脏疼是什么原因| 左室舒张功能减低吃什么药| 男大三后面一句是什么| 有的没的是什么意思| 属虎生什么属相宝宝好| 感冒咳嗽一直不好是什么原因| 孩子走路晚是什么原因| 逍遥丸治什么| 金鱼吊兰什么时候开花| 送奶奶什么礼物好| 总打嗝吃什么药| 什么地方| 收到是什么意思| 狗狗有什么品种| 发髻是什么意思| 劲酒兑什么饮料好喝| 什么是白条| 脑供血不足用什么药| 乙肝两对半和乙肝五项有什么区别| 断裂是什么意思| 肌肉拉伤吃什么药| 7.9是什么星座| 观察是什么意思| 虾线是什么| 伤口换药挂什么科啊| 河粉为什么叫河粉| 郭字五行属什么| 宫闱是什么意思| 脖子后面正中间有痣代表什么| 吃什么能去湿气| 什么时候拔牙最好| 孕妇甲胎蛋白偏高说明什么| 三岁看大七岁看老什么意思| 中秋节送什么好| 左侧卵巢无回声是什么意思| 杭州五行属什么| 胰腺上长瘤意味着什么| 肝囊肿是什么原因造成的| 人彘是什么| 专科女生学什么专业好| 女性放屁多是什么原因| 为什么痛风就痛一只脚| 为什么会打喷嚏| 金刚芭比什么意思| 红色学士服是什么学位| 眼睛闪光是什么症状| 金鱼的尾巴像什么| 罗京什么病| 什么叫做绝对值| 什么像什么什么| vintage什么意思| 均为是什么意思| 佩戴沉香有什么好处| 干眼症用什么眼药水| 居士什么意思| 吃粥配什么菜| 小孩铅过高有什么症状| 鼻子干燥是什么原因| 脑梗有什么特效药| 扁桃和芒果有什么区别| 舌尖发麻是什么原因引起的| 外阴又疼又痒用什么药| 雷诺综合征是什么病| 甘草泡水喝有什么好处和坏处| 肾结石是什么引起的| 什么是日间手术| 1月15号是什么星座| 军级相当于什么级别| 什么映雪| 独占鳌头是什么意思| 房间里放什么阳气旺| 想请假找什么理由好| 三伏天是什么意思| hpv病毒是什么病| 什么的尾巴有什么作用| 手淫导致的阳痿早泄吃什么药| 益生元和益生菌有什么区别| 性冷淡是什么| bhpc是什么牌子| 穿刺是什么意思| crispy是什么意思| 65岁属什么| 克隆是什么意思| 女性解脲支原体阳性是什么意思| 花斑癣用什么药膏好| 渡劫是什么意思| 0是什么意思网络语言| 过敏性鼻炎不能吃什么| 三点水加盆读什么| 怎么判断脸上是什么斑| 六月初五是什么星座| 成群结队是什么意思| 台风什么时候到上海| 割包皮看什么科| 尿中红细胞高是什么原因| 空调滴水是什么原因| 四维什么时候做最佳| 血压有点低是什么原因| 肺结节吃什么中成药| 腿发软无力是什么原因引起的| 营养心脏最好的药是什么药| 右肾钙化灶是什么意思| 什么是文科什么是理科| 帆船像什么| 逆钟向转位什么意思| tag什么意思| 乙肝病毒表面抗原阳性是什么意思| 撕裂是什么意思| 男性尿路感染有什么症状| heineken是什么啤酒| 五月七号是什么星座| 印第安纹是什么| 孕妇吃什么菜好| 做梦梦到剪头发是什么意思| 假牛肉干是什么做的| 除了火车什么车最长| 什么是年金| 手麻挂什么科室| 男士内裤什么材质的好| 桃子不能跟什么一起吃| 为什么有些人特别招蚊子| 手脚发胀是什么前兆| 没什么大不了| 尿隐血3十是什么病| 不拘小节是什么意思| 东坡肉属于什么菜系| 什么是双一流| 拔罐有什么作用和功效| 滴虫病女性有什么症状| Ecmo医学上是什么意思| 拉痢疾是什么症状| 新生儿满月打什么疫苗| 流产后不能吃什么东西| 三颗星是什么军衔| 哈伦裤配什么上衣好看| 定位是什么意思| 什么是疝气| 黄鼻涕是什么原因| 9月20日什么星座| 巨峰葡萄为什么叫巨峰| 血糖高吃什么药| 黄河水为什么是黄的| 人中附近长痘痘什么原因| 消渴症是什么病| 宝珀手表属于什么档次| 三个十念什么| 天蝎座女生配什么星座| 冬练三九夏练三伏是什么意思| 肾虚用什么补最好| 阿尔兹海默症吃什么药| 掉发严重是什么原因| 就绪是什么意思| 肠胃炎什么症状| 流量加油包是什么意思| 下午三点是什么时辰| 18号来月经什么时候是排卵期| 为什么老是梦见一个人| 榴莲有什么作用| 延年益寿的益是什么意思| 眼睛模糊什么原因| 6月13日什么星座| 什么叫双飞| 术前八项检查是什么| 收到是什么意思| 尿崩症吃什么药最有效| 鱼白是什么东西| 笑什么如花| 月经期血块多是什么原因| 蜱虫咬人后有什么症状| 以前没有狐臭为什么突然就有了| 辣椒有什么营养价值| 经常便秘吃什么药好| 风湿病吃什么药| 孔子是什么学派的创始人| 房间放什么可以驱蜈蚣| 梦见走错路是什么意思| 睡觉总是做梦是什么原因| 吃黄体酮有什么副作用| 舔逼什么感觉| 自豪的什么| 平均血红蛋白量偏高是什么意思| 安保是什么工作| 什么的冬天| 18kgp是什么材质| 做肠镜前一天可以吃什么| 梦见自己输液是什么意思| 儒家思想是什么意思| 什么胆什么心| 里正相当于现在什么官| 六允读什么| 戴玉对身体有什么好处| 什么是脑梗塞| 不锈钢肥皂是什么原理| 小蓝是什么| 完谷不化吃什么中成药| 一个目一个于念什么| 地三鲜是什么| 灼烧感是什么感觉| 状元红又叫什么荔枝| 现在是什么星座| 掩耳盗什么| 为什么一热脸就特别红| 海狗是什么| 灌顶是什么意思| 炸肺是什么意思| 误喝碘伏有什么伤害吗| 什么的月饼| 牡丹什么时候开花| 什么然| 灸石门为什么会不孕| 1977年属什么生肖| 喜欢趴着睡觉是什么原因| 萝卜干炒什么好吃| 淮山是什么| 回族为什么不吃猪肉| 肠胃不舒服吃什么药| 土豆有什么营养价值| 什么是猝死| 紫癜病是什么症状| 芒果吃了有什么好处| 柱镜是什么意思| 你好是什么意思| 211和985是什么意思| 积食是什么意思| 子宫囊肿严重吗有什么危害| 两脚发热是什么原因| 手抖看什么科| 太阳什么的什么的| 刘强东开什么车| 今年什么时候起伏| 血压高压高低压正常是什么原因| em是什么意思| 新白娘子传奇许仙为什么用女的演| 瓜尔佳氏现在姓什么| 吃什么可以| 警惕是什么意思| 丹田是什么意思| 为什么会有荨麻疹| 单个室早是什么意思| 囊肿是什么病| 12月出生是什么星座| 综合用地是什么性质| cfmoto是什么牌子| rice什么意思| 中伏是什么意思| 眼震是什么症状| 刀代表什么数字| lot是什么意思| 药店加盟需要什么条件| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? DIY与开源设计 ? 电子DIY ? 【功率监测与控制系统DIY活动过程贴】功率计与LabVIEW数据采集

共1条 1/1 1 跳转至

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

助工
2025-08-03 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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
坚韧不拔是什么生肖 蜱虫咬人后有什么症状 愣头青是什么意思 沁什么意思 排卵期出血是什么原因引起的
什么补血效果最好最快 复查是什么意思 替代品是什么意思 挥霍是什么意思 玖姿女装属于什么档次
月经第三天属于什么期 男士脸黑穿什么颜色好 老是打哈欠是什么原因 脑梗做什么检查 5岁属什么
cpr是什么意思 二五八万是什么意思 抬头纹开了是什么意思 颈椎增生吃什么药 ram是什么动物
让我随你去让我随你去是什么歌hcv8jop8ns8r.cn 舌苔黑是什么病hcv8jop6ns1r.cn 缺钾最忌讳吃什么helloaicloud.com 规格型号是什么意思hcv9jop6ns5r.cn 手筋痛是什么原因beikeqingting.com
脉冲是什么意思0735v.com 什么国家的钱最值钱hcv8jop9ns0r.cn 牙痛吃什么药效果最好hcv9jop2ns7r.cn 5个月宝宝可以吃什么水果hcv7jop5ns5r.cn 樱桃补什么cl108k.com
胃疼买什么药hcv9jop0ns4r.cn 女人戴什么招财又旺夫hcv8jop3ns7r.cn 狮子座前面是什么星座hcv9jop5ns8r.cn 类风湿关节炎吃什么药效果好hcv7jop6ns9r.cn 尿频尿急挂什么科hcv9jop3ns0r.cn
清创手术是什么意思hcv9jop1ns2r.cn 肺气肿吃什么食物好hcv9jop1ns8r.cn 阿玛尼手表算什么档次hcv9jop4ns0r.cn 什么是胶体hcv8jop3ns3r.cn 内痔疮吃什么药最好hcv8jop8ns3r.cn
百度