位置式 PID、增量式 PID、PI、PD控制和前馈控制简谈

增量式PID控制算法 顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应用最为广泛的一种控制算法,该控制算法出现于20世纪30至40年代,适用于对被控对象模型了解不清楚的场合。的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。增量式PID,是PID控制算法的一种基本形式,是通过对控制量的增量进行PID控制的一种算法。e(k)-e(k-1)代表本次误差 - 上次误差。e(k)-e(k-1)代表本次误差 - 上次误差。 阅读详情
AI摘要

本文系统讲解位置式PID、增量式PID、PI/PD控制器的原理、离散化实现及代码形式,重点分析各环节对稳态误差、动态响应和噪声抑制的影响;同时阐述前馈控制如何与PI结合以提升响应速度并避免微分放大噪声,适用于嵌入式实时控制系统设计。

一、什么是 PID

在过程控制中,PID 控制器,一直是应用最为广泛的一种自动控制器。PID 控制也一直是众多控制方法中应用最为普遍的控制算法。它不依赖复杂的数学模型,仅仅通过三个参数 (比例、积分和微分) 即可调节出效果较好控制效果。

更具象和通俗一点,对于 PID 来说,我们配置的比例、积分和微分是常量。而我们需要给 PID 控制器输入目标值和实际测量值,这样 PID 控制器就可以输出控制值。之后再采集实际测量值反复循环这个过程。

比如:你开车时,眼睛看路(传感器的捕捉的当前值),大脑对比车道(目标值),手调方向盘(PID计算控制量)。

如果车偏左了,PID会让你往右打方向盘,直到车回到车道中央。

二、位置式 PID

2.2 P 比例

比例项的物理意义是将当前的误差值乘一个系数。

如果仅使用比例控制,那么我们的 PID 公式是这样的:

  •  = 比例系数
  •  = 目标值和当前的值的差,也就是误差值

2.2.1 比例环仿真

在 PID Controller Simulator 平台可以仿真 PID 参数

当我们调节参数为 P = 3、I = 0、D = 0

可见实际值并不能贴合到目标值上,而且产生了一个静态误差。

虚线:目标值;粉线:实际值;绿线:PID 调节输出值

当我们调节参数为 P = 5、I = 0、D = 0

可见目标值又开始震荡了,所以只调整比例不能实现我们的控制。

虚线:目标值;粉线:实际值;绿线:PID 调节输出值

2.3 I 积分

积分项的物理意义是将一段时间内的误差累加起来。

如果仅使用积分控制,那么我们的 PID 公式是这样的:

  •  = 积分系数
  •  = 累加某一时间段的所有误差

2.3.1 积分环仿真

当我们调节参数为 P = 3、I = 0.03、D = 0

可见在一段时间后系统趋近于贴合目标值,但是还是有一定的震荡

虚线:目标值;粉线:实际值;绿线:PID 调节输出值

2.4 D 微分

微分项的物理意义是计算误差的微分。

如果仅使用微分控制,那么我们的 PID 公式是这样的:

  •  = 微分系数
  •  = 误差变化率

2.4.1 微分环仿真

当我们调节参数为 P = 2.5、I = 0.02、D = 12

震荡的稳态误差也消失了,此时系统比较符合我们的要求

虚线:目标值;粉线:实际值;绿线:PID 调节输出值

2.5 完整的 PID 公式

简单的将、积分和微分相加即构成完整的 PID 公式:

2.5 离散化

离散化(Discretization)是指将连续时间系统​(如模拟信号、微分方程)转换为离散时间系统​(如数字信号、差分方程)的过程。

对于计算机和微控制器 (MCU) 来说,因为只能处理离散时间的数据(即按固定时间间隔采样),并不能完整的处理连续时间系统,无法直接计算积分或微分。因此必须将连续的PID控制算法转换为离散形式。

2.6 离散化的 PID 公式

比例项不变,同时将积分项转化为累加形式并且乘时间 T,微分也简单的变成了本次误差减去上次误差除时间 T。通过离散化处理,这样计算机和 MCU 就可以计算 PID 了。

2.6 离散化公式的代码形式

下面代码中的 error、error_sum 和 derivative,分别对应离散形式的比例项,积分项和微分项。

因为我们简单的看作每次采样和计算时间间隔都是相当的,也就 T 恒等于 1。所以在 C 语言代码中直接省略 T 这个变量。

// 简易位置式PID计算(使用static变量保存状态)
float PID_Calculate(float target, float actual, float Kp, float Ki, float Kd)
{
    static float error_sum = 0;  // 积分项(自动保持)
    static float last_error = 0; // 上次误差(自动保持)

    float error = target - actual;
    error_sum += error;                    // 累积误差(积分项)
    float derivative = error - last_error; // 误差变化率(微分项)

    // PID输出 = 比例 + 积分 + 微分
    float output = Kp * error + Ki * error_sum + Kd * derivative;

    last_error = error; // 保存本次误差供下次使用
    return output;
}

三、增量式 PID

增量 PID,就是每次的比例、积分和微分求和后并不是直接输出的结果,而是上次的增量。

增量式其中的积分只累加三次,不会造成积分饱和的过冲,这样也会让响应快一些。

控制框图如下:

3.1 增量式 PID 推导

这是我们的离散 PID 公式:

那么上一次输出的 PID 应该是这样的,所有 K 减 1 即可:

此时,我们把

减去

其结果应该是本次位置式 PID 输出值减去上次位置式 PID 输出的值,换句话说,也就是本次的控制量的增量(Δu),即 ​​“这一步要比上一步多调整多少”​。

结果如下:

  •  = 本次的控制量的增量

最终输出只需要:

两者相加即可,也就是上次输出的值和本次的增量相加

3.2 增量式 PID 代码

如果没看懂公式的推导,结合代码阅读即可:

/**
 * @brief 增量式PID控制器
 * @param setpoint  目标设定值(如目标温度、速度等)
 * @param actual    当前实际测量值(来自传感器)
 * @param Kp        比例系数(决定对当前误差的反应强度)
 * @param Ki        积分系数(需已乘以采样周期T,用于消除稳态误差)
 * @param Kd        微分系数(需已除以采样周期T,用于抑制振荡)
 * @return          计算得到的控制量输出(如PWM占空比、电机电压等)
 */
float Incremental_PID(float setpoint, float actual, float Kp, float Ki, float Kd) 
{
    // 静态变量声明(保持函数调用间的历史数据)
    static float e_prev = 0;      // 保存上一次的误差值 e(k-1)
    static float e_prev2 = 0;     // 保存上上次的误差值 e(k-2)
    static float u_prev = 0;      // 保存上一次的控制量输出 u(k-1)

    // 计算当前误差 = 目标值 - 实际值
    float e = setpoint - actual;

    // 计算控制增量 Δu(k):
    // 比例项:Kp*[e(k)-e(k-1)] —— 响应误差变化量
    // 积分项:Ki*e(k)          —— 消除当前误差(注意Ki已含采样周期T)
    // 微分项:Kd*[e(k)-2e(k-1)+e(k-2)] —— 抑制误差波动(二阶差分)
    float delta_u = Kp * (e - e_prev)    // 比例项计算
                  + Ki * e               // 积分项计算
                  + Kd * (e - 2 * e_prev + e_prev2); // 微分项计算

    // 计算当前控制量 = 上一次控制量 + 本次增量
    float u = u_prev + delta_u;

    // 更新历史数据(为下一次计算做准备):
    e_prev2 = e_prev;   // 将e(k-1)存入e(k-2)(下次变为e(k-2))
    e_prev = e;         // 将当前误差e(k)存入e(k-1)
    u_prev = u;         // 保存当前控制量供下次使用

    // 返回当前计算的控制量
    return u;
}

四、PI 和 PD 控制

4.1 稳态误差下的两个概念

稳态误差(Steady-state Error)​是自动控制系统在进入稳定状态后,期望输出与实际输出之间的固定偏差。它是衡量系统控制精度的重要指标,反映了系统长期运行时的准确性。

4.1.1 静态误差

静态误差是动态误差函数在  时的极限值。并不是实际误差函数的一部分。也就是说,当时间趋近于无穷后,实际值和目标值仍有一个固定的偏差。

比如:你希望水池内水的高度是10cm,于是你对水龙头进行了控制(把水龙头阀门打开到一定程度),经过足够长的时间,水池内的水高度不不变了,到达了9cm,于是你控制的静态就是1cm。

在 PID 控制中,I 积分项主要用于消除掉这个静态误差。

4.1.2 动态误差

动态误差是一个关于时间的函数,记录了水池内水的高度和目标高度之间的差值(误差)随时间的变化。

4.2 PD 控制器

PD控制就是比例 + 微分控制,在系统稳定后能快速预测未来的变化并做出响应。

特点是快速性和稳定性。微分相当于一个阻力,能有效抑制系统本身产生的震荡。缺点是有静差和放大噪声,当偏差很小时 P 和 D 基本不起作用所以会有静差。噪声与系统自身调节产生的震荡是不同的,噪声一般是高频的干扰。噪声会在输出端影响系统然后反馈到输入端,由于微分控制是有一个系数的,当系数乘上噪声后,可以想象到噪声是被放大了。噪声的放大效果取决于微分系数,如果系统的微分系数很大那就要注意噪声的干扰了。

平衡小车的直立控制就需要用到 PD 控制。当角度接近机械零度时,P控制器就不工作了,控制器认为完成了任务,然而控制器忽略了一种对下一个时刻的预测,即角度在机械零度时电机还存在角速度,简单来说就是小车还有惯性。这时候就需要加入 D 控制器,预测下一时刻的偏差。

对于平衡小车,倒立摆来说,静差对于直立的影响其实并不大,也没有必要一直让平衡车保持机械中值(平衡车,倒立摆在位置不动的情况下也会自身轻微摆动保持平衡)。所以不是很依赖于积分项。视情况会使用 PD 来控制。

4.3 PI 控制器

以伺服为例,PID 的 D 分量作为微分,可以加快动态响应,就类似开车的时候提前预判马上到人行道了,提前踩刹车,防止冲到人行道上,就和抑制过冲类似。

但是在实际的离散控制系统,微分很容易放大噪声,更加建议加前馈,而不是加微分,前馈也可以加快动态响应,但是不会对噪声进行放大。伺服中,位置环,电流环,速度环都可以加前馈。在变频空调常用的单转子压缩机的抑制振荡中,也是通过给速度环加前馈的方式解决。

五、前馈控制

5.1 前馈控制简谈

通过比例 (P)、积分 (I)、微分 (D) 三个环节对系统误差进行反馈调节,适用于消除稳态误差和抑制扰动,但存在响应滞后的问题。同时在之前分析到,微分项在一些情况还会引发震荡,所以 PI + 控制能够解决我们大部分的问题。

所谓前馈控制,就是如下图所示,仅根据目标值输出一个前馈值,与 PI 相加得出输出值。也就是前馈环节根据参考信号或可测扰动(如进料流量、送风量等)生成补偿量,与 PI 输出的校正量叠加,形成总控制量。 

前馈控制快速抵消主要扰动的影响,而 PI 处理剩余误差和未建模动态,两者结合可同时提升响应速度和稳态精度。

5.2 前馈控制代码解析

在这里只举例较为简单的目标微分前馈控制。

前馈补偿的核心思想是通过预测系统输入 (目标值) 的变化趋势,提前生成控制量以抵消潜在的动态误差。微分项(Δtarget = target - last_target)反映了目标值的瞬时变化率,类似于微分控制的“超前校正”特性。这种设计能够快速响应设定值的突变,减少系统因惯性导致的跟踪滞后。

核心代码如下:

// 前馈计算:补偿目标值的变化量(Δtarget = target - last_target)
float feedforward = Kff * (target - last_target);

全部代码如下:

/**
 * @brief 带前馈补偿的位置式PID控制器
 * @param target    目标设定值(如目标位置、温度)
 * @param actual    当前实际测量值
 * @param Kp        比例系数
 * @param Ki        积分系数
 * @param Kff       前馈增益(根据系统模型或实验调整)
 * @return          控制量输出(如PWM占空比、电机电压)
 */
float Feedforward_PID(float target, float actual, float Kp, float Ki, float Kff)
{
    // 静态变量声明(保存历史状态)
    static float error_sum = 0;   // 积分项累积
    static float last_error = 0;  // 上一次误差
    static float last_target = 0; // 上一次目标值(用于前馈计算)

    // 计算当前误差
    float error = target - actual;

    // PID计算
    error_sum += error; // 积分项累积
    float pid_output = Kp * error + Ki * error_sum;

    // 前馈计算:补偿目标值的变化量(Δtarget = target - last_target)
    float feedforward = Kff * (target - last_target);

    // 总控制量 = PID输出 + 前馈补偿
    float output = pid_output + feedforward;

    // 更新历史数据
    last_error = error;
    last_target = target;

    return output;
}

PID算法(位置式pid算法和增量式pid算法) PID 算法是闭环控制系统中常用的算法,PID 分别是 Proportion(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控。 阅读详情

相关推荐

PID控制算法详解:从原理到嵌入式C语言实现与调参

自动控制是工程领域的核心基础,其目标是在存在干扰和不确定性的情况下,使系统输出稳定、准确地跟踪设定值。反馈控制是实现这一目标的基本原理,它通过持续测量系统输出并与期望值比较,生成纠正信号来驱动系统。PID(比例-积分-微分)控制器是反馈控制中最经典、应用最广泛的技术,因其结构简单、鲁棒性强且不依赖精确的数学模型,展现出极高的技术价值。它通过比例项快速响应偏差、积分项消除稳态误差、微分项预测趋势抑制振荡,三者协同工作。这一原理使其在电机调速、温度控制、无人机姿态稳定等嵌入式系统和工业自动化场景中成为基石级解决

weixin_34095889的博客 330

PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根据扰动作用的大小进行控制,以补偿扰动作用对被控变量的影响。前馈控制系统运用得当,可以使被控变量的扰动消灭在萌芽之中,使被控变量不会因扰动作用或给定值变化而产生偏差,它较之反馈控制能更加及时地进行控制,并且不受系统滞后的影响。 1、前馈控制基本思想 在高精度伺服控制中,前馈控制可用来提高系统的跟踪性能。经典

如有侵权,请联系作者删除 1万+

串级PID实战:位置环与速度环的协同控制策略

本文深入解析了串级PID控制中位置环与速度环的协同工作原理。通过将位置环作为外环制定速度指令,速度环作为内环精确执行,串级PID有效解决了单一PID控制器在响应速度与稳定性之间的矛盾。文章提供了从理论分析、代码实现到参数调试的完整实战指南,帮助工程师在机器人、无人机等运动控制系统中实现精准、平稳的位置控制。

weixin_29184075的博客 177

增量式PID是什么?不知道你就落伍了

目录1 什么是增量式PID?2 举个例子2.1 位置式PID2.2 增量式PID3 伪算法4 C语言实现5 总结在之前一篇博客中(简易PID算法的快速扫盲)简单介绍了PID算法的基本...

张巧龙的博客 6万+

深入解析电机双环PID控制:从速度环与电流环原理到STM32实现

在嵌入式运动控制系统中,PID控制器是调节动态性能的核心算法。其原理是通过比例、积分、微分环节处理误差信号,实现对被控对象的精确调节。串级控制(Cascade Control)作为一种提升系统性能的关键技术,通过内外环分工协作,将复杂的控制任务解耦:内环负责快速跟踪指令,外环保证稳态精度。这种架构在电机控制、无人机和机器人驱动等领域具有极高的技术价值,能有效提升系统的响应速度、抗扰动能力和稳定性。本文聚焦于速度环外环与电流环内环这一经典组合,结合Simulink仿真与工程实践,详细阐述其设计、参数整定及在S

weixin_33984032的博客 440

PID串级控制:从原理到实践,实现电机高精度位置与速度控制

在自动控制领域,PID控制器是应用最广泛的经典算法,它通过比例、积分、微分三个环节的组合,实现对被控量的精确调节。其核心原理在于利用误差的当前值、累积值和变化趋势来生成控制信号,从而驱动系统输出逼近目标值。这项技术的核心价值在于其结构简单、鲁棒性强,能够有效应对多种工业场景中的控制需求。从恒温控制、液位调节,到更复杂的运动控制,PID都扮演着关键角色。尤其在电机控制这一细分领域,当单一PID环在应对高动态、高精度的位置跟踪任务时,往往在响应速度与稳态精度之间难以兼顾。此时,PID串级控制架构应运而生,它将控

weixin_30617737的博客 403

基于前馈补偿的PID控制算法及仿真

在高精度伺服控制中,前馈控制可用来提高系统的跟踪性能。经典控制理论中的前馈控制设计是基于复合控制思想,当闭环系统为连续系统时,使前馈环节与闭环系统的传递函数之积为1,从而实现输出完全复现输入。

学习不好的电气仔的博客 1万+

从建模到驱动:有刷直流力矩电机控制学习的完整实践指南

电机控制是自动化与机器人领域的核心技术,其核心在于建立被控对象的数学模型,并基于此设计控制器以实现精确的运动控制。从基础的电压、电流、转速关系出发,通过微分方程建立电机模型,是理解更复杂伺服系统的基础。控制理论的价值在于将数学模型转化为可预测、可优化的系统行为,其核心性能指标控制带宽,直接决定了系统的响应速度与跟踪精度。在工业机器人、精密仪器等应用场景中,高带宽意味着更快的作业节拍与更高的定位精度。本文以有刷直流力矩电机这一经典对象为例,深入剖析了从数学建模、Simulink仿真、带宽分析到PWM驱动电路实

weixin_30932215的博客 417

PID算法:增量式PID & 位置式PID

一般而言,计算机实现PID算法的时候,在采样周期很小的时候,积分部分可以用对误差求和的方式代替,微分部分可以用差商的方式代替,从而实现将连续的PID算法的差分方程进行离散化,能够通过计算机实现。数字PID:指的是PID控制算法的实现是通过计算机软件程序实现的,计算机需要对输入的连续信号进行采集,然后通过量化作为控制器的输入参数,从而经过算法的调节实现目标对象的控制。图中的模拟调节器的意思就是控制规律的方案是通过模拟硬件的方式来实现的,如果想要调整系统的控制规律就需要修改调节器的硬件。

weixin_43866583的博客 1万+

PID恒温控制(位置式+增量式)

这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。反映偏差信号的变化趋势,并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。从下面可以看出,由于位置式PID里面存在积分信号,容易产生累积偏差,在达到设定值时会存在震荡,这里的小人运动到墙面处就需要停止,就不能有震荡,所以需要使用增量式的PID控制。

2万+

博途PID编程应用(状态机)

博途工艺PID的详细解读可以查看下面的博客文章,这里不再赘述博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读_RXXW_Dor的博客-优快云博客这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一些特殊的被控对象,我们可能需要采用一些先进PID算法,比如针对大滞后系统的史密斯预估器,当然大滞后系统还可以采用串级PID。有些被控对象可以事先知道系统的扰动量,我们可以引入前馈控制。

RXXW_Dor的博客 1814

PID控制结构选型:位置式、增量式、PI、PD与前馈的工程决策指南

PID控制是工业自动化中最基础也最易误用的闭环控制技术。其核心并非单一算法,而是多种误差处理机制——位置式强调绝对指令输出,增量式专注相对动作微调,PI解决稳态偏差,PD抑制动态振荡,前馈则实现扰动预补偿。不同结构对应不同的物理系统特性:大惯性对象需积分抗饱和,嵌入式平台重计算效率与抗噪能力,快响应环节忌微分噪声放大,确定性扰动宜用前馈主动抵消。理解各结构的原理边界、硬件约束与失效模式,才能在电机调速、温控、定位等真实场景中避免超调、振荡与退饱和等典型故障,实现稳定、鲁棒、可复现的工程落地。

weixin_29194817的博客 213

【AI Infra】【RLHF框架】VeRL中WorkerGroup与Ray资源调度的协同机制剖析

本文深入剖析了VeRL框架中WorkerGroup与Ray资源调度的协同机制。通过解析Ray Placement Group的资源抽象和VeRL的RayResourcePool封装,详细阐述了WorkerGroup如何与底层资源精确绑定,并实现RLHF训练中异构、多阶段任务的灵活资源分配与动态调整,为大规模分布式强化学习训练提供了高效解决方案。

weixin_29204205的博客 391

PID控制策略选型实战:位置式、增量式、PI、PD与前馈应用指南

PID控制是工业闭环系统的核心基础,其本质并非抽象数学公式,而是嵌入式硬件资源、传感器噪声特性、执行器物理约束与被控对象动态响应之间的工程权衡。位置式PID适合宽输出裕量场景但易积分饱和;增量式PID以差分输出规避饱和风险,更适配MCU资源受限的电机驱动与精密流量控制;PI因结构简洁、抗扰性强,成为温控、液位等慢动态过程的首选;PD牺牲稳态精度换取快速响应,常用于机械臂制动或姿态稳定;前馈控制则通过可测扰动预补偿,显著提升系统鲁棒性与响应速度。本文聚焦真实嵌入式项目落地,覆盖STM32/ESP32平台代码实

weixin_29164843的博客 242

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

fyihdg的专栏 1218

西门子与汇川伺服脉冲连接(速度模式)

如何使用西门子PLC与汇川伺服进行脉冲连接

2301_77347966的博客 1万+

PID控制结构选型实战:位置式、增量式、PI、PD与前馈的本质差异

PID控制是工业自动化中最基础也最易误用的核心技术。理解其不同结构——位置式(累积误差驱动绝对输出)、增量式(差分调节适配连续执行器)、PI(零稳态误差的务实选择)、PD(抑制动态超调的阻尼方案)以及前馈(基于扰动预测的开环补偿)——关键在于匹配物理对象特性而非套用公式。这些结构分别对应不同的系统惯性、抗扰需求、设定值变化频率和执行器响应机制。在温控、电机调速、压力闭环等典型场景中,选错结构比参数调不好后果更严重。本文从示波器波形解读出发,结合八年现场调试经验,揭示五类结构的真实工程语义与落地约束。

weixin_29169899的博客 322

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 202

PID控制器原理、参数整定与工程实践全解析

在自动控制领域,反馈控制是确保系统稳定运行的核心机制。其基本原理是通过传感器测量被控对象的实际输出,与期望的设定值进行比较得到误差,控制器根据误差计算并输出控制信号,驱动执行机构动作,从而形成一个闭环,使系统输出自动逼近设定值。PID(比例-积分-微分)控制器作为最经典、应用最广泛的反馈控制算法,其技术价值在于以简洁的数学模型实现了强大的控制性能。它通过比例环节快速响应当前误差,积分环节消除稳态误差,微分环节预测误差变化趋势并抑制超调,三者协同工作,能够在多种干扰下实现精确、稳定的控制。这种算法广泛应用于机

weixin_34218890的博客 378

信息安全管理与评估赛题解析-单机取证(含环境)

链接:https://pan.baidu.com/s/1OMzIq884dW2vAiUp0k2Ppg。链接:https://pan.baidu.com/s/1i5daMqhD53wYeQ6hYzRK6Q。链接:https://pan.baidu.com/s/1QFAjdQZK4sJ-gGRP42XPKA。链接:https://pan.baidu.com/s/1BSXvqN2ZGCQXewgFULoeyQ。链接:https://pan.baidu.com/s/1g9zu5ngBz_KMjW1eBMkJAw。

Brucye 1835

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8427

电赛控制题备赛指南:从PID算法到硬件调试的完整实践

闭环控制系统是自动化领域的核心概念,通过传感器、控制器和执行器构成反馈回路,实现对被控对象状态的精确调节。其基本原理在于实时比较目标值与实际值,并根据误差计算控制量,从而驱动系统稳定、快速、准确地跟踪指令。这一技术价值在于将理论算法转化为可靠的工程实践,广泛应用于电机控制、机器人、智能车等场景。在电子设计竞赛中,控制类题目正是对这一能力的综合考察,要求选手将PID控制算法与STM32等硬件平台深度结合。本文以电机控制为典型场景,深入剖析了增量式PID的实现、参数整定技巧以及硬件调试清单,帮助参赛者构建从理论

weixin_30872577的博客 314

把浮点数这件小事讲清楚:ABAP 7.51 里 Open SQL 与 ABAP CDS 的 FLTP 新玩法与避坑指南

ABAP浮点数计算的风险与应对 摘要:ABAP项目中的浮点数(FLTP)在跨平台计算时存在误差风险,同一逻辑在不同数据库平台可能产生细微差异。ABAP 7.51新增了两项关键能力:1)Open SQL和ABAP CDS中可为AVG函数指定结果类型,避免默认返回FLTP;2)ABAP CDS提供FLTP_TO_DEC转换函数。但需注意这些转换仍可能存在平台相关差异,且FLTP_TO_DEC会截断而非四舍五入小数位。开发者在涉及金额、数量等关键业务计算时,应明确数值语义并设计容错机制。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

霍尔传感器角锁相环 (PLL) 滤波简谈

本文探讨了锁相环(PLL)在无刷电机控制中对霍尔传感器角度信号的滤波处理。由于霍尔传感器存在安装偏差、逻辑毛刺等非理想特性,其输出的角度信号带有明显噪声。文中详细介绍了PLL的实现方法:通过鉴相器比较霍尔角度与估算角度,采用增量式PID作为环路滤波器,最后通过压控振荡器输出平滑角度。完整的PLL算法实现了对离散霍尔信号的有效滤波,显著改善了角度信号的平滑性。实验波形对比验证了该方法的有效性。

nullccc的博客 1727

微信小程序云开发 - 实现商家转账到零钱(微信企业付款到零钱) V3功能流程及完整实例代码,过微信云开发的云函数实现企业付款到零钱(提供详细示例源码纯云函数实现,证书、密钥、签名等各种常见问题解决方案

企业付款到零钱(微信小程序提现功能,提现到零钱)微信小程序-云函数实现微信企业付款到零钱功能,实现微信商户号中的企业付款到零钱的功能,微信小程序+云开发+商家转账至零钱+微信小程序用户提现,使用云开发环境的云函数实现微信小程序的支付功能,微信小程序实现微信企业付款到零钱功能的流程,V3 V2基于微信云开发的商家转账至零钱,小程序云函数企业付款到零钱功能实现,云开发实现微信商户支付企业付款到零钱功能,不用服务器纯云函数实现,详细示例代码demo教程,API证书错误,转账不到账怎么办,密钥生成有误,转账失败,有

🏆 前端领域优质创作者 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

从PID到ADRC:构建控制算法地图,打通理论到工程实践

控制算法是自动化、机器人及嵌入式系统的核心,其演进遵循从经典到现代再到智能的逻辑。经典控制理论以PID及其变体(如抗积分饱和、模糊PID)为基础,通过反馈消除误差,广泛应用于工业场景。现代控制理论如LQR和MPC,基于状态空间和优化,能处理多变量、有约束的系统。面对模型不确定性和强非线性,自抗扰控制(ADRC)和滑模变结构控制等先进算法展现出强大鲁棒性。理解这些算法的原理、价值与应用场景,如电机FOC控制、过程控制及网络拥塞控制,能帮助工程师构建系统化的知识体系与工具箱,实现从理论到工程实践的高效转化与创新

weixin_30599769的博客 342

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 无刷电机三项霍尔连接线序组合详细分析与波形实例
下一篇: 无刷电机强拖程序解析
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值