通过增量式编码器来测量电机的转速,常规的单片机的程序架构是通过定时器来实现精确的时间定时,并利用外部中断来实现对脉冲数目的计数,然后计算出一定时间内脉冲的数目,从而得到转速数值并输出。
直流电机是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 直流电机转速控制系统相关推荐

  1. 【在线仿真】Arduino UNO PWM 控制直流电机转速

    [在线仿真]Arduino UNO PWM 控制直流电机转速 在线仿真 接线说明 通过三极管来驱动直流电机电池正极接电机的一端,电机的另一端接到NPN三极管的集电极,三极管的基极接Arduino 11 ...

  2. matlab直流电机初始转速,直流电机转速控制的matlab实验.doc

    直流电机转速控制的matlab实验 2012/2013学年第一学期 <精密测控与系统>期末大型作业 成绩评分表: 问题1问题2问题3问题4问题5问题6总分10分15分15分20分20分20 ...

  3. 计算机控制技术直流电机调速控制实验报告,pid直流电机转速控制实验报告(31页)-原创力文档...

    课程设计 课程名称计算机控制技术 题目名称 PID 直流电机转速控制 学生学院 专业班级 学号 学生姓名 指导教师 2013 年 06 月17日 1 目录 一. 系统总体设计 ,,,,,,,,,,,, ...

  4. matlab里晶闸管,基于MATLAB的晶闸管-直流电动机控制系统的仿真研究

    机 电 设 备 l D I A N S H E B E 基于 MATLAB的晶闸管 一直流 电动机控制系统的仿真研究 杨世芳 邹富雄 刘垣文 (西南交通大学 电气工程学院 成都 61 1 756) [ ...

  5. 自控实验——直流电机转速设计实验报告

    自控原理-直流电机转速控制设计实验报告 实验报告 一.实验目的 了解直流电机转速测量与控制的基本原理 掌握LabVIEW图形化编程方法,编写电机转速控制系统程序 熟悉PID参数对系统性能的影响,通过调 ...

  6. 设计分享|单片机直流电机转速控制(汇编)

    目录 具体实现功能: 设计介绍 51单片简介 设计思路 设计内容 仿真图(protues8.7) 程序(KeilC51) 具体实现功能: 利用滑动变阻器实现对直流电机转速的控制,仿真实现,汇编语言编写 ...

  7. Arduino直流电动机控制

    在本Arduino教程中,我们将学习如何使用Arduino控制直流电动机. 我们将介绍一些用于控制直流电动机的基本技术,并举两个例子,通过它们我们将学习如何使用L298N驱动器和Arduino板来控制 ...

  8. dac0832控制电机驱动流程图_应用DAC0832单片机控制小直流电机转速的设计.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp学术论文&nbsp>&nbsp社科论文 应用DAC0832单片机控制小直流电机转速的设计.d ...

  9. 基于MATLAB Simulink的三相AC DC整流后的直流电机转速开环控制仿真模型

    AC_DC_Machine:基于MATLAB Simulink的三相AC DC整流后的直流电机转速开环控制仿真模型. 仿真条件:MATLAB Simulink R2015b ID:2120650365 ...

最新文章

  1. C++ STL的reserve函数
  2. SQL语句获取数据库名、所有表名、所有字段名及字段类型
  3. 为什么vs数据库中文显示问号_第005期 | 写论文为什么不应写别人没写过的题目?...
  4. 混合开发之phonegap开发相关知识解析
  5. python调用报表制作工具_使用Python轻松制作漂亮的表格
  6. 设计一个按优先数调度算法实现处理器调度的程序_计算机中的程序都是怎么运行的,来深入了解一下吧...
  7. 关于tomcat和jetty的乱码问题
  8. JAVA的四则运算规则_java四则运算规则
  9. php用字母数字生成用户名,请问生成字母加数字
  10. DataGridView获得所有选中行的某列的值
  11. python数据可视化仪表盘,Python 数据可视化?
  12. 管家婆显示服务器没有加密狗,管家婆软件阿拉丁狗找不到加密狗
  13. 析取范式、合取范式、主析取和主合取
  14. HTML5期末大作业:仿悦世界游戏网站设计——仿悦世界游戏官网(6页) HTML+CSS+JavaScript web网页设计实例作业
  15. 流媒体 3——彩色数字图像基础
  16. 安徽省淮南市谷歌卫星地图下载
  17. n子棋,你能下赢电脑吗,来玩玩吧
  18. 方腔驱动流的simple算法(附matlab与c++程序)
  19. excel如何批量让图片水平居中垂直居中对齐?
  20. leetcode 883. 三维形体投影面积(python)

热门文章

  1. oracle 时区转换_Oracle中的时区转换
  2. mysql 移除权限_MySQL用户授权及删除权限
  3. 测试适合什么颜色衣服的软件,测试 | 超准的颜色测试!一语道破你最适合穿什么颜色的衣服!...
  4. 快手x清华即日启动大数据挑战赛,60万大奖悬赏你的最佳解决方案
  5. python urlparse模块的用法
  6. 去掉XP/2003打开文件安全警告
  7. 如何做一个好的产品!
  8. 【趣学算法】-Day2-贪心算法
  9. TTylinux 最小的系统(带GCC)
  10. 【Kaldi例子】构图与解码