当前位置: 首页 > news >正文

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。

1.1 系统主要特点

  1. 高精度数字电源控制:利用STM32G4的高性能ADC和定时器,实现精确的电压电流控制。
  2. 多模块协同工作:通过CAN总线实现多个电源模块的协同控制和负载均衡。
  3. 实时监控和保护:集成过压、过流、过温等多重保护机制,确保系统安全可靠。
  4. 远程配置和固件更新:支持通过RS485接口进行远程参数配置和固件更新。
  5. 高效率运行:采用先进的Buck/Boost拓扑和动态PFC技术,实现高效能量转换。

1.2 技术栈概览

  • 微控制器:STM32G474RE (STM32G4系列)
  • 操作系统:ChibiOS/RT 21.11.1
  • 电源管理:数字控制Buck/Boost转换器
  • 电流感应:INA226高精度电流检测芯片
  • 通信接口:CAN 2.0B, RS485 (Modbus RTU)
  • 数据采集:内置12位SAR ADC, 5MSPS采样率
  • 控制算法:数字PID控制,自适应控制
  • 人机界面:0.96" OLED显示屏,旋转编码器
  • 数据存储:W25Q64 8MB SPI Flash
  • 开发工具:STM32CubeIDE 1.9.0, Qt 5.15.2

2. 系统设计

2.1 硬件设计

系统硬件架构如下:

 

2.1.1 核心控制器

选用STM32G474RE,其主要特性包括:

  • ARM Cortex-M4内核,170MHz主频
  • 512KB Flash, 128KB SRAM
  • 5个12位ADC,采样率高达5MSPS
  • 7个高级定时器,支持高分辨率PWM
2.1.2 电源转换电路

采用同步整流Buck/Boost拓扑,主要组件:

  • 功率MOSFET:IPB020N10N3 (100V, 90A)
  • 驱动IC:UCC27211A-Q1
  • 输出电感:IHLP-5050FD-01 (10μH)
  • 输出电容:TDK C5750X6S2W225K250KA (2.2μF, 450V)

Buck/Boost拓扑允许系统在输入电压高于或低于输出电压时都能正常工作,提高了系统的适应性。同步整流技术显著提高了转换效率,特别是在高电流输出时。

2.1.3 电流检测

采用Texas Instruments的INA226高精度电流检测芯片:

  • 16位ADC,可测量范围±81.92mV
  • 精度:量程的0.1%
  • I2C接口,可编程采样速率
  • 内置校准和告警功能

将INA226与一个10mΩ精密分流电阻配合使用,可以实现高达±8.192A的电流测量范围。

2.1.4 通信接口
  1. CAN接口

    • 使用STM32G4内置的FDCAN控制器
    • 外部CAN收发器:TJA1044GT (5Mbps高速CAN)
    • 支持CAN 2.0B协议,用于多模块通信
  2. RS485接口

    • 使用STM32G4的UART接口
    • 外部RS485收发器:MAX3485
    • 支持Modbus RTU协议,用于远程监控和配置
2.1.5 人机界面
  • OLED显示屏:0.96英寸,128x64分辨率,SSD1306控制器
  • 旋转编码器:PEC11R-4215F-S0024 (24步/圈),用于用户输入
2.1.6 数据存储

采用Winbond W25Q64JVSSIQ 8MB SPI Flash:

  • 支持SPI/Dual SPI/Quad SPI接口
  • 100,000次编程/擦除周期
  • 用于存储系统日志和配置参数
2.1.7 温度监测

使用MAX31855KASA+热电偶数字转换器:

  • 冷端补偿K型热电偶数字转换器
  • 14位分辨率,0.25°C
  • SPI接口
  • 用于监测关键部件温度,实现过温保护

2.2 软件设计

软件架构采用分层设计,如下图所示:

 

2.2.1 操作系统

采用ChibiOS/RT 21.11.1实时操作系统:

  • 优先级基于的抢占式多任务调度
  • 低内存占用(约8KB ROM,2KB RAM)
  • 快速上下文切换(约200个时钟周期)
  • 丰富的同步原语(互斥量、信号量、事件标志等)
2.2.2 主要软件模块
  1. 电源控制模块

    • 实现数字PID控制算法
    • 自适应控制策略,根据负载变化调整参数
    • PWM生成与同步整流控制
  2. 数据采集模块

    • 高速ADC采样(电压、电流)
    • INA226电流检测芯片数据读取
    • 温度数据采集和处理
  3. 保护机制模块

    • 过压保护
    • 过流保护
    • 过温保护
    • 软启动控制
  4. 通信模块

    • CAN协议栈实现(多模块通信)
    • Modbus RTU协议实现(远程监控)
  5. 人机界面模块

    • OLED显示驱动
    • 旋转编码器输入处理
    • 菜单系统实现
  6. 数据存储模块

    • Flash读写驱动
    • 日志记录系统
    • 参数存储与恢复
  7. 系统管理模块

    • 任务调度
    • 电源状态管理
    • 错误处理和系统恢复
2.2.3 任务划分
任务名称优先级周期功能描述
controlTask100μs电源控制算法执行
adcTask200μsADC数据采集和处理
protectionTask1ms系统保护检查
communicationTask10ms通信协议处理
uiTask50ms用户界面更新
dataLogTask1s数据记录到Flash
2.2.4 关键算法实现
2.2.4.1 PID控制算法

PID(比例-积分-微分)控制是电源管理系统中最核心的算法之一,用于精确控制输出电压和电流。

typedef struct {float Kp, Ki, Kd;           // PID参数float error_sum, last_error; // 积分误差和上一次误差float output_min, output_max; // 输出限幅
} PID_Controller;float PID_Update(PID_Controller* pid, float setpoint, float measurement) {float error = setpoint - measurement;// 比例项float P = pid->Kp * error;// 积分项(带积分限幅)pid->error_sum += error;pid->error_sum = CLAMP(pid->error_sum, -10.0f, 10.0f);float I = pid->Ki * pid->error_sum;// 微分项float D = pid->Kd * (error - pid->last_error);pid->last_error = error;// 计算输出float output = P + I + D;// 输出限幅output = CLAMP(output, pid->output_min, pid->output_max);return output;
}

说明:

  • 该PID算法实现了基本的比例、积分和微分控制。
  • 使用了积分限幅来防止积分饱和。
  • 输出限幅确保控制信号在合理范围内。
2.2.4.2 自适应PID参数调整

为了应对不同负载条件,我们实现了一个简单的自适应PID参数调整算法。

void PID_Adapt(PID_Controller* pid, float error) {float abs_error = fabs(error);if (abs_error > 5.0f) {pid->Kp *= 1.1f;  // 误差大时增大Kp} else if (abs_error < 1.0f) {pid->Kp *= 0.9f;  // 误差小时减小Kp}pid->Kp = CLAMP(pid->Kp, 0.1f, 10.0f);  // 限制Kp的范围
}

说明:

  • 根据误差大小动态调整Kp参数。
  • 当误差较大时,增大Kp以提高响应速度。
  • 当误差较小时,减小Kp以提高稳定性。
  • Kp的值被限制在0.1到10之间,防止过度调整。
2.2.4.3 软启动算法

软启动算法用于在系统启动时缓慢增加输出电压,避免突然的电流冲击。

typedef struct {float target_voltage;       // 目标电压float current_voltage;      // 当前电压float ramp_rate;            // 斜率 (V/s)uint32_t last_update_time;  // 上次更新时间
} SoftStart;void SoftStart_Init(SoftStart* ss, float target, float rate) {ss->target_voltage = target;ss->current_voltage = 0.0f;ss->ramp_rate = rate;ss->last_update_time = HAL_GetTick();
}float SoftStart_Update(SoftStart* ss) {uint32_t now = HAL_GetTick();float elapsed_time = (now - ss->last_update_time) / 1000.0f;ss->last_update_time = now;ss->current_voltage += ss->ramp_rate * elapsed_time;if (ss->current_voltage >= ss->target_voltage) {ss->current_voltage = ss->target_voltage;return -1.0f;  // 软启动完成}return ss->current_voltage;
}

说明:

  1. SoftStart 结构体包含了软启动所需的所有参数:

    • target_voltage: 最终要达到的目标电压
    • current_voltage: 当前输出电压
    • ramp_rate: 电压上升的速率(V/s)
    • last_update_time: 上次更新的时间戳
  2. SoftStart_Init 函数用于初始化软启动参数:

    • 设置目标电压和斜率
    • 初始电压设为0
    • 记录初始时间戳
  3. SoftStart_Update 函数实现了软启动的核心逻辑:

    • 计算自上次更新以来的时间间隔
    • 根据时间间隔和斜率增加当前电压
    • 如果达到或超过目标电压,则返回-1表示软启动完成
    • 否则返回当前电压值

使用这个软启动算法可以实现电压的平滑上升,减少启动时的浪涌电流,保护电源和负载。在实际应用中,可以将这个算法集成到主控制循环中,在系统启动或重启时调用。

2.2.4.4 动态功率因数校正 (PFC) 算法

动态功率因数校正算法用于改善电源的功率因数,提高能源利用效率。

typedef struct {float voltage_rms;   // 电压有效值float current_rms;   // 电流有效值float power_factor;  // 当前功率因数float target_pf;     // 目标功率因数float duty_cycle;    // PWM占空比
} PFC_Controller;void PFC_Update(PFC_Controller* pfc, float voltage, float current) {// 更新RMS值(使用简化的移动平均法)pfc->voltage_rms = (pfc->voltage_rms * 0.9f) + (fabsf(voltage) * 0.1f);pfc->current_rms = (pfc->current_rms * 0.9f) + (fabsf(current) * 0.1f);// 计算功率因数(简化计算,假设电压和电流同相位)float apparent_power = pfc->voltage_rms * pfc->current_rms;float active_power = voltage * current;pfc->power_factor = active_power / apparent_power;// 调整PWM占空比以改善功率因数float pf_error = pfc->target_pf - pfc->power_factor;pfc->duty_cycle += pf_error * 0.01f;  // 简单的比例调节// 限制占空比在有效范围内pfc->duty_cycle = CLAMP(pfc->duty_cycle, 0.1f, 0.9f);
}float PFC_GetDutyCycle(PFC_Controller* pfc) {return pfc->duty_cycle;
}

说明:

  1. PFC_Controller 结构体包含了PFC所需的参数:

    • voltage_rms 和 current_rms: 电压和电流的有效值
    • power_factor: 当前计算得到的功率因数
    • target_pf: 目标功率因数(通常接近1)
    • duty_cycle: 用于控制功率因数的PWM占空比
  2. PFC_Update 函数实现了PFC的核心逻辑:

    • 使用简化的移动平均法更新电压和电流的RMS值
    • 计算当前功率因数(这里使用了简化计算,假设电压和电流同相位)
    • 根据当前功率因数和目标功率因数的误差调整PWM占空比
    • 将占空比限制在10%到90%之间,确保系统稳定性
  3. PFC_GetDutyCycle 函数用于获取当前的PWM占空比,以便控制功率开关

使用说明:

  • 在主控制循环中定期调用 PFC_Update 函数,传入实时的电压和电流采样值
  • 使用 PFC_GetDutyCycle 获取计算得到的PWM占空比,并应用到功率控制电路
  • 根据实际系统特性,可能需要调整占空比调节的比例系数(当前为0.01)

注意事项:

  1. 这是一个简化的PFC算法,实际应用中可能需要更复杂的相位检测和控制策略。
  2. 功率因数的计算假设了电压和电流同相位,这在实际系统中可能并不准确。更精确的实现应该考虑相位差。
  3. 移动平均法用于RMS计算是一种近似方法,对于快速变化的信号可能不够准确。在高精度要求的场合,应考虑使用真RMS计算方法。
  4. 占空比的调整使用了简单的比例控制,可能需要根据系统特性调整或采用更复杂的控制策略(如PI控制)。
  5. 算法没有考虑电网频率变化,在某些应用中可能需要频率跟踪功能。

改进建议:

  1. 实现相位检测:使用零交叉检测或DFT(离散傅里叶变换)来准确测量电压和电流的相位差。
  2. 增加自适应控制:根据负载特性自动调整控制参数。
  3. 添加谐波分析:在某些应用中,可能需要考虑谐波对功率因数的影响。
  4. 实现软启动:在PFC启动时,逐渐增加占空比以避免突然的电流冲击。
  5. 故障检测:添加过压、过流等保护机制。

示例代码扩展:

// 添加相位检测功能
void PFC_DetectPhase(PFC_Controller* pfc, float voltage, float current) {// 使用零交叉检测或其他方法检测相位// 这里仅为示意,实际实现可能更复杂static float last_voltage = 0;if (voltage >= 0 && last_voltage < 0) {// 电压零交叉点pfc->voltage_phase = 0;}if (current >= 0 && pfc->last_current < 0) {// 电流零交叉点,计算相对于电压的相位差pfc->current_phase = (HAL_GetTick() - pfc->last_voltage_zero) / (1000.0f / 50.0f) * 360.0f;}last_voltage = voltage;pfc->last_current = current;
}// 更精确的功率因数计算
float PFC_CalculatePowerFactor(PFC_Controller* pfc) {return cosf(pfc->current_phase * PI / 180.0f);
}// 添加到主更新函数
void PFC_Update(PFC_Controller* pfc, float voltage, float current) {PFC_DetectPhase(pfc, voltage, current);// ... 其他更新逻辑 ...pfc->power_factor = PFC_CalculatePowerFactor(pfc);// ... 继续原有的控制逻辑 ...
}

3. 系统集成

3.1 硬件集成

  1. PCB设计:使用Altium Designer进行四层PCB设计,考虑EMI/EMC布局。
  2. 热管理:为关键组件(如功率MOSFET和电感)设计适当的散热方案。
  3. 接口设计:包括电源输入/输出端子、通信接口(CAN, RS485)、调试接口(JTAG/SWD)。

3.2 软件集成

  1. 驱动层集成:将各硬件驱动(ADC, PWM, CAN, RS485等)整合到ChibiOS的HAL层。
  2. 中间件集成:将FatFS文件系统与W25Q64 Flash驱动结合,实现数据存储功能。
  3. 应用层集成:将PID控制、PFC算法、保护机制等模块组合成完整的应用程序。

3.3 固件更新机制

实现基于CAN总线或RS485的在线固件更新功能:

typedef struct {uint32_t firmware_version;uint32_t firmware_size;uint32_t crc32;
} FirmwareHeader;bool UpdateFirmware(uint8_t* new_firmware, uint32_t size) {FirmwareHeader* header = (FirmwareHeader*)new_firmware;// 验证固件if (CalculateCRC32(new_firmware + sizeof(FirmwareHeader), size - sizeof(FirmwareHeader)) != header->crc32) {return false;}// 擦除FlashFLASH_Erase(FIRMWARE_START_ADDRESS, header->firmware_size);// 写入新固件FLASH_Write(FIRMWARE_START_ADDRESS, new_firmware + sizeof(FirmwareHeader), header->firmware_size);// 验证写入if (memcmp((void*)FIRMWARE_START_ADDRESS, new_firmware + sizeof(FirmwareHeader), header->firmware_size) != 0) {return false;}// 更新启动标志UpdateBootFlag(header->firmware_version);return true;
}

4. 测试与验证

4.1 单元测试

使用Unity测试框架对关键模块进行单元测试:

void test_PID_controller(void) {PID_Controller pid = {1.0f, 0.1f, 0.01f, 0, 0, -100, 100};TEST_ASSERT_FLOAT_WITHIN(0.1f, 50.0f, PID_Update(&pid, 100, 50));TEST_ASSERT_FLOAT_WITHIN(0.1f, 25.0f, PID_Update(&pid, 100, 75));
}void test_soft_start(void) {SoftStart ss;SoftStart_Init(&ss, 12.0f, 1.0f);TEST_ASSERT_FLOAT_WITHIN(0.1f, 1.0f, SoftStart_Update(&ss));// Simulate 1 second passingss.last_update_time -= 1000;TEST_ASSERT_FLOAT_WITHIN(0.1f, 2.0f, SoftStart_Update(&ss));
}

4.2 集成测试

  1. 功能测试:验证所有功能模块的协同工作。
  2. 性能测试:测试系统在不同负载条件下的响应时间和稳定性。
  3. 压力测试:在极限条件下运行系统,如最大负载、高温环境等。
  4. 长期可靠性测试:连续运行系统至少 1000 小时,监控性能变化。

测试用例示例:

void test_full_system_startup(void) {// 模拟系统启动SystemInit();// 验证软启动TEST_ASSERT_TRUE(WaitForVoltageStable(12.0f, 5000));  // 等待电压稳定在12V,超时5秒// 验证PFC功能TEST_ASSERT_FLOAT_WITHIN(0.05f, 0.98f, GetPowerFactor());  // 功率因数应该接近1// 验证通信功能TEST_ASSERT_TRUE(TestCANComm());TEST_ASSERT_TRUE(TestModbusComm());
}void test_load_transient_response(void) {// 设置初始负载SetLoad(5.0f);  // 5A负载// 等待系统稳定Delay(1000);// 突然增加负载SetLoad(10.0f);  // 增加到10A// 检查电压恢复时间uint32_t recovery_time = MeasureVoltageRecoveryTime(11.5f, 12.5f);TEST_ASSERT_LESS_THAN(500, recovery_time);  // 恢复时间应小于500ms
}

4.3 EMC/EMI 测试

  1. 传导发射测试:确保系统符合 CISPR 22/EN 55022 标准。
  2. 辐射发射测试:验证系统在正常运行时不会产生过量电磁干扰。
  3. 抗扰度测试:测试系统对外部电磁干扰的抵抗能力,包括 ESD、浪涌等。

5. 项目总结

本智能电源管理系统项目成功实现了以下目标:

  1. 基于 STM32G4 的高性能数字控制电源系统,支持精确的电压和电流调节。
  2. 实现了先进的 PFC 算法,显著提高了系统的功率因数。
  3. 集成了多种保护机制,确保系统在各种条件下安全可靠运行。
  4. 通过 CAN 和 Modbus 协议实现了灵活的通信和远程管理功能。
  5. 软启动和自适应控制算法提高了系统的稳定性和适应性。

相关文章:

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。 1.1 系统主要特点 高精度数字电源控制&#xff1a;利用STM32G4的高性能ADC和定时器,实现精确…...

Linux驱动开发-04LED灯驱动实验(直接操作寄存器)

一、Linux 下LED 灯驱动原理 Linux 下的任何外设驱动&#xff0c;最终都是要配置相应的硬件寄存器。驱动访问底层的硬件除了使用内存映射将物理地址空间转化为虚拟地址空间&#xff0c;去进行读写修改&#xff0c;还可以通过各种子系统函数去进行操作 1.1 地址映射 MMU 全称…...

Linux命令更新-sort 和 uniq 命令

简介 sort 和 uniq 都是 Linux 系统中常用的文本处理命令。 sort 命令用于对文件内容进行排序。 uniq 命令用于去除文件中重复出现的行。 1. sort 命令 命令格式 sort [选项] [文件]选项&#xff1a; -n: 按照数字进行排序 -r: 反向排序 -c: 统计每个元素出现的次数 -…...

【密码学】密码学数学基础:剩余系

不得不啃的密码学数学基础之剩余系是个啥&#xff1f;数学里面有好多的定义都有前置的数学概念&#xff0c;要想弄懂剩余系还得先说说“同余”。 一、同余 那么“同余”有是个什么呢&#xff1f;在谈论“同余”之前&#xff0c;我们先圈定个讨论的范围。接下来讨论的都是整数集…...

量化发展历史简述,QMT/PTrade+恒生UFT、LDP极速柜台适用哪些情形?

量化发展简述 1.2004年萌发阶段&#xff1a;策略局限在量化择时&#xff0c;量化选股等&#xff1b; 光大保德信量化核 心基金 上投摩根阿尔法基 金 金融危机&#xff0c;海归引入。 2.2010量化元年&#xff1a;中低频交易为主&#xff0c;主要依靠套利、对冲、多因子策略等…...

linux服务器anaconda安装及环境变量配置

1.下载anaconda Index of /可以在此链接中下载所需要的anaconda安装文件。使用一下的命令进行下载&#xff1a; wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh2.安装anaconda 进入到下载的目录下&#xff0c;使用下面的的命令进行安装&#…...

如何在 Objective-C 中实现多态性,并且它与其他面向对象编程语言的多态性实现有何差异?

在Objective-C中&#xff0c;多态性可以通过使用父类的指针来调用子类的方法来实现。具体来说&#xff0c;可以定义一个父类的指针&#xff0c;然后将子类的实例赋值给这个指针。这样&#xff0c;即使使用父类的指针来调用方法&#xff0c;实际上会调用子类的方法。 需要注意的…...

阿里云OSS简单应用

前提条件 购买OSS标准存储包之后&#xff0c;就可以使用OSS的各种服务了 1 获取自己的OSS Endpoint OSS访问域名和数据中心_对象存储(OSS)-阿里云帮助中心 在官方的表格上找到自己OSS标准存储包对应的外网Endpoint即可 2 创建自己的阿里云Access Key ID 和 Access Key Secret …...

cleanshot Mac 上的截图工具

笔者闲来无事&#xff0c;最近在找一些mac上好用的工具其中一款就是cleanShot。为什么不用原有的mac自带的呢。因为相对来说编辑功能不算全面&#xff0c;不支持长截图。那有没有一款软件支持关于截图的好用工具呢。 所以笔者找了这款。安装包是直接安装就可使用的。请大家点赞…...

JMeter进行HTTP接口测试的技术要点

参数化 用户定义的变量 用的时候 ${名字} 用户参数 在参数列表中传递 并且也是${} csv数据文件设置 false 不忽略首行 要首行 从第一行读取 true 忽略首行 从第二行开始 请求时的参数设置&#xff1a; 这里的名称是看其接口需要的请求参数的名称 这里的变量名称就是为csv里面…...

基于智能算法的品牌视觉识别系统优化研究

基于智能算法的品牌视觉识别系统优化研究 一、引言 随着人工智能技术的快速发展,智能算法在各个领域的应用日益广泛。在品牌视觉识别系统中,智能算法同样发挥着重要作用。品牌视觉识别系统(Visual Identity System,简称VIS)是企业通过统一的视觉符号系统,将企业的理念、…...

递归锁与普通锁的区别

什么是锁&#xff1f; 在多线程编程中&#xff0c;锁是一种机制&#xff0c;用来确保某些代码块在同一时间只能被一个线程执行。想象一下&#xff0c;你和你的朋友们都想同时进入一个只有一把椅子的房间。为了避免混乱&#xff0c;你们需要一个锁来控制进入的顺序。 普通锁&a…...

FPGA上板项目(二)——PLL测试

目录 实验内容实验原理实验步骤实验结果 实验内容 将差分时钟信号转化为 192MHz 时钟信号作为输出。 实验原理 PLL&#xff0c;即锁相环&#xff0c;一种反馈控制电路&#xff0c;具有时钟倍频、分频、相位偏移和可编程占空比的功能。 实验步骤 添加 clocking wizard IP核&…...

C语言 | Leecode C语言题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*//*假定 num1&#xff0c;num2 为出现次数大于 nums.length / 3 的两个数。&#xff08;最多出现两个&#xff09;遍历 nums&#xff0c; 若出现 num1、num2…...

mybatis-plus映射mysql的json类型的字段

一、对json里面内容建立实体类 Data AllArgsConstructor NoArgsConstructor public class RouteMetaEntity {private String title;private Boolean affix;private Boolean isAlwaysShow; }二、主类做映射 TableField(typeHandler JacksonTypeHandler.class)private RouteMe…...

20240716 Codeforces题目

A - Split the Multiset 题目 多集是一组数字&#xff0c;其中可以有相等的元素&#xff0c;数字的顺序无关紧要。例如&#xff0c; { 2 , 2 , 4 } \{2,2,4\} {2,2,4} 是一个multiset。 你有一个多集 S S S 。最初&#xff0c;multiset只包含一个正整数 n n n 。即 S {…...

29.【C语言】自定义函数

1、自定义详解 *提示&#xff1a;先看第12,19篇 例&#xff1a;写一个程序交换两个变量的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void swap(int x, int y) {int z 0;z x;x y;y z; } int main() {int a 10;int b 20;swap(a, b);printf("%d…...

C++面向对象编程 基础篇(3)函数基础

3、函数基础 3.1 函数默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 注意事项&#xff1a; 如果某个位置已经有了默认参数&#xff0c;往后的形参都要有默认参数 函数声明和函数实现只能有一个有默认参数 示例&#xff1a; //如果自己传入参数&…...

excel有条件提取单元格特定文本(筛选纯文字的单元格或含有数字的单元格、单元格提取不同的文本长度)

实际工作背景 需要对导出的银行流水中的数十个村以及对应的村小组进行分组统计&#xff0c;但是初始的表格中村和小组是混在一起的&#xff0c;如下图所示&#xff1a; 目的&#xff1a;将大树村和大树村小组名称分别筛选出来 1.观察发现&#xff0c;大树村小组的单元格第4…...

HBase 在统一内容平台业务的优化实践

作者&#xff1a;来自 vivo 互联网服务器团队-Leng Jianyu、Huang Haitao HBase是一款开源高可靠性、扩展性、高性能和灵活性的分布式非关系型数据库&#xff0c;本文围绕数据库选型以及使用HBase的痛点展开&#xff0c;从四个方面对HBase的使用进行优化&#xff0c;取得了一些…...

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos&#xff08;2.2.0&#xff09; 服务&#xff0c;控制台报错 Unable to start embedded Tomcat。 报错信息&#xff1a;Unable to start …...

【Java面向对象】对象和类

文章目录 1.为对象定义类2.定义类2.1 主类 3.类与对象3.1 构造方法3.2 通过引用变量访问对象3.3 访问对象的数据和方法3.4 引用数据域和 null 值3.5 基本类型变量和引用类型变量的区别 4.常见的类 1.为对象定义类 面向对象程序设计(OOP) 就是使用对象进行程序设计。对象 (obje…...

在微服务架构架构中父工程中的`<dependencyManagement>`和 `<dependencies>`的区别

在微服务架构架构中父工程中的<dependencyManagement>和 <dependencies>的区别&#xff1a; 在微服务架构中&#xff0c;通常会有一个父工程&#xff08;或称作聚合工程&#xff09;来管理一组相关的子模块&#xff08;即各个微服务&#xff09;。Maven 的 <de…...

Docker安装Zookeeper、RocketMQ

安装Zookeeper 拉取镜像 docker pull zookeeper:3.9.2启动容器 -d后台启动&#xff0c;-p映射容器2181端口到宿主机2181端口&#xff0c;限制容器最大内存占用为128m&#xff0c;–restart容器自动重启 docker run -d -p 2181:2181 -m 128m --restartalways --name zookeepe…...

Ubuntu 磁盘扩容

1.下载工具 sudo apt-get install gparted 2.调整大小...

如何在QGC中接收和处理无人机上传的各种传感器数据(如GPS、IMU等)。

在 QGroundControl (QGC) 中接收和处理无人机上传的各种传感器数据&#xff08;如 GPS、IMU 等&#xff09;&#xff0c;主要通过 MAVLink 协议实现。MAVLink 是一种轻量级的消息传输协议&#xff0c;用于无人机和地面站之间的通信。QGC 通过 MAVLink 消息接收来自无人机的传感…...

Spring配置Bean自己的关系:继承和依赖

继承&#xff1a;这里的继承不是Java中类之间的继承&#xff0c; 是指配置文件中Bean配置项之间的继承。 用parent属性&#xff0c;配置要继承的bean&#xff0c;这样可以把相同的部分去去掉&#xff0c;下上两个bean的关系就变成了父bean和子bean&#xff0c; 子bean可以继承父…...

科技与狠活

科技与狠货&#xff0c;已经见怪不怪了 从黑龙江到海南&#xff0c;从上海到新疆&#xff0c;960万平方公里&#xff0c;十三亿人&#xff0c;每个地方都是科技与狠活 在抖音上面看到一个评论&#xff0c;如果蔬菜没科技与狠活&#xff0c;估计会很贵&#xff0c;但是我想到在…...

Vue:axios请求数据转存leanCloud

思路&#xff1a; 采用axios请求需要的数据&#xff0c;查看leanCloud中数据批量存储的格式&#xff0c;将两个数据进行对比&#xff0c;将请求得到的数据封装为云服务存储的格式&#xff0c;再发leanCloud存储数据的请求完成转存 1.封装js代码 //批量操作新增数据 import r…...

实战篇(九):解锁3D魔方的秘密:用Processing编程实现交互式魔方

解锁3D魔方的秘密:用Processing编程实现交互式魔方 使用 Processing 创建一个 3D 魔方效果展示1. 安装 Processing2. 项目结构3. 代码实现4. 代码解释4.1. 初始化魔方4.2. 绘制魔方4.3. 处理鼠标事件4.4. 检查点击的面4.5. 旋转面和最终确定旋转5. 运行和测试6. 细节解释6.1. …...