手机网站建设银川网站建设

北京一乐物流有限公司 2026/09/09 18:06:19

位置式PID控制原理

位置式PID算法的离散形式为:

u(k)=Kp×e(k)+Ki×∑e(j)+Kd×[e(k)−e(k−1)]u(k) = Kp × e(k) + Ki × ∑e(j) + Kd × [e(k) - e(k-1)]u(k)=Kp×e(k)+Ki×e(j)+Kd×[e(k)e(k1)]

其中:

  • u(k)u(k)u(k):当前时刻控制输出(PWM占空比)
  • e(k)e(k)e(k):当前误差 = 目标转速 - 实际转速
  • ∑e(j)∑e(j)e(j):误差累积和(积分项)
  • Kp,Ki,KdKp, Ki, KdKp,Ki,Kd:PID参数

硬件配置

所需外设

  • 编码器接口:测量电机转速
  • PWM输出:控制电机驱动
  • 定时器:用于定时采样和PID计算

引脚配置示例

// PWM输出引脚 (控制电机)#defineMOTOR_PWM_PINGPIO_Pin_8#defineMOTOR_PWM_PORTGPIOA#defineMOTOR_PWM_TIMTIM1// 编码器输入引脚#defineENCODER_A_PINGPIO_Pin_6#defineENCODER_B_PINGPIO_Pin_7#defineENCODER_PORTGPIOA#defineENCODER_TIMTIM3

完整程序代码

1. PID结构体定义

typedefstruct{floatTarget;// 目标转速floatCurrent;// 当前转速floatError;// 当前误差floatLastError;// 上一次误差floatPreError;// 上上次误差floatKp;// 比例系数floatKi;// 积分系数floatKd;// 微分系数floatIntegral;// 积分累计floatIntegralMax;// 积分限幅floatOutput;// PID输出floatOutputMax;// 输出限幅floatOutputMin;// 输出下限}PID_TypeDef;// 初始化PID参数voidPID_Init(PID_TypeDef*pid,floatkp,floatki,floatkd,floatmax_output){pid->Kp=kp;pid->Ki=ki;pid->Kd=kd;pid->Integral=0;pid->Target=0;pid->Current=0;pid->Output=0;pid->OutputMax=max_output;pid->OutputMin=0;pid->IntegralMax=max_output*0.8f;// 积分限幅为输出的80%}

2. 位置式PID计算函数

// 位置式PID计算floatPID_Calculate(PID_TypeDef*pid,floattarget,floatcurrent){floatincrement=0;// 更新目标值和当前值pid->Target=target;pid->Current=current;// 计算误差pid->PreError=pid->LastError;pid->LastError=pid->Error;pid->Error=pid->Target-pid->Current;// 积分项处理(带积分限幅和抗积分饱和)pid->Integral+=pid->Error;// 积分限幅if(pid->Integral>pid->IntegralMax){pid->Integral=pid->IntegralMax;}elseif(pid->Integral<-pid->IntegralMax){pid->Integral=-pid->IntegralMax;}// 位置式PID计算pid->Output=pid->Kp*pid->Error+pid->Ki*pid->Integral+pid->Kd*(pid->Error-pid->LastError);// 输出限幅if(pid->Output>pid->OutputMax){pid->Output=pid->OutputMax;}elseif(pid->Output<pid->OutputMin){pid->Output=pid->OutputMin;}returnpid->Output;}

3. 编码器速度测量

// 编码器相关变量volatileint32_tEncoderCount=0;volatileint32_tLastEncoderCount=0;volatilefloatMotorSpeed=0;// 转速 RPM// 编码器计数读取(在编码器中断中调用)voidEncoder_Update(void){EncoderCount=(int32_t)TIM_GetCounter(ENCODER_TIM);TIM_SetCounter(ENCODER_TIM,0);// 清零计数器}// 速度计算函数(在定时中断中调用,如10ms)voidSpeed_Calculate(void){staticuint32_tlast_time=0;uint32_tcurrent_time=HAL_GetTick();uint32_ttime_diff=current_time-last_time;if(time_diff>=10){// 10ms计算一次速度int32_tpulse_diff=EncoderCount;EncoderCount=0;// 计算转速 (RPM)// 假设编码器分辨率: 1000脉冲/转// 公式: RPM = (脉冲数 / 编码器分辨率) × (60000 / 采样时间ms)MotorSpeed=(pulse_diff/1000.0f)*(60000.0f/time_diff);last_time=current_time;}}

4. PWM输出控制

// PWM初始化voidPWM_Init(void){TIM_OC_InitTypeDef sConfigOC={0};// PWM频率设置 (例如: 10kHz)htim1.Instance=TIM1;htim1.Init.Prescaler=84-1;// 84MHz/84 = 1MHzhtim1.Init.CounterMode=TIM_COUNTERMODE_UP;htim1.Init.Period=100-1;// 1MHz/100 = 10kHzhtim1.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&htim1);sConfigOC.OCMode=TIM_OCMODE_PWM1;sConfigOC.Pulse=0;// 初始占空比0%sConfigOC.OCPolarity=TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode=TIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(&htim1,&sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);}// 设置PWM占空比voidSet_PWM_Duty(floatduty_cycle){uint32_tpulse;// 限制占空比范围 0~100%if(duty_cycle<0)duty_cycle=0;if(duty_cycle>100)duty_cycle=100;// 计算PWM脉冲值pulse=(uint32_t)(duty_cycle*(TIM1->ARR+1)/100.0f);// 更新PWM占空比__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pulse);}

5. 主控制程序

PID_TypeDef MotorPID;floatTargetSpeed=1000.0f;// 目标转速 1000 RPMintmain(void){// 系统初始化HAL_Init();SystemClock_Config();// 外设初始化PWM_Init();Encoder_Init();// 编码器初始化(需要自己实现)TIM_Init();// 定时器初始化(用于定时采样)// PID参数初始化(需要根据实际电机调试)PID_Init(&MotorPID,0.5f,0.01f,0.05f,100.0f);while(1){// 在定时中断中调用Speed_Calculate()更新速度// 主循环中可以处理目标速度设定等// 每50ms执行一次PID控制staticuint32_tlast_pid_time=0;if(HAL_GetTick()-last_pid_time>=50){floatpwm_output;// PID计算pwm_output=PID_Calculate(&MotorPID,TargetSpeed,MotorSpeed);// 更新PWM输出Set_PWM_Duty(pwm_output);last_pid_time=HAL_GetTick();// 可以通过串口输出调试信息printf("Target: %.1f, Current: %.1f, PWM: %.1f%%
",TargetSpeed,MotorSpeed,pwm_output);}// 其他任务...HAL_Delay(1);}}

6. 定时器中断处理

// 定时器中断回调函数(例如1kHz)voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim->Instance==TIM2){// 假设TIM2用于定时采样// 更新编码器计数Encoder_Update();// 计算速度(每10次调用计算一次速度)staticuint8_tspeed_counter=0;if(++speed_counter>=10){Speed_Calculate();speed_counter=0;}}}

PID参数整定方法

手动整定步骤:

  1. 先调Kp:将Ki、Kd设为0,逐渐增大Kp直到系统开始振荡
  2. 再调Ki:加入Ki消除静差,但不要太大以免超调
  3. 最后调Kd:加入Kd抑制超调,改善动态性能

典型参数范围(需要根据实际电机调整):

// 直流有刷电机典型参数#defineKP_START0.1f// 开始调试值#defineKI_START0.001f#defineKD_START0.01f// 无刷电机典型参数#defineKP_BLDC0.3f#defineKI_BLDC0.005f#defineKD_BLDC0.02f

参考代码 位置式PID调节PWM占空比控制电动机转速www.3dddown.com/csa/70961.html

注意事项

  1. 采样时间选择:速度采样和PID计算周期要匹配,通常10-50ms
  2. 积分抗饱和:必须对积分项进行限幅
  3. 输出限幅:PWM占空比限制在安全范围内
  4. 编码器分辨率:根据实际编码器参数调整速度计算公式
  5. 电机死区:有些电机在低占空比时不转动,需要设置最小启动占空比

调试技巧

  1. 串口监控:实时输出目标速度、实际速度、PWM占空比
  2. 阶跃响应:观察系统对目标速度突变的响应
  3. 抗扰动测试:在电机运行时施加负载,观察恢复性能
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

如何建设网站网站制作建设

💡实话实说:CSDN上做毕设辅导的都是专业技术服务,大家都要生活,这个很正常。我和其他人不同的是,我有自己的项目库存࿰

2026/06/30 10:25:20

南京网站建设网站建设论坛

快速体验打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容:制作一个交互式LaTeX符号学习应用,包含:1)

2026/06/30 10:31:20

网站外链建设招商网站建设

西门子smart200三轴码垛机械手,触摸屏为昆仑通泰,CAD电气图纸,程序已经应用于设备上,稳定可靠,值得学习借鉴最近在产线升级

2026/06/30 11:39:27

建设部网站黄冈网站建设

M2FP文档详解:从API接口到WebUI操作全流程解析🧩 M2FP 多人人体解析服务在计算机视觉领域,人体解析(Human Parsing&

2026/06/30 10:35:51

网站建设中邢台网站建设

终极百度贴吧用户体验优化指南:15个实用脚本免费提升你的贴吧体验【免费下载链接】baidu-tieba-userscript需要:支持扩展的浏览器,例如谷歌&

2026/06/30 11:22:55

河南网站建设公司资阳网站建设

flac3d桩承式路堤填筑,设置了有桩基础和无桩基础的两种工况,模型考虑流固耦合,填筑施工后进行安全系数求解,无桩基础安全系数为1.11

2026/06/30 12:32:01

成都网站建设唐山网站建设

文章目录系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统截图基于Djan

2026/06/30 13:58:38

绍兴网站建设阿里网站建设

第一章:Open-AutoGLM WiFi连接不稳定排查概述在部署 Open-AutoGLM 智能系统时,WiFi 连接的稳定性直接影响设备的数据同步与远程控制能力。当设备

2026/06/30 13:55:38

深圳外贸网站建设河北网站建设

引言在物联网、工业互联网与运维监控领域,时序数据正以前所未有的速度迅猛增长。海量设备持续产生的数据流,对数据库提出了双重核心要求:既要支撑高速数据写入

2026/06/30 11:54:28

网站建设计划书天津网站建设公司

RHEL 8 中 KVM 虚拟化技术全解析1. 虚拟化技术概述虚拟化技术允许在单个主机操作系统内运行多个客户操作系统。常见的虚拟化方式有基于客户操作系统的虚拟化和基于管理程序(Hypervisor)的

2026/06/30 12:47:33