嵌入式PID控制原理与比例项工程实现

从零开始掌握PID调参:温控系统实战指南 本文是一份面向嵌入式开发者的PID调参实战指南。文章以温控系统为例,深入浅出地解释了PID控制算法中比例、积分、微分三个核心环节的作用与调参逻辑,并提供了从零开始的调参步骤、进阶技巧及常见问题解决方案,帮助读者快速掌握这一经典控制算法,实现精准稳定的温度控制。 阅读详情

1. PID控制算法的工程本质与结构解析

PID控制并非抽象的数学公式堆砌,而是嵌入式系统中应对物理世界动态特性的工程实践结晶。其核心价值在于将传感器采集的物理量(如温度、压力、转速)与用户设定的目标值进行闭环比对,并生成精确的执行器驱动信号。理解PID必须回归到硬件系统层面:它连接着MCU的ADC采样通道、定时器PWM输出模块、以及加热丝、电机、阀门等真实负载。任何脱离硬件约束讨论PID参数整定的行为,都会在实际部署中遭遇稳定性崩溃或响应迟钝。

PID控制器的输入端接收两个关键信号:设定值(Setpoint, SV)和过程变量(Process Variable, PV)。SV是用户通过按键、编码器或电位器设定的目标参数,例如恒温箱要求维持的85℃;PV则是传感器实时反馈的当前状态,如DS18B20测得的实际温度值。二者之差定义为偏差(Error, e),即e(k) = SV - PV(k),其中k代表第k次采样时刻。这个偏差信号是整个控制逻辑的起点,它量化了系统当前状态与期望目标之间的差距。值得注意的是,偏差符号具有明确物理意义:e(k) > 0表示当前值低于目标(欠调),e(k) < 0表示当前值超过目标(超调),e(k) = 0则理论上达到稳态。但在实际系统中,e(k) = 0往往意味着控制器输出归零,这正是比例控制固有缺陷的根源。

PID的“P”、“I”、“D”三部分并非并列的独立模块,而是对同一偏差序列e(k)在不同时间维度上的特征提取与加权处理。整个算法可视为一个动态滤波器,其输出u(k)是偏差序列的线性组合:

u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]

其中Kp、Ki、Kd为可调增益系数。这一公式背后对应着三层物理意义:P项关注“此刻”的偏差强度,I项累积“历史”的偏差总量,D项预测“下一刻”的偏差变化趋势。这种分层设计使PID能同时兼顾响应速度、稳态精度与抗扰动能力——这是单一比例控制无法实现的系统级平衡。

2. 比例控制(P)的硬件实现原理与局限性

比例控制是PID算法中最基础且最易实现的部分,其数学表达为u_p(k) = Kp * e(k)。在嵌入式系统中,该运算通常由MCU的通用定时器配合GPIO完成。以STM32F4系列为例,假设使用TIM3通道1生成PWM信号驱动MOSFET控制加热丝,其关键配置包括:将TIM3时基设置为1kHz(1ms周期),捕获/比较寄存器CCR1决定占空比。当Kp=10且e(k)=15℃时,u_p(k)=150,该数值被直接映射至CCR1寄存器(需做数值范围校验,如限定0-1000)。此时占空比为15%,加热丝在1ms内导通150μs,平均功率为额定功率的15%。

比例控制的核心优势在于其直观的物理对应关系:偏差越大,输出驱动越强。当环境温度远低于设定值时(如室温20℃设定85℃,e=65℃),Kp放大后产生高占空比,加热丝全功率运行,系统快速升温;当温度接近目标值时(e=2℃),输出显著降低,避免过冲。这种线性响应特性使其成为大多数工业控制器的默认启动模式。然而,其致命缺陷源于数学本质——当e(k)=0时,u_p(k)必然为零。这意味着一旦PV精确等于SV,控制器立即停止输出,加热丝完全断电。在真实热力学系统中,断电后热量会通过传导、对流持续散失,导致PV迅速下降,e(k)重新变为正值,控制器再次启动。这种“启-停”振荡造成稳态误差(Steady-State Error),系统永远在目标值附近小幅波动而无法真正锁定。

该缺陷在电机位置控制中同样显著:若采用纯比例控制调节舵机角度,当舵机到达目标位置时输出归零,但机械摩擦力与负载扰动会使舵机轻微回弹,触发新一轮调节。实测表明,在无外部扰动的理想环境下,比例控制的稳态误差Δe满足Δe = SV / (1 + Kp * G),其中G为被控对象开环增益。增大Kp虽可减小Δe,但会加剧超调与振荡,最终导致系统不稳定。因此,单纯比例控制仅适用于对稳态精度要求不高的场景,如风扇转速粗略调节。

3. 偏差序列的时间维度分析:从采样点到控制决策

PID算法的有效性高度依赖于对偏差序列e(k)的时序特征挖掘。该序列并非简单的数值列表,而是被控对象动态特性的数字镜像。以温度控制系统为例,假设MCU每秒通过ADC采集一次DS18B20数据,开机后得到序列{e(1), e(2), e(3), …, e(k)}。其中e(1)反映系统上电瞬间的初始偏差(通常最大),e(k)为最新采样值,而e(k-1)、e(k-2)则构成最近的历史窗口。这三个时间点的数据蕴含着不同的控制信息:

  • e(k)(当前偏差) :表征系统瞬时状态。其绝对值大小决定响应强度,符号指示调节方向。在嵌入式代码中,该值通常存储在全局变量 int16_t current_error 中,供主循环或中断服务程序直接读取。
  • e(k-1)(前一时刻偏差) :与e(k)共同构成微分项计算基础。二者之差[e(k)-e(k-1)]反映偏差变化速率,即温度上升/下降的快慢。若该差值为正且较大,说明系统正在快速接近目标,需提前减小输出以防超调;若为负且绝对值大,则表明系统正急速偏离,需紧急加大驱动。
  • 历史偏差累积Σe(i) :从系统启动到当前时刻的所有e(i)之和。该累加值在内存中通常用32位或64位变量存储(如 int32_t integral_sum ),以避免16位变量溢出。其物理意义是系统长期累积的“未补偿误差”,是消除稳态误差的关键。例如,若加热丝因散热导致每秒仅升温0.8℃,而目标升温速率为1.2℃,则每秒产生0.4℃的负偏差,经数分钟累积后,积分项将显著增大,迫使控制器输出持续高于比例项,最终抵消散热损失,实现精确稳态。

在资源受限的MCU上,历史序列存储需权衡精度与开销。全序列存储(如数组 e_history[1000] )虽完整但消耗大量RAM;实践中常采用滑动窗口法,仅保存最近N个值(N=10~100),或使用一阶低通滤波近似积分效果。无论何种实现,其底层逻辑均指向同一工程目标:将时间维度上的偏差演化,转化为可执行的控制动作。

4. 比例增益Kp的工程整定方法与实践陷阱

Kp是PID三个参数中首个需要整定的关键系数,其取值直接决定系统响应的“激进程度”。整定过程绝非盲目试错,而需遵循严格的工程步骤。推荐采用“临界比例度法”(Ziegler-Nichols Method)的嵌入式适配版本:

  1. 初始化准备 :将Ki、Kd置零,仅启用比例控制。选择保守的初始Kp值(如Kp=1),确保系统稳定运行。
  2. 阶跃测试 :在安全条件下(如空载加热),施加阶跃设定值变化(如SV从25℃跳变至60℃),用逻辑分析仪捕获PWM输出波形及ADC采样值。
  3. 逐步增大Kp :每次增加Kp(如+0.5),重复阶跃测试,观察系统响应。记录临界振荡时的Kp值(Ku)及振荡周期(Tu)。例如,当Kp=8.5时出现等幅振荡,Tu=12s。
  4. 计算推荐值 :根据Z-N公式,Kp = 0.6 * Ku。本例中Kp ≈ 5.1。

实践中需警惕三大陷阱:
- 采样率失配 :若ADC采样间隔(如100ms)远大于系统热时间常数(如5s),则e(k)变化缓慢,Kp需大幅提高才能获得足够响应。此时应优先优化采样策略,而非强行增大Kp。
- 执行器饱和 :当Kp过大导致u_p(k)超出PWM寄存器范围(如>1000),MCU会自动截断输出,造成非线性失真。应在代码中加入饱和保护:
c int16_t output = (int16_t)(Kp * current_error); if (output > MAX_PWM) output = MAX_PWM; else if (output < MIN_PWM) output = MIN_PWM; __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, output);
- 噪声敏感性 :传感器原始数据常含高频噪声,直接用于e(k)计算会放大Kp的误动作。必须在ADC读取后实施硬件滤波(RC电路)与软件滤波(滑动平均或一阶IIR)。例如,对连续10次ADC采样值取平均,再计算e(k),可显著抑制噪声干扰。

某工业烘箱项目中,工程师未对PT100温度传感器做硬件滤波,直接使用Kp=3.5,导致PWM输出在目标值附近高频抖动,加热丝寿命缩短40%。后增加100Hz RC低通滤波并改用滑动平均,Kp优化至4.2,系统稳定运行。

5. PWM输出的嵌入式实现细节与热管理

PID控制器的最终输出必须转化为物理世界的能量调控,PWM是最常用的执行方式。其嵌入式实现涉及多个硬件模块的协同,绝非简单设置占空比即可。以STM32 HAL库为例,关键配置如下:

// 1. 时钟配置:确保APB1总线时钟稳定(TIM3挂载于APB1)
__HAL_RCC_TIM3_CLK_ENABLE();

// 2. GPIO初始化:配置PA6为复用推挽输出
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 3. 定时器基础配置:1kHz PWM频率(ARR=999,PSC=83)
TIM_HandleTypeDef htim3;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 83;        // 84MHz/(83+1)=1MHz计数频率
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;          // 1MHz/1000=1kHz PWM频率
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim3);

// 4. PWM通道配置:CH1输出,初始占空比0%
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;              // CCR1初始值
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

在热管理系统中,PWM输出需考虑功率器件的热约束。MOSFET在开关过程中存在米勒平台区,若PWM频率过高(>20kHz),开关损耗剧增,结温可能超过150℃。实测数据显示,IRF540N在10kHz PWM下结温为75℃,升至25kHz时达112℃。因此,需根据MOSFET规格书中的SOA(安全工作区)图,选择兼顾效率与散热的频率。对于加热丝等惯性负载,1-5kHz已足够,既避免可闻噪声,又控制开关损耗。

此外,PWM输出必须与ADC采样严格同步。若在PWM高电平期间采样温度,传感器读数会受电源纹波影响;在低电平期间采样,则可能错过温度上升趋势。最佳实践是将ADC触发源设为TIM3的更新事件(UEV),确保每次PWM周期结束时启动采样,此时电源电压最稳定,且能准确捕获该周期内的平均温度变化。

6. 比例控制的工程改进:偏置电压(Bias)与死区补偿

针对比例控制稳态误差的固有缺陷,工程中常采用两种低成本改进方案:偏置电压(Bias)注入与死区补偿(Dead Band Compensation)。二者均不增加算法复杂度,却能显著提升实际控制精度。

偏置电压注入 是在比例输出上叠加一个恒定偏移量u₀,使控制律变为u(k) = Kp * e(k) + u₀。该偏移量对应PWM的最小有效占空比,确保即使e(k)=0,加热丝仍维持微弱功率。u₀的确定需结合系统热平衡分析:测量系统在无控制输出(u=0)时的自然降温速率,反推维持目标温度所需的最小功率。例如,某恒温箱在85℃时每分钟降温0.3℃,实验测得5%占空比可恰好补偿此散热,则u₀设为50(对应0-1000范围)。代码实现极为简洁:

int16_t u_p = (int16_t)(Kp * current_error);
int16_t output = u_p + BIAS_VALUE;  // BIAS_VALUE = 50
// 后续执行饱和限制与PWM输出

需注意u₀不可过大,否则在e(k)<0时(超调状态)会加剧过冲。建议u₀ ≤ 10% * MAX_PWM。

死区补偿 则针对传感器与执行器的非线性区域。许多温度传感器在接近目标值时分辨率下降,或MOSFET存在导通阈值电压,导致小信号无法驱动。此时可在e(k)绝对值小于阈值δ时(如|e(k)|<0.5℃),强制输出u₀,形成“死区-补偿”机制:

if (abs(current_error) < DEAD_BAND) {
    output = BIAS_VALUE;
} else {
    output = (int16_t)(Kp * current_error) + BIAS_VALUE;
}

该方法在保持比例控制响应特性的同时,彻底消除了小偏差下的停滞现象。某医疗设备温控项目采用此方案后,稳态误差从±1.2℃降至±0.15℃,完全满足临床要求。

7. 实际项目中的比例控制调试经验

在多年嵌入式温控项目实践中,比例控制的调试远非参数调整这般简单,更多是系统级问题的诊断与解决。以下是几个典型场景及应对策略:

场景一:响应迟钝与振荡并存
某注塑机模具温度控制器在Kp=2.5时升温缓慢,增大至Kp=4.0又出现剧烈振荡。排查发现ADC采样引脚靠近大电流加热回路,存在严重电磁干扰。解决方案:在ADC输入端增加π型滤波(100nF电容+10Ω电阻+100nF电容),并改用DMA方式批量采样,消除CPU中断延迟。滤波后Kp优化至3.2,响应时间缩短35%,无振荡。

场景二:冷热态Kp需求矛盾
同一加热系统在低温段(20-50℃)需高Kp加速升温,高温段(70-90℃)需低Kp防超调。静态Kp无法兼顾。采用分段PID策略:根据PV所在温度区间切换Kp值。代码中建立查找表:

const float Kp_table[TEMP_SEGMENTS] = {3.5, 3.0, 2.5, 2.0}; // 对应四个温度段
uint8_t segment = PV / 20; // 每20℃为一段
Kp = Kp_table[segment > 3 ? 3 : segment];

该方案使全温区超调量控制在±0.8℃内。

场景三:多传感器数据融合
单点温度测量易受局部气流影响。在大型烤箱中,部署3个DS18B20分别位于上、中、下层。比例控制不再基于单点e(k),而是计算加权偏差:e_weighted = 0.4 e_top + 0.3 e_mid + 0.3*e_bottom。权重根据热空气上升特性设定,使控制更贴近整体温度分布。

这些经验表明,优秀的比例控制实现,是硬件设计、信号调理、软件架构与物理认知的深度耦合。参数只是表象,背后的系统理解才是工程能力的核心。

四轴PID讲解 插播一条DJI招聘信息【常年有效】:包括控制算法、软件功能开发、SDK、嵌入式软件开发、GNSS接收机设计、测试开发(包括CI持续集成)。请各位对空中机器人,地面机器人,教育机器人有兴趣的同学将简历发送至nemol1990@gmail.com   正文开始:这篇文章分为三个部分:   PID原理普及 常用四轴的两种PID算法讲解(单环PID、串级PID) 如何做到垂直起飞、四轴飞行... 阅读详情

相关推荐

增量式PID控制原理与嵌入式实现

增量式PID是一种面向实时控制的离散化反馈调节算法,其核心是输出控制量的变化值而非绝对值,从而规避积分饱和、降低计算开销并提升抗设定值突变能力。该算法基于偏差序列e(k)、e(k-1)、e(k-2)构建三阶差分结构,天然适配资源受限的MCU平台。在电机控制等典型应用场景中,它通过整数运算、状态滚动更新与硬件时序协同,实现高鲁棒性与低延迟响应。结合编码器测速、PWM驱动和SysTick定时采样,增量式PID成为STM32等主流嵌入式平台实现闭环调速的关键技术路径。

weixin_42600407的博客 333

Linux发送接收邮件

(5)使用命令echo "This is second email" | mail -s "email" 用户名 发送邮件。(4)root用户发送邮件内容为"This is first email" 标题为 "email"给root用户。(3)使用命令systemctl start sendmail启动sendmail(此过程消耗时间)(2)在开启服务IMAP/SMTP后点击开启即可获得授权码。(3)在/etc/mail/rc文件中配置以下信息。(5)在root用户使用命令mail查看邮件。

cronaldo91的博客 2919

PID控制原理与工程实践详解

PID控制是一种广泛应用于工业自动化领域的经典控制算法,通过比例(P)、积分(I)、微分(D)三个环节的组合实现对系统的精确控制。其核心原理是通过实时计算系统偏差,并基于数学模型生成控制量来调节被控对象。在工程实践中,PID算法需要经过离散化处理以适应数字控制系统,同时参数整定是关键环节,常用的方法包括临界比例度法和衰减曲线法。该技术因其结构简单、鲁棒性强等特点,被广泛应用于电机控制、温度调节等场景。特别是在嵌入式系统实现时,还需处理积分饱和、测量噪声等典型问题。通过合理选择采样周期和参数优化,PID控制器

weixin_33582089的博客 356

嵌入式硬件篇---PID控制

以上就是今天要讲的内容,本文简单介绍了连续型PID和离散型PID的原理及各种PID的优缺点。

在你不想做的时候,正是应该做的时候。 6064

直流有刷电机电流环PID控制原理与工程实现

电流环是伺服控制系统中最内层、带宽最高的闭环环节,其本质是通过实时调节电枢电流实现对电磁转矩的直接、线性控制(T_e K_t × I_a)。基于PID算法的电流闭环,依托采样-计算-执行的确定性时序,可显著提升系统抗扰性、动态响应与稳态精度。在嵌入式平台(如STM32)上,需协同硬件设计(低侧采样、同步ADC触发)与软件策略(多级数字滤波、增量式PID、零点漂移抑制),才能突破噪声、延迟与非线性等工程瓶颈。本文聚焦直流有刷电机场景,详解从物理建模、信号链路、滤波设计到PID整定的全栈实现路径,覆盖电流采样

weixin_42593701的博客 566

linux mail

轻松搭建Postfix+邮件服务器系统(08-04-06) 博文链接:https://zhengdl126.iteye.com/blog/978839

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文介绍了PID控制的基本原理与应用。PID控制器由比例(P)、积分(I)、微分(D)三部分组成,分别用于调节当前偏差、消除稳态误差和预测系统行为。文章重点讲解了工程实现中的两个关键限幅技术:积分限幅防止积分项过度累积导致震荡,输出限幅确保PWM信号在有效范围内。并给出了STM32的PID控制工程实现框架,包括定时器配置(PWM生成、采样定时、编码器接口)及中断处理流程。通过这三个定时器的配合,实现了电机位置闭环控制,并将实际速度值通过串口发送给上位机显示。代码示例展示了积分限幅函数和输出限幅的具体实现方法

qq_1033275663的博客 3万+

LC滤波器设计实战:从理论计算到PCB布局的完整指南

滤波器是信号处理与电路设计中的基础组件,用于从复杂信号中提取特定频率分量或抑制干扰噪声。其核心原理基于电感(L)和电容(C)等无源元件的频率选择特性,通过特定的网络拓扑实现幅频与相频特性的塑造。在工程实践中,LC滤波器因其结构简单、可靠性高、成本可控,成为射频、模拟及电源电路中的关键技术手段。其设计价值在于将理论网络综合转化为可量产、高性能的硬件解决方案,广泛应用于通信系统、音频处理、电源净化和传感器信号调理等场景。本文聚焦于LC滤波器的工程设计全流程,深入剖析了巴特沃斯、切比雪夫等经典类型的选型权衡,并重

weixin_34194829的博客 273

嵌入式软件算法之PID闭环控制原理

在机器人、工业控制等领域经常遇到需要目标控制的问题,如加热至目标温度、控制气压达到目标值或者是机器人关节转角位置/速度控制等。这时候就要加入传感器引入反馈量进行正负反馈调节,从而提高与控制目标的逼近程度。实现此类自动控制就要添加对反馈量的引入处理,嵌入式自动控制领域中最常用最容易实现的便是PID反馈控制,常见的平衡车、无人机、空调、热水器等均基于PID控制来实现。闭环控制是相对于开环控制而言的,开环控制仅有单输入单输出,无反馈信号,常用于控制精度不高的场合。...

weixin_43058521的博客 6014

Kaggle | 总奖池超200万美金的数学竞赛AIMO2冠军方案

••••结论1:通过结合高质量大规模数据集、工具集成推理和生成式选择方法,可以构建在挑战性数学问题上达到最先进水平的语言模型。本文的方法在 AIMO-2 竞赛中的胜利以及在多个数学基准上的 SOTA 结果验证了这一策略的有效性。结论2:发布 OpenMathReasoning 数据集、OpenMath-Nemotron 模型和代码是社区的宝贵财富。

hxshine的博客 1198

RNA-Seq数据分析实战:从FastQC到STAR比对的完整流程(附避坑指南)

本文提供了RNA-Seq数据分析从FastQC质控到STAR比对的完整实战流程与避坑指南。详细解读了FastQC/MultiQC报告的关键指标,并重点阐述了STAR比对工具的核心参数设置、索引构建及性能优化策略,旨在帮助用户获得准确可靠的比对结果,为下游基因表达分析奠定坚实基础。

weixin_29290259的博客 92

【过程控制系统】第4章 PID控制原理,数字PID控制算法

第4章 PID控制原理4.l PID控制的特点 4.2 比例控制(P控制) 4.3 比例积分控制(PI控制) 4.4 比例积分微分控制(PID控制) 4.5 数字PID控制 4.6 利用MATLAB实现PID控制规律 本章小结PID控制是比例(Proportional)积分(Integral)微分(Differential)控制的简称。在生产过程自动控制的发展历程中,PID控制是历史最久、应用最广、适应性最强和控制效果良好的一种基本控制方式。

周文龙的博客 3317

SAP接口错误查询日志

随着数字经济的迅速发展,企业数字化转型不在只追求“业财一体化”,而是在业务端也想要进行更为精细化的管理,所以很多企业在SAP ERP的基础上,集成更多垂直领域更精细的外围系统,比如销售CRM系统,采购SRM系统,生产MES系统等等,琳琅满目的产品,那对SAP实施来说,系统集成过程中,接口的一些报错查询能力必不可少,今天我们就介绍一下,SAP和CRM系统集成中接口常见的报错。

weixin_43657667的博客 2049

【PID系列】一文理解PID原理

PID原理通俗介绍

兽神 4830

Jaspersoft Studio 6.20.0 免注册安装指南(附下载链接)

本文提供了Jaspersoft Studio 6.20.0社区版的免注册安装详细指南。文章介绍了绕过官网注册获取安装包的多种可靠途径,并逐步详解了从启动安装器到首次运行的全过程,帮助用户快速完成安装与基础配置,高效开启报表设计工作。

mars5的博客 1697

汽车UDS诊断详解及Vector相关工具链使用说明——1.1 应用层协议整体介绍

本文我们先从整体的维度来介绍一下应用层协议,每个UDS服务都遵循本文中的协议。 一、SI(Service ID) SI是UDS指令的第一个字节,我们第一篇文章中提到的10等服务就是指这个服务的SI=0x10,它是服务的标识,每个服务的SI都是唯一的。 ...

weixin_42967006的博客 5476

PID 控制原理详解(面向储能变流器应用)

PID控制原理及应用概述 PID控制是一种由比例(P)、积分(I)和微分(D)三部分组成的线性反馈控制器。比例项快速响应误差,积分项消除稳态误差,微分项抑制震荡。在储能变流器(PCS)中,PI控制更常见,如母线电压环(PI稳定电压)和电流环(PI快速调节)。PID需离散化后在嵌入式系统中实现,调参需平衡响应速度与稳定性(如Ziegler-Nichols法)。局限性包括对正弦信号控制差(需PR控制器)和多变量耦合问题(需解耦控制)。实际应用中需根据场景选择PI、PD或PR控制器。 (字数:150)

行秋的博客 1696

3步搞定.NET Core在UOS上的部署?手把手教你从零到上线!

本文详细介绍了如何在统信UOS系统上部署.NET Core应用程序的完整流程。首先,通过安装.NET Core SDK,确保UOS系统能够编译和运行C#代码。接着,创建一个简单的控制台应用,并验证其本地运行情况。最后,通过发布应用、传输文件到UOS服务器,并解决权限问题,确保应用能够在UOS上顺利运行。文章还提供了常见问题的解决方案,如依赖缺失、权限不足和服务启动失败等,帮助开发者避免常见陷阱。通过本文的指导,开发者可以轻松将.NET Core应用部署到UOS系统,并实现24/7的稳定运行。

java专栏 589

嵌入式PID控制原理与工程调参实战指南

PID控制是自动控制中最基础、应用最广泛的闭环调节算法,其核心由比例(P)、积分(I)、微分(D)三部分构成,分别对应误差的瞬时值、累积量与变化率。从控制理论看,P项提供快速响应但存在稳态误差;I项消除静态偏差却易引发积分饱和;D项抑制超调与振荡但对传感器噪声高度敏感。在嵌入式系统中,该算法广泛应用于电机控制、平衡小车、云台跟踪、距离调节等场景,需结合测量值、设定值、误差定义及PWM输出极性等工程细节协同设计。本文深入剖析单环与多环PID的架构逻辑、典型调参流程(如先P后D、由内而外)、抗饱和策略及常见失效

xx56789的博客 812

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2487

深度学习工具包 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")

07_嵌入式C与控制理论入门:比例-积分-微分控制(PID控制)全解析与优化

首先定义一个 PID 结构体,把所有参数、中间变量都封装进去。这样做的好处是:方便实现多通道控制(比如同时控温度和转速),后续维护也清晰。// PID参数结构体(位置式,含不完全微分+微分先行)// 1. PID核心参数float Kp;// 比例系数float Ki;// 积分系数float Kd;// 微分系数float T;// 采样周期(单位:s)// 不完全微分的滤波系数(0<alpha<1)// 2. 输入输出限制(防止输出超出执行器范围,如PWM占空比0~100%)

C语言无原生OOP特性,却能借结构体+函数指针实现封装、继承、多态,落地工厂等设计模式。博客中以标准C语法实操教学,融入跨平台兼容设计,助开发者掌握C语言OOP核心与工程实践技巧。 1107

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

嵌入式PID控制原理与工程实现详解

PID控制是工业自动化中最基础、应用最广泛的闭环反馈控制技术,其核心通过比例(P)、积分(I)、微分(D)三个环节协同作用,实现对温度、速度、压力等物理量的动态调节。原理上,P提供即时响应,I消除稳态误差,D抑制超调并增强抗扰性;技术价值在于不依赖精确数学模型、计算开销低、参数物理意义明确,特别适配MCU等资源受限平台。典型应用场景涵盖电机调速、恒温控制、液位调节等嵌入式实时系统。本文深入剖析PID的离散化实现(尤其是增量式结构)、抗积分饱和、微分滤波、Ziegler-Nichols整定与现场试凑法,并结合

weixin_35755434的博客 195

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PID控制原理与嵌入式实现:从闭环本质到多环协同

PID控制是自动控制领域最基础且广泛应用的闭环反馈控制方法,其核心在于通过比例(P)、积分(I)、微分(D)三项协同,实现对系统误差的动态补偿。P项提供即时响应,I项消除稳态误差,D项抑制超调与振荡——三者共同构成具备抗干扰性、鲁棒性和精度保障的工程控制范式。在嵌入式系统中,PID需离散化实现,并严格处理积分饱和、微分噪声、采样周期匹配等关键问题。典型应用场景包括温控系统、电机调速、平衡小车姿态稳定等,其中多环PID架构(如直立环+速度环)进一步提升了复杂系统的解耦控制能力与动态性能。

kappa的博客 699

【PID】控制原理与程序实现详解

本文概述了PID控制的基本原理及其在电机调速中的应用。PID控制是基于误差调节的算法,包含比例(P)、积分(I)、微分(D)三个环节。比例项Kp决定调节力度,但单独使用无法完全消除稳态误差。文章详细分析了只有比例控制时电机受摩擦力影响的调节过程。此外还介绍了离散PID的两种实现方式:位置式和增量式,并讨论了调控周期T的选择原则。

2402_83411382的博客 1134

嵌入式中PID控制的实现与验证(开源)

本文介绍了PID控制器的C语言实现方法,包括位置式和增量式两种算法。内容涵盖PID控制原理、离散化差分方程、代码实现(含抗饱和和输出限幅处理)及嵌入式应用示例。通过单相逆变器闭环控制的仿真验证,表明两种PID实现方式均能有效跟踪给定值,控制效果与系统自带PID一致。文章还提供了获取仿真模型的方法,并预告将在后续视频中展示嵌入式实际效果。该PID代码可直接移植到STM32、DSP等嵌入式平台使用。

qq_37690283的博客 1646
上一篇: 避坑指南:Unity Sentis导入ONNX模型常见的5个错误及解决方法
下一篇: ESP32 GPIO与ESP-IDF工程实践:从LED到蓝牙HID开发基础
普通网友
博客等级 码龄4年 95粉丝 1459原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值