如何设计控制回路
How to design a control loop
本文关键字:控制回路 更新时间:2023-10-16
这更多的是一个软件设计问题,因此它应该独立于语言——但为了完整性,让我们假设C++和POSIX系统。
我努力实现的目标:
- 通过I2C和1W协议读取低电平传感器(所有读取都需要时间,但不一定需要大量资源CPU/内存)/所有设备的读取频率不同
- 反馈读取的信息(反馈频率比最慢的传感器快)
- 当收到新命令时(通过蓝牙(bluez))做出响应
我该如何最好地做到这一点
我现在所拥有的是,我从具有相同超类的传感器中创建对象,其中有一个ptreath
测量循环,其中包含写入最近值参数和一个不断读取最后值的主循环。
这在我看来相当笨拙,因为我必须查看变量等。有更好/更容易的方法来实现这一点吗?反馈算法相当直接,不需要太多资源。
我通常所做的是在传感器轮询线程中实例化测量消息,并在一个生产者-消费者队列中将它们全部排队到一个运行实现控制算法的状态机的线程。控制消息也可以被推到队列中,从而以相同的方式得到正确处理。
这将所有复杂的控制决策保留在一个线程、一个状态引擎中,在那里可以轻松地逐个消息调试操作。
主线程可以在PC队列上等待并操作SM。阻塞PC队列消除了毫无意义、浪费和可避免的var轮询。
相关文章:
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 查找 GCD:并非所有控制路径都返回值
- 通过 API 控制 DJI 相机
- 禁止在控制台上记录谷神星
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- Cython通过浮点数的最快方式,用于高频控制回路
- 用户控制从 c++ 到 java 脚本的 Webassembly 访问调用
- C ++,如何从控制台中输入的字符串中删除字母?
- 如何从单独的线程控制 SFML 窗口?
- 如何设计控制回路
- windows ce:我可以在内核模式下为PID控制回路执行所有的计算