当前位置: 首页 > news >正文

Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制(PID)

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。

前言:上篇写了电机速度测定,这篇主要是讲测定出的速度用于反馈,使得实际速度快速响应到需要的速度。

1.控制系统介绍

分2大类:开环控制系统和闭环控制系统。

         一般来说,开环控制构比较简单,成本较低。开环控制系统的缺点是控制精度不高,抑制干扰能力差,而且对系统参数变化比较敏感。

        闭环控制系统是指: 把控制系统输出量的一部分或全部,通过一定方法和装置反送回系统的输入端,然后将反馈信息与原输入信息进行比较,再将比较的结果施加于系统进行控制,避免系统偏离预定目标。闭环控制系统利用的是负反馈。

2.电机的闭环控制

        闭环控制电机是通过在电机中加入传感器等反馈机制,实现精准控制的电机。在闭环控制电机中,电机控制器会根据反馈信号动态调整控制器的输出,从而使电机输出的运动轨迹精确达到预期目标。

        通常情况下,闭环控制电机会通过传感器等设备来获取电机的位置、速度等参数信息,并将这些信息传回电机控制器进行处理。控制器根据反馈信息对电机进行控制,从而精确调节电机的转速、转角等参数,实现精准控制。

3.电机闭环控制的优点

相比于开环控制电机,闭环控制电机具有以下优点:

        ● 精准控制:闭环控制电机可以在不同负载、温度等环境下精确控制转速、转角等参数,从而实现精准的定位、速度调节等功能。

        ● 响应速度快:由于具备反馈机制,闭环控制电机能够快速检测电机的运动状态,从而能够更快速地调整电机控制器的输出,实现快速响应。

        ● 稳定性高:闭环控制电机能够根据反馈信息调整输出,提高电机的稳定性,确保输出质量。

4.搭建电路

5.测试代码

注:以下代码pid值只测试用了一下,没有做调参。

#include<MsTimer2.h>#define moto_in1 7
#define moto_in2 8
#define moto_pwm 9#define moto_num1 2
#define moto_num2 3
int interrupt_time = 40;//计数
float num1=0;
float num2=0;
bool num_over_flag=0;
void speed_c1();
void speed_c2();
void int_time();//pid
float sumerror;
float lasterror;
float nowerror;
void pid(float real_value);float set_value=150;
float output_value = 0;
float speed_real=0;
double kp = 10, //0.7ki = 0.01,  //0.13kd = 0.1;  //0.01void setup(){ // put your setup code here, to run once:Serial.begin(9600);pinMode(moto_in1,OUTPUT);pinMode(moto_in2,OUTPUT);pinMode(moto_pwm,OUTPUT);pinMode(moto_num1,INPUT);pinMode(moto_num2,INPUT);noInterrupts();attachInterrupt( 0,speed_c1,CHANGE );attachInterrupt( 1,speed_c2,CHANGE);MsTimer2::set(interrupt_time,int_time);   MsTimer2::start(); interrupts();//开所有中断,准备进入程序运行模式}void loop(){ // put your main code here, to run repeatedly:digitalWrite(moto_in1,HIGH);digitalWrite(moto_in2,LOW);}void speed_c1()
{num1++;
}
void speed_c2()
{num2++;
}
void int_time()
{speed_real = (num1+num2)/(1200*0.04)*60;pid(speed_real);if(output_value>255)output_value=255;else if(output_value<-255)output_value=-255;analogWrite(moto_pwm,output_value);Serial.print(speed_real); Serial.print("       ");Serial.print(set_value); Serial.println("        ");//Serial.print(output_value); Serial.println("   ");num1=0;num2=0;
}void pid(float real_value) 
{// put your main code here, to run repeatedly:float output_err;nowerror = set_value - real_value;sumerror += nowerror; output_err = kp*nowerror + ki*sumerror + kd*(lasterror - nowerror);lasterror = nowerror;output_value= real_value+output_err;
}

6.测试视频

PID仿真调试

仿真工程链接:Arduino UNO R3 proteus 电机PID参数整定工程文件(含驱动代码)

上一篇:Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?

下一篇:Arduino UNO R3自学笔记22 之 Arduino基础篇学习总结


http://www.mrgr.cn/news/44376.html

相关文章:

  • C# 泛型集合实战:List<T>与Dictionary<TKey, TValue>的使用与优势
  • 给Linux操作系统命令取个别名
  • 【含文档】基于Springboot+Android的房屋租赁App(含源码+数据库+lw)
  • 数据采集工具sqoop介绍
  • 高级java每日一道面试题-2024年10月6日-数据库篇-MVCC是什么? 它的底层原理是什么?
  • 设计模式的学习
  • Trie树之最大异或对问题
  • C语言 | Leetcode C语言题解之第461题汉明距离
  • VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布
  • 【Canvas与色彩】十二等分多彩隔断圆环
  • 单链表的分解
  • 【QT】QT入门
  • 前沿论文创新点集合
  • 输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式
  • 通用版本升级规范
  • 微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化
  • 二叉树的进阶
  • 五、存储引擎
  • 详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)
  • SpringBoot:让开发更加简单