Arduino 直流电机转速控制系统
通过增量式编码器来测量电机的转速,常规的单片机的程序架构是通过定时器来实现精确的时间定时,并利用外部中断来实现对脉冲数目的计数,然后计算出一定时间内脉冲的数目,从而得到转速数值并输出。
直流电机是Arduino机器人制作中的主要动力来源,但是由于电机的参数一致性有所差别,即使是相同型号的电机在相同电压下的转速都不完全相同,而且在带负载或负载不同的情况下,更加会导致电机转速发生变化,这就会导致制作的Arduino轮式机器人不能实现直线行走,因为这是一个开环控制,没有任何反馈信号返回。如果给直流电机加上编码器作为反馈器件,也就可以测量得到电机的当前转速,如果将其与设定值计算差值,并通过PID算法计算得到新的控制信号,从而可以动态的测量和控制电机的转速,形成一个闭环控制系统。
2.1测量转速方法 测量转速方法有3种,分别为测频法(M法)、 测周法(T法)及混合法(M/T法)。 测频法是在一定时间内,通过测量旋转引起的单位时间内的脉冲数,实现对旋转轴转速测量的一种方法,适用于高、中转速的测量。该法本质上属于定时测角法,为提高测量的准确度,有时采用多标记或开齿的方法,其不确定度主要取决于时间测量和计数量化。
测周法是在转速脉冲的间隔内,用时钟脉冲来测量转速的一种方法,适合于低转速测量。该法实际上就是定角测量法,即用时标填充的方法来测量相当于某一旋转角度的时间间隔。在高、中转速时,可采用多周期平均来提高测量准确度,其不确定度主要取决于时间测量、计数量化及触发的不确定度。 混合法是在测频法的基础上,吸取测周法的优点汇集而成的一种转速测量方法。它是在转速传感器输出脉冲启动定时脉冲的同时,计取传感器输出脉冲个数和时钟脉冲个数,而当到达测量时间时,先停止对传感器输出脉冲的计数,在下一个定时脉冲启动之前再停止时钟脉冲的计数。因此,该种方法可在较宽的范围内使用。
此处,我们选择测频法来测量转速,其工作原理为:当被测信号在特定时间段T内的周期个数为N时,则被测信号的频率f=N/T。 ###2.2转速测量程序设计 利用TimerOne定时器库来实现定时,通过外部中断对电机编码器输出的脉冲进行计数,计数值除以定时时间即为一定时间内的转速。实现1秒内转速测量的程序如程序代码2所示。
#include <TimerOne.h>
long counter_val[2] = {0,0}; //定义数组,用于存放外部中断计数值
byte CurCnt = 0; //定义当前计数器标志,用于判断当前正在计数的数组
int j=0; //定义定时器中断标志,用于判断是否发生中断
void setup() {delay(2000);Serial.begin(115200);//初始化波特率为115200attachInterrupt(0, counter, RISING);//设置中断方式为上升沿Timer1.initialize(1000000); // 设置定时器中断时间,单位微秒,此处为1秒Timer1.attachInterrupt( timerIsr ); // 打开定时器中断interrupts(); //打开外部中断
}void loop()
{long lTemp = 0; //定义临时存储数据变量if(j==1) //判断是否发生定时器中断,即定时时间是否到达{j=0; //清除定时器中断标志位if((CurCnt&0x01) == 0) //当前使用的是偶数计数器,则上次频率值存放在第二个元素中{lTemp = counter_val[1]; //读取数组第二个元素中的数值counter_val[1]=0; //读完清除原来的数值,以便下次使用}else //当前使用的是奇数计数器,则上次频率值存放在第一个元素中{lTemp = counter_val[0]; //读取数组第二个元素中的数值counter_val[0]=0; //读完清除原来的数值,以便下次使用}Serial.print("S"); //发送帧头大写SSerial.print( lTemp); //发送频率数据,并回车换行}
}//外部中断处理函数
void counter()
{//通过当前计数器来实现对外部中断计数值存储的切换counter_val[CurCnt& 0x01] += 1; //发生一次中断则加1
}//定时器中断处理函数
void timerIsr()
{j=1; //置位定时器中断标志位CurCnt++; //当前计数器的值加1,实现另一个计数值切换
}
验证频率测量的准确性 前面提到了Arduino的模拟输出(PWM)的频率约为490Hz,且转速测量采用的是测频法,此时用来正好来验证一下程序设计的正确性。在上面的转速测量程序中的void setup()里面delay(2000)之前增加如下代码,以产生方波。串口输出的频率测量结果如图4所示
pinMode(3,OUTPUT);
analogWrite(3,127);
转速比例控制的程序设计
#include <TimerOne.h>
#define Kp 3
#define set_point 100
long counter_val[2] = {0,0};
byte CurCnt = 0;
int j=0;
int output_value=0;
void setup()
{delay(2000);pinMode(12,OUTPUT);pinMode(3,OUTPUT);pinMode(9,OUTPUT); //启用电机A的三个管脚,全部设置为输出状态digitalWrite(9, LOW); //松开电机A的制动digitalWrite(12, HIGH); //设置方向为正向旋转Serial.begin(115200);//初始化波特率为115200attachInterrupt(0, counter, RISING);//设置编码器A相位上升沿中断attachInterrupt(1, counter, RISING);//设置编码器B相位上升沿中断Timer1.initialize(10000); // 设置定时器中断时间,单位微秒Timer1.attachInterrupt( timerIsr ); // 打开定时器中断interrupts(); //打开外部中断
}
void loop()
{long lTemp = 0; //定义临时存储数据变量if(j==1) //判断是否发生定时器中断,即定时时间是否到达{j=0; //清除定时器中断标志位if((CurCnt&0x01) == 0) //当前使用的是偶数计数器,则上次频率值存放在第二个元素中{lTemp = counter_val[1]; //读取数组第二个元素中的数值counter_val[1]=0; //读完清除原来的数值,以便下次使用}else //当前使用的是奇数计数器,则上次频率值存放在第一个元素中{lTemp = counter_val[0]; //读取数组第二个元素中的数值counter_val[0]=0; //读完清除原来的数值,以便下次使用}Serial.print("A"); //发送转速帧头大写ASerial.print( lTemp); //发送转速数据output_value =( set_point -lTemp)*Kp+ output_value; //比例计算得到控制量if(output_value >255) //限制PWM在0-255范围内output_value =255;
if(output_value <0) //限制PWM在0-255范围内output_value =0;analogWrite(3, output_value); //将计算得到的控制量输出Serial.print("B"); //发送PWM帧头大写BSerial.println(output_value); //发送PWM数据}
}
//外部中断处理函数
void counter()
{counter_val[CurCnt& 0x01] += 1; //每一个中断加一
}
//定时器中断处理函数
void timerIsr()
{j=1; //定时时间达到标志CurCnt++; //切换计数数组
}
Arduino 直流电机转速控制系统相关推荐
- 【在线仿真】Arduino UNO PWM 控制直流电机转速
[在线仿真]Arduino UNO PWM 控制直流电机转速 在线仿真 接线说明 通过三极管来驱动直流电机电池正极接电机的一端,电机的另一端接到NPN三极管的集电极,三极管的基极接Arduino 11 ...
- matlab直流电机初始转速,直流电机转速控制的matlab实验.doc
直流电机转速控制的matlab实验 2012/2013学年第一学期 <精密测控与系统>期末大型作业 成绩评分表: 问题1问题2问题3问题4问题5问题6总分10分15分15分20分20分20 ...
- 计算机控制技术直流电机调速控制实验报告,pid直流电机转速控制实验报告(31页)-原创力文档...
课程设计 课程名称计算机控制技术 题目名称 PID 直流电机转速控制 学生学院 专业班级 学号 学生姓名 指导教师 2013 年 06 月17日 1 目录 一. 系统总体设计 ,,,,,,,,,,,, ...
- matlab里晶闸管,基于MATLAB的晶闸管-直流电动机控制系统的仿真研究
机 电 设 备 l D I A N S H E B E 基于 MATLAB的晶闸管 一直流 电动机控制系统的仿真研究 杨世芳 邹富雄 刘垣文 (西南交通大学 电气工程学院 成都 61 1 756) [ ...
- 自控实验——直流电机转速设计实验报告
自控原理-直流电机转速控制设计实验报告 实验报告 一.实验目的 了解直流电机转速测量与控制的基本原理 掌握LabVIEW图形化编程方法,编写电机转速控制系统程序 熟悉PID参数对系统性能的影响,通过调 ...
- 设计分享|单片机直流电机转速控制(汇编)
目录 具体实现功能: 设计介绍 51单片简介 设计思路 设计内容 仿真图(protues8.7) 程序(KeilC51) 具体实现功能: 利用滑动变阻器实现对直流电机转速的控制,仿真实现,汇编语言编写 ...
- Arduino直流电动机控制
在本Arduino教程中,我们将学习如何使用Arduino控制直流电动机. 我们将介绍一些用于控制直流电动机的基本技术,并举两个例子,通过它们我们将学习如何使用L298N驱动器和Arduino板来控制 ...
- dac0832控制电机驱动流程图_应用DAC0832单片机控制小直流电机转速的设计.doc
您所在位置:网站首页 > 海量文档  > 学术论文 > 社科论文 应用DAC0832单片机控制小直流电机转速的设计.d ...
- 基于MATLAB Simulink的三相AC DC整流后的直流电机转速开环控制仿真模型
AC_DC_Machine:基于MATLAB Simulink的三相AC DC整流后的直流电机转速开环控制仿真模型. 仿真条件:MATLAB Simulink R2015b ID:2120650365 ...
最新文章
- C++ STL的reserve函数
- SQL语句获取数据库名、所有表名、所有字段名及字段类型
- 为什么vs数据库中文显示问号_第005期 | 写论文为什么不应写别人没写过的题目?...
- 混合开发之phonegap开发相关知识解析
- python调用报表制作工具_使用Python轻松制作漂亮的表格
- 设计一个按优先数调度算法实现处理器调度的程序_计算机中的程序都是怎么运行的,来深入了解一下吧...
- 关于tomcat和jetty的乱码问题
- JAVA的四则运算规则_java四则运算规则
- php用字母数字生成用户名,请问生成字母加数字
- DataGridView获得所有选中行的某列的值
- python数据可视化仪表盘,Python 数据可视化?
- 管家婆显示服务器没有加密狗,管家婆软件阿拉丁狗找不到加密狗
- 析取范式、合取范式、主析取和主合取
- HTML5期末大作业:仿悦世界游戏网站设计——仿悦世界游戏官网(6页) HTML+CSS+JavaScript web网页设计实例作业
- 流媒体 3——彩色数字图像基础
- 安徽省淮南市谷歌卫星地图下载
- n子棋,你能下赢电脑吗,来玩玩吧
- 方腔驱动流的simple算法(附matlab与c++程序)
- excel如何批量让图片水平居中垂直居中对齐?
- leetcode 883. 三维形体投影面积(python)