使用 RTOS 实现(直流电机)PI 电流控制器的正确方法

Proper way to implement (DC motor) PI current controller with RTOS

通过我的爱好项目,我开始将经典的中断驱动软件重写为带有 RTOS 的新软件。我正在使用带有 FreeRTOS 的 STM32,但这并不重要,因为我的问题通常与如何使用 RTOS 实现快速 PI 的问题有关。

  1. 思路: 将电流(扭矩)控制器置于中断(例如:用于PWM的定时器的中断),然后将位置控制器置于线程或sw定时器中。

  2. 想法 将当前控制器置于线程 等待基于定时器中断的信号,该信号将在该线程中产生。

当前的控制器应该很快,所以我不能放入 sw 定时器,但是我读到的关于 RTOS 的文档说我应该在使用 RTOS 和 PI 控制器时将最少的代码放入中断处理函数中,但我不是思考。这就是为什么1.思路好像有问题。

但是,如果我将快速电流控制器放入一个信号比 systick 快得多的线程中,它是否能够处理它?这是个糟糕的主意吗?

所以确切的问题是:当所需频率远高于系统频率时,我应该如何使用 RTOS 实现快速 PI 控制器?

感谢您的帮助!

But if I put the fast current controller into a thread which a signaled much faster than the systick, will it be able to handle it at all? Is it a terrible idea?

你根本不明白RTOS是什么。任务可以随心所欲地切换,它与 timebasr RTOS 时钟无关。您可能拥有 10Hz 的基本 RTOS 时钟并每秒切换任务数百万次(假设 uC 足够快)。

如何逻辑地实现。

  1. 在定时器中断中收集传感器数据,将它们发送到 PID 主任务的队列中。离开中断例程
  2. 当队列收到您的数据时,PID 任务是 运行 并进行所有必要的计算。然后它将数据(使用另一个队列)发送到执行任务。然后等待来自传感器的数据(它被阻塞并且不消耗任何处理器资源)。
  3. 执行任务在从其队列中获取数据并修改当前(例如)时开始 运行ning。然后再次等待新数据。

任务切换与RTOS基本时钟无关。它不像“普通”操作系统。您决定何时将控制权传递给 RTOS(然后 RTOS 将根据任务被阻止的优先级和对象来决定执行哪个任务)。

您可以使用直接任务通知、信号量或其他可用的 IPC 原语来代替队列。