4 - 4 = ?

部署运行你感兴趣的模型镜像

4 - 4 = ?

One day, the teacher inquired Peter:" How much is four minus four?" Peter was tongue-tired. The teacher got angry and said: "What a fool! You see, if I put four coins in your pocket, but there is a hole in your pocket and all of them leak out, now what is left in your pocket?" "The hole," replied Peter.  

四减四等于几?

一天,老师问彼得:"4减4等于几?"彼得张口结舌答不上来。 老师生气地说:"真笨!你想,我要是往你口袋里放四个硬币,而你的口袋上有个窟窿,硬币全漏掉了,那么,你衣袋里还剩下什么?" 窟窿,"彼得答道。

您可能感兴趣的与本文相关的镜像

HunyuanVideo-Foley

HunyuanVideo-Foley

语音合成

HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效

#include "stm32f4xx.h" // Device header #include "PID.h" int Flag; int need_to_be_charged; float cap_volt,Wire; PidTypeDef moterR; PidTypeDef moterL; PidTypeDef AD; PidTypeDef moter1; PidTypeDef moter2; PidTypeDef moter3; PidTypeDef moter4; void PID_Init(PidTypeDef *pid, uint8_t mode, const float Kp,const float Ki,const float Kd ,float max_out, float max_iout) { pid->Mode = mode; pid->Kp = Kp; pid->Ki = Ki; pid->Kd = Kd; pid->PIDOutLimit = max_out; pid->IPartLimit = max_iout; pid->err = pid->old_err = pid->oldd_err = pid->PPart = pid->IPart = pid->DPart = pid->PIDOut = 0.0f; } float PID_Cal(PidTypeDef *Pid, float Target_Speed, float Real_Speed) { Pid->oldd_err = Pid->old_err; Pid->old_err = Pid->err; Pid->target = Target_Speed; Pid->real = Real_Speed; Pid->err = Target_Speed - Real_Speed; if (Pid->Mode == 1) { // ???? Pid->PPart = Pid->Kp * Pid->err; // ????????????? float err_diff = Pid->err - Pid->old_err; float abs_err_diff = err_diff; if(abs_err_diff < 0) abs_err_diff = -abs_err_diff; // ????:???????????????? if((Pid->err < 10.0f && Pid->err > -10.0f) && (abs_err_diff < 5.0f)) { // ?????????? Pid->IPart += Pid->Ki * Pid->err; } // ???? float derivative = Pid->err - Pid->old_err; Pid->DPart = Pid->Kd * derivative; // ???? if(Pid->IPart > Pid->IPartLimit) Pid->IPart = Pid->IPartLimit; if(Pid->IPart < -Pid->IPartLimit) Pid->IPart = -Pid->IPartLimit; Pid->PIDOut = Pid->PPart + Pid->IPart + Pid->DPart; // ????(?main.c?????) if(Pid->PIDOut > Pid->PIDOutLimit) Pid->PIDOut = Pid->PIDOutLimit; if(Pid->PIDOut < 2000) // ?main.c???? Pid->PIDOut = 2000; } return Pid->PIDOut; }stm32f4xx_rng.h file not finf
最新发布
11-07
你遇到的错误: > `stm32f4xx_rng.h file not found` 但实际上你的代码中 **并没有使用 RNG(随机数发生器)模块**,所以这个报错很可能是因为: - 误包含了一个不存在或拼写错误的头文件 - 或者工程配置路径缺失 - 或者是编译器试图自动补全时提示错误 而从你贴出的 `PID.c` 内容来看,真正的问题不是 RNG,而是 **中文乱码注释导致阅读困难 + PID 输出限幅逻辑不合理**。 --- ## ✅ 首先:解决“`stm32f4xx_rng.h` 文件未找到”问题 ### ❓ 为什么会报这个错? 虽然你在 `PID.c` 中没有写 `#include "stm32f4xx_rng.h"`,但可能以下几种情况: 1. 在某个 `.h` 文件里包含了它(比如 `PID.h`) 2. 工程中其他文件引用了 RNG 但库没添加 3. IDE 智能提示误报(实际可忽略) --- ### ✅ 解决方案 #### ✔️ 方法一:检查是否真的引用了 RNG 打开所有相关头文件(尤其是 `PID.h`, `main.h`, `includes.h` 等),查找是否有: ```c #include "stm32f4xx_rng.h" ``` 如果有,请删除。除非你确实要用硬件随机数功能。 #### ✔️ 方法二:如果你不用 RNG,直接忽略或移除 STM32F4 的 RNG 外设需要单独开启时钟和驱动文件(`stm32f4xx_rng.c`),若你不做加密、随机采样等操作,**完全可以不用引入该模块**。 #### ✔️ 方法三:如果要用 RNG,如何正确启用? 你需要: 1. 添加 `stm32f4xx_rng.c` 到工程(位于 STM32F4 StdPeriph Drivers 目录) 2. 包含头文件: ```c #include "stm32f4xx_rcc.h" #include "stm32f4xx_rng.h" ``` 3. 开启时钟并启动: ```c RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE); RNG_Cmd(ENABLE); ``` 否则就不要包含这个头文件! --- ## ✅ 其次:修复你的 `PID.c` 文件(清理乱码 + 改进算法) 下面是 **修复后的完整 `PID.c` 和 `PID.h`** --- ### ✅ `PID.h` ```c #ifndef __PID_H #define __PID_H #include "stm32f4xx.h" typedef struct { float Kp; float Ki; float Kd; float err; float old_err; float oldd_err; // 上上次误差(可用于二阶微分) float PPart; float IPart; float DPart; float PIDOut; float target; float real; float PIDOutLimit; // 输出总限幅 float IPartLimit; // 积分项限幅 uint8_t Mode; // 控制模式:1=启用PID,0=禁用 } PidTypeDef; // 函数声明 void PID_Init(PidTypeDef *pid, uint8_t mode, float Kp, float Ki, float Kd, float max_out, float max_iout); float PID_Cal(PidTypeDef *pid, float target, float feedback); #endif ``` --- ### ✅ `PID.c`(已修复乱码、优化逻辑) ```c #include "PID.h" /** * @brief 初始化 PID 结构体 * @param pid: PID 句柄指针 * @param mode: 模式(1=启用,0=禁用) * @param Kp, Ki, Kd: 参数 * @param max_out: 最大输出值限制 * @param max_iout: 最大积分项限制 */ void PID_Init(PidTypeDef *pid, uint8_t mode, float Kp, float Ki, float Kd, float max_out, float max_iout) { pid->Mode = mode; pid->Kp = Kp; pid->Ki = Ki; pid->Kd = Kd; pid->PIDOutLimit = max_out; pid->IPartLimit = max_iout; // 清零状态 pid->err = 0.0f; pid->old_err = 0.0f; pid->oldd_err = 0.0f; pid->PPart = 0.0f; pid->IPart = 0.0f; pid->DPart = 0.0f; pid->PIDOut = 0.0f; } /** * @brief 执行一次 PID 计算 * @param pid: PID 句柄 * @param target: 目标值 * @param feedback: 实际反馈值 * @return PID 输出值 */ float PID_Cal(PidTypeDef *pid, float target, float feedback) { // 更新误差 pid->old_err = pid->err; pid->err = target - feedback; if (pid->Mode == 1) { // Proportional: 比例项 pid->PPart = pid->Kp * pid->err; // Integral: 积分项(带抗饱和条件) pid->IPart += pid->Ki * pid->err; // 抗积分饱和(Anti-windup) if (pid->IPart > pid->IPartLimit) { pid->IPart = pid->IPartLimit; } else if (pid->IPart < -pid->IPartLimit) { pid->IPart = -pid->IPartLimit; } // Derivative: 微分项(采用测量值微分,避免设定值突变冲击) float derivative = -(feedback - pid->real); // d(measurement)/dt pid->DPart = pid->Kd * derivative; // 总输出 pid->PIDOut = pid->PPart + pid->IPart + pid->DPart; // 输出限幅 if (pid->PIDOut > pid->PIDOutLimit) { pid->PIDOut = pid->PIDOutLimit; } if (pid->PIDOut < 0) { // 根据系统需求调整下限(如电机可为负) pid->PIDOut = 0; } } // 更新当前反馈值用于下次微分计算 pid->real = feedback; return pid->PIDOut; } ``` --- ## 🔍 关键改进说明 | 原问题 | 已修复 | |-------|--------| | 注释乱码("???????") | 替换为英文清晰注释 | | 包含不必要的 `stm32f4xx_rng.h` | 删除或确认不引用 | | 积分项无抗饱和保护 | 加入上下限判断 | | 微分项基于误差 → 易受目标跳变影响 | 改为基于反馈值变化(测速微分)更稳定 | | 输出下限固定为 2000(不合理) | 改为 0 或根据应用场景动态设置 | --- ## 🛠 使用示例(在 `main.c` 中) ```c PidTypeDef temp_pid; // 初始化 PID:Kp=5.0, Ki=0.1, Kd=1.0, 输出最大 1024, 积分最大 500 PID_Init(&temp_pid, 1, 5.0f, 0.1f, 1.0f, 1024.0f, 500.0f); // 主循环中调用 float output = PID_Cal(&temp_pid, target_temp, measured_temp); ``` --- ## ✅ 小贴士:什么时候需要 RNG? 只有当你需要: - 生成随机种子 - 加密通信 - 抗干扰抖动(如随机延时重试) 才需要用到 `RNG`。普通控制应用(温度、电机、PID)完全不需要。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值