基于STM32的PID参数自整定(在FreeRtos上实现)

作者分享了自己实现PID参数自整定的代码过程,基于Arduino库和CSDN资源,虽代码稚嫩但出于分享目的开源,强调适用于一般逻辑,非教学性质,鼓励讨论和合作。
摘要由CSDN通过智能技术生成

          想要实现PID参数自整定有一段时间了。不过由于课程繁忙一直没有去把代码写好,就更别说调试了,最近陆陆续续的比赛也打完了,所以把原先的代码翻了出来,缝缝补补写好了。 

        由于继电器自整定法在国内真的资源比较少,所以也是花了不少功夫修缮了这篇代码,但整体的代码逻辑和风格在我看来由于我水平不够还是较为稚嫩的,在这里发这篇博客主要是为了纪念了下,这也是第一次在csdn发博客,所以这篇博客不是教学型的,而是记录顺便分享。代码整体是参照了Arduino上PID自整定库的代码,在结合了CSDN上“嵌入之梦”大佬写的博客,终于弄懂之后才开始进行编写,所以为了帮助更多人在是实现pid自整定,我才发布了这篇博客,由于还有很多事情要做,所以不准备在这篇博客进行手把手教学。我会将代码的工程文件完全免费开源出来,里面包含了我对代码的详细解读。如果对代码有疑惑的可以私信我,我应该回复还是很及时的。

注:我不敢保证我的代码能够完美适配任何系统,但基本逻辑应该没有问题,回到我上面的发表目的,这不是教学型博客,所以在不同控制系统下自整定的最终效果是不能保证良好的。可以私信我探讨一些问题,随时欢迎。 如果有对锁相环 单相PWM整流 解耦控制感兴趣的也可以私信我,我做过相关实验并且成功。可以考虑后续出详细的手把手教学---(针对软件方面的保姆级编写)

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
以下是一个基于FreeRTOSSTM32F103C8T6的PID控制代码的示例。这个例子假设你已经熟悉了PID控制器的原理,并且你知道如何使用STM32的编程环境。 首先,我们需要定义一些常量和变量,用于控制PID控制器的参数。这些变量包括目标值、当前值、误差、PID系数和输出值。 ```C #define SETPOINT 1000 // 目标值 #define KP 1.2 // 比例系数 #define KI 0.5 // 积分系数 #define KD 0.1 // 微分系数 #define DELTA_T 1 // 控制周期(ms) float error = 0; float last_error = 0; float integral = 0; float derivative = 0; float output = 0; ``` 接下来,我们需要在FreeRTOS的任务中实现PID控制器。在这个例子中,我们将使用一个任务来读取传感器的值,并计算PID控制器的输出。我们将使用另一个任务来将输出发送到执行器。这样,我们就可以将PID控制器的计算与执行分离开来,从而使代码更加模块化。 ```C void pid_task(void *pvParameters) { for (;;) { // 读取传感器值 float current_value = read_sensor(); // 计算误差 error = SETPOINT - current_value; // 计算积分项 integral += error * DELTA_T; // 计算微分项 derivative = (error - last_error) / DELTA_T; last_error = error; // 计算输出值 output = KP * error + KI * integral + KD * derivative; // 将输出值限制在可接受范围内 if (output > 100) { output = 100; } else if (output < 0) { output = 0; } // 等待下一个控制周期 vTaskDelay(DELTA_T); } } void actuator_task(void *pvParameters) { for (;;) { // 将输出值发送到执行器 send_to_actuator(output); // 等待下一个控制周期 vTaskDelay(DELTA_T); } } ``` 最后,我们需要在main函数中创建这些任务,并启动FreeRTOS调度程序。 ```C int main(void) { // 初始化传感器和执行器 init_sensor(); init_actuator(); // 创建PID控制器任务 xTaskCreate(pid_task, "PID", 128, NULL, 1, NULL); xTaskCreate(actuator_task, "Actuator", 128, NULL, 1, NULL); // 启动FreeRTOS调度程序 vTaskStartScheduler(); // 如果调度程序启动失败,进入死循环 for (;;); return 0; } ``` 这就是一个基于FreeRTOSSTM32F103C8T6的PID控制代码的示例。请注意,这只是一个简单的例子,实际的PID控制器可能需要更复杂的控制算法和更多的参数调整。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值