首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于直流电机/编码器的PID反馈位置控制器

基于直流电机/编码器的PID反馈位置控制器
EN

Stack Overflow用户
提问于 2013-06-21 13:58:17
回答 1查看 2.2K关注 0票数 2

我有一个困难的时间获得PID反馈和定位运行在同一时间。

我计算RPM的想法是:

  1. 启动定时器,并使用中断计数编码器脉冲。
  2. 使用一些简单的数学来转换为RPM。
  3. 使用重置变量并重新启动。

我可以计算RPM,但是我只能在计算之后调用PID控制器(不管我想要等待多久才能获得好的分辨率)。这导致了非常混乱的代码。有没有更简单的方法或者我遗漏的东西?

关于我的应用程序的信息:,我正在编写一个带有直流电机/双磁编码器的Atmel ATmega328P,每转600脉冲(在变速箱之后)。我想调用GoToTarget(#),让马达在更新PID参数的同时到达位置。此外,它必须是双向的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-22 06:25:29

你的速度计算计时器和PID循环计时器应该是相同的东西-而不是分开。

在RPM中,不要浪费时间和分辨率将脉冲计数转换为速度;如果定时器是准确的周期性的--并且它需要一个稳定的PID --那么脉冲计数与速度成正比,PID不关心可以根据系数的值调整的单元。如果你想要你的设定点速度在现实世界的单位,转换成等效的脉冲每PID周期,而不是反过来。

你的循环应该是这样的;

代码语言:javascript
复制
for(;;)
{
    WaitTimer() ;
    pulses = pulse_count - previous_pulse_count ;
    previous_pulse_count = pulse_count ;
    control = pid( pulses ) ;
    motor( control ) ;
}

然后,您只需要一个中断来计数脉冲--它不需要执行任何计算,只需要增加一个计数器--也许还需要对计时器进行中断,这取决于WaitTimer()的实现以及这是否是多线程的。

还请注意,如果共享变量pulse_count不是原子变量,则需要在读取它时禁用中断(最好用函数包装),并且需要声明为volatile

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17237173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档