草庐IT

电机控制——PID参数理解

贾亚超 2023-08-26 原文

1、电机控制所需要的 PID 参数

电机控制,以个人经验来看,不论是双环速度环还是三环位置环,都只需要 P 和 I 两个参数,并不需要 D。

2、P 参数

P r o p o r t i o n n . 部分;份额;比例 Proportion \quad n. \quad 部分;份额;比例 Proportionn.部分;份额;比例
比例系数 P,比例系数是个实时响应的参数,改变 P 能够马上从系统响应上体现出来。例如增大比例系数P能使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,震荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。

只使用比例调节,系统一定会存在静差。结合直流电机调速系统分析,随着误差的减小,控制器的输出逐渐减小,当小到一定的程度后已经无法再通过提高pid控制器的输出(电机的控制输入如电压 k p ∗ e k_p*e kpe)来提高转速从而使目标转速和实际转速间的误差继续减小了,因为总要克服阻力做工的嘛,误差为零的时候电机没有能量输入,所以当然无法克服阻力做工。因此,虽然检测到误差,但是误差太小了,导致控制器输出值也太小了,已经无力让速度继续增加至目标速度,从而达到了有差平衡。这种现象在负载变大后尤其明显,负载增加后静差也会变大。想象一下,当前 k p ∗ e k_p*e kpe能驱动当前负载,当负载增大,想要继续匀速运行,就算根据能量守恒也能推断出 e e e增大才能再次匀速。所以纯比例肯定会有静差的。

3、I 参数

I n t e g r a t i o n n . 整合;融合; ( 数 ) 积分 Integration \quad n. \quad 整合;融合;(数)积分 Integrationn.整合;融合;()积分

  • 积分控制不能单独使用,必须配合以 P 控制。
  • 增加 I 控制能够消除只使用 P 控制时产生的静差
  • 系统稳态时的控制量由积分项单独提供,此时积分项相当于一个直流偏移。之所以不能把积分项设为常数,是考虑系统要满足动态特性,即随着目标转速的改变,系统稳态时的直流偏移也跟着改变。这个合适的直流偏移是 pid 控制器自动找到的,这很自动化,甚至产生了一个学科。

积分控制是使用一个滑窗中的累计历史误差,更细粒度地调整控制器的输出。因此只要误差不为零,控制器的输出就会因为积分作用而不断变化。转速低于设定值时误差为正,积分项增大,使控制器输出逐渐增大;转速高于设定值时误差为负,积分项减小,使控制器输出逐渐减小。积分调节的“大方向”是正确的,积分项有使误差向 0 变化的作用。一直要到系统处于稳定状态,这时误差恒为零,比例部分的控制输出为零,积分部分才不再变化,并且此时积分滑窗内的值刚好等于稳态时需要的控制量,因此积分部分的作用是消除稳态误差,提高控制精度,积分作用一般是必须的。

4、电机速度控制 pid 参数调节经验

电机为大疆的 M3508,使用 JScope 查看电调反馈的 CAN 报文,报文中有编码器测得的电机转速及当前角度。

调参经验如下:
1、先调P,从过阻尼开始逐渐增大P,直到第二个震荡波峰出现超调(即第二个波峰刚好越过target一点点),记录下此时的P值备用。
2、将上一步的P值乘0.7~0.8作为当前时刻的P值,此时加入I,从一个特别小的数开始逐渐增大I,直到出现了一点超调且没有静差。
3、第2步同时伴随着积分池大小的调节,想要位置环够硬,应该增大积分池(即让积分滑窗更长),以这个趋势为依据,不断调节。
4、电机控制,用不到D。

有关电机控制——PID参数理解的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  5. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  6. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  7. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  8. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  9. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  10. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

随机推荐