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

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

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

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如何测定电机速度?

下一篇:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439944.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《深度学习》【项目】OpenCV 发票识别 透视变换、轮廓检测解析及案例解析

目录 一、透视变换 1、什么是透视变换 2、操作步骤 1&#xff09;选择透视变换的源图像和目标图像 2&#xff09;确定透视变换所需的关键点 3&#xff09;计算透视变换的变换矩阵 4&#xff09;对源图像进行透视变换 5&#xff09;对变换后的图像进行插值处理 二、轮廓检测…

idea插件市场安装没反应

https://plugins.jetbrains.com/idea重启后还是不行那就

Docker:安装 MongoDB 的详细指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;可以在 Docker 容器中轻松安装和运行。本文将介绍如何在 Docker 中安装 MongoDB&#xff0c;并展示如何在 Java 应用中使用 MongoDB…

kafka发送消费核心参数与设计原理详解

核心参数详解&#xff1a; 发送端参数&#xff1a; 发送方式&#xff1a;默认值一般都是1: 重试参数 &#xff1a; 批量参数&#xff1a; 消费端参数&#xff1a; 自动提交参数&#xff1a; 如果是false&#xff0c;就是说消费完后不提交位移。也就是说比如之前消费的1-5.…

Qt教程(002):Qt项目创建于框架介绍

二、创建Qt项目 2.1 创建项目 【1、New Project】 【2、选择Qt Widgets Application】 【3、设置项目名称和保存路径】 注意&#xff0c;项目名称和路径不要带中文。 【4、选择QWidget】 带菜单栏的窗口QMainWindow空白窗口QWidget对话框窗口QDialog 【5、编译】 2.2 项目框…

前端编程艺术(4)---JavaScript进阶(vue前置知识)

目录 1.变量和常量 2.模版字符串 3.对象 4.解构赋值 1.数组的解构 2.对象的解构 5.箭头函数 6.数组和对象的方法 7.扩展运算符 8.Web存储 9.Promise 10.AsyncAwait 11.模块化 1.变量和常量 JavaScript 中的变量和常量是用于存储数据的标识符。变量可以被重新赋值&am…

基于阻塞队列及环形队列的生产消费模型

目录 条件变量函数 等待条件满足 阻塞队列 升级版 信号量 POSIX信号量 环形队列 条件变量函数 等待条件满足 int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); 参数&#xff1a; cond&#xff1a;要在这个条件变量上等待 mutex…

windows下,在vscode中使用cuda进行c++编程

安装cuda CUDA Toolkit Downloads | NVIDIA Developer 这里网上教程多的是&#xff0c;在这个网址下载安装即可 我这台电脑因为重装过&#xff0c;所以省去了安装步骤&#xff0c;但是要重新配置环境变量。我重新找到了重装之前的CUDA位置(关注这个bin文件夹所在的目录) 在…

微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size

先看报错&#xff1a; java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)at javax.crypto.Cipher.implInit(Cipher.java:805)at javax.crypto.Cipher.chooseProvider(Cipher.java:864)at javax.crypto.Cipher.in…

九、3 串口发送+printf函数移植+打印汉字

1、接线图 TX与RX交叉连接&#xff0c;TXD接STM32的PA10&#xff0c;RXD接STM32的PA9 VCC与3.3V用跳线帽连接 2、函数介绍 3、代码部分 &#xff08;1&#xff09;发送字节的函数&#xff08;Byte&#xff09; 可直接发送十六进制数 如0x41&#xff0c;也可直接发送字符 如A …

【重学 MySQL】五十六、位类型

【重学 MySQL】五十六、位类型 定义赋值与使用注意事项应用场景 在MySQL数据库中&#xff0c;位类型&#xff08;BIT类型&#xff09;是一种用于存储位字段值的数据类型。 定义 BIT(n)表示n个位字段值&#xff0c;其中n是一个范围从1到64的整数。这意味着你可以存储从1位到64…

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 &#x1f4af;ChatGPT的数据使用特点ChatGPT数据安全…

YOLOv11 vs YOLOv8:谁才是真正的AI检测之王?

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Js逆向分析+Python爬虫结合

JS逆向分析Python爬虫结合 特别声明&#x1f4e2;&#xff1a;本教程只用于教学&#xff0c;大家在使用爬虫过程中需要遵守相关法律法规&#xff0c;否则后果自负&#xff01;&#xff01;&#xff01; 完整代码地址Github&#xff1a;https://github.com/ziyifast/ziyifast-co…

28 Vue3之搭建公司级项目规范

可以看到保存的时候ref这行被提到了最前面的一行 要求内置库放在组件的前面称为auto fix&#xff0c;数组new arry改成了字面量&#xff0c;这就是我们配置的规范 js规范使用的是airbnb规范模块使用的是antfu 组合prettier&eslint airbnb规范&#xff1a; https://github…

重磅来袭!CMSIS-DAP 脱机烧录器 EasyFlasher 发布~

重磅来袭&#xff01;CMSIS-DAP 脱机烧录器 EasyFlasher 发布~ 目录 重磅来袭&#xff01;CMSIS-DAP 脱机烧录器 EasyFlasher 发布~相关文章1、前言1、产品特点2、功能说明3、支持芯片4、关于烧录5、写在最后 某宝店铺&#xff1a;觉皇工作室 购买链接&#xff1a;https://item…

缓存数据减轻服务器压力

问题:不是所有的数据都需要请求后端的 不是所有的数据都需要请求后端的,有些数据是重复的、可以复用的解决方案:缓存 实现思路:每一个分类为一个key,一个可以下面可以有很多菜品 前端是按照分类查询的,所以我们需要通过分类来缓存缓存代码 /*** 根据分类id查询菜品** @pa…

Linux中的进程间通信之共享内存

共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…

[Linux] Linux 初识进程地址空间 (进程地址空间第一弹)

标题&#xff1a;[Linux] Linux初识进程地址空间 个人主页水墨不写bug &#xff08;图片来源于AI&#xff09; 目录 一、什么是进程地址空间 二、为什么父子进程相同地址的变量的值不同 三、初识虚拟地址、页表 一、什么是进程地址空间 其实&#xff0c;在很久之前&#xf…