大都的Arduino操控器都是根据Atmel公司的AVR系列单片机的,AVR单片机的片内资源十分的丰厚,有ADC、守时器、外部中止、SPI、IIC、PWM等功用,且Arduino操控器的PWM选用的是守时器相位批改PWM(频率约为490Hz)和快速PWM(频率约为980Hz,Uno的5、6和Leonardo的3、11),这也就导致了悉数的守时器都被被占用了,然后不能很便利的运用守时器设置一个中止来完成一个周期的使命,而一般需求经过读取体系已运转时刻来判别守时时刻是否现已抵达。例如,经过增量式编码器来丈量电机的转速,惯例的单片机的程序架构是经过守时器来完成精确的时刻守时,并运用外部中止来完成对脉冲数意图计数,然后核算出一守时刻内脉冲的数目,然后得到转速数值并输出。
直流电机是Arduino机器人制造中的首要动力来历,可是由于电机的参数一致性有所不同,即使是相同类型的电机在相同电压下的转速都不完全相同,并且在带负载或负载不同的情况下,愈加会导致电机转速发生变化,这就会导致制造的Arduino轮式机器人不能完成直线行走,由于这是一个开环操控,没有任何反应信号回来。假如给直流电机加上编码器作为反应器材,也就能够丈量得到电机的当时转速,假如将其与设定值核算差值,并经过PID算法核算得到新的操控信号,然后能够动态的丈量和操控电机的转速,构成一个闭环操控体系。
下面咱们运用带有编码器的直流电机、Arduino操控器、直流电机驱动板和LabVIEW上位机软件以试验探究的方法来规划一个直流电机转速份额操控试验。
1.TimerOne守时器库
1.1下载及运用办法
TimerOne守时器库运用AVR单片机内部的守时器1完成守时中止的功用,其下载地址为:https://code.google.com/p/arduino-timerone/,只需求更改几个参数即可运用守时器中止来完成周期性履行的使命。需求留意的是,假如运用了TimerOne守时器库,也就不能在相应的引脚输出PWM电压,Uno上的守时器与PWM引脚的联系如表1所示。
表1守时器与PWM引脚的联系
守时器 |
OC0A |
OC0B |
OC1A |
OC1B |
OC2A |
OC2B |
PWM引脚 |
6 |
5 |
9 |
10 |
11 |
3 |
TimerOne守时器库函数库中自带的ISRBlink程序如程序代码1所示,能够完成13号管脚上LED的5Hz频率的闪耀。
程序代码1:ISRBlink示例程序
#include
void setup() {
}
void loop(){
//主函数,用于履行非周期性使命
}
void timerIsr(){
}
1.2评价守时时刻的精确性
只是凭靠眼睛不能判别守时时刻是否精确,下面咱们规划一个试验来评价守时时刻的精确性。咱们需求将上面示例代码中的Timer1.initialize(100000)更改为Timer1.initialize(1000),digitalWrite( 13, digitalRead( 13 ) ^ 1 )更改为digitalWrite(2, digitalRead( 2) ^ 1 ),经过回转I/O的电平完成数字端口2输出500Hz的近似方波。
一起,咱们运用NI USB-6009便携式数据收集卡和LabVIEW 2012软件完成一个简易的模拟量收集器,将Arduino操控器上的数字端口2和GND别离与NI USB-6009便携式数据收集卡上的AI0/AI0+和AI4/AI0-相衔接,NI USB-6009便携式数据收集卡接口示意图如图1所示,Arduino Uno操控器与USB-6009便携式数据收集卡的衔接图如图2所示。然后运用10kps的采样率,5秒的采样时刻的参数收集Arduino操控器上的数字端口2输出的方波信号,取其前20ms的波形如图3所示,经过波形频率剖析东西丈量得到其频率为499.901Hz。
别的,咱们又将守时时刻设置为100微秒、50微秒和25微秒,并运用NI USB-6009便携式数据收集卡和LabVIEW 2012软件以45kps的采样率和2秒的采样时刻别离收集了数字端口2输出的波形数据并进行频率剖析,得到其频率别离为4999.01Hz,9998.03Hz,19996Hz。从以上数据比照剖析可知,守时器的守时时刻十分精确,频率丈量误差首要来自于I/O回转操作延时导致的。
最终,咱们还测试了OCROBOT MEGA 2560操控器、Arduino Uno操控器山寨版输出的500Hz的方波信号频率,别离为500.435Hz和499.764Hz。
图1 NI USB-6009接口示意图
图3守时器中止发生的500Hz方波信号
2.转速丈量
2.1丈量转速办法
丈量转速办法有3种,别离为测频法(M法)、测周法(T法)及混合法(M/T法)。
测频法是在一守时刻内,经过丈量旋转引起的单位时刻内的脉冲数,完成对旋转轴转速丈量的一种办法,适用于高、中转速的丈量。该法本质上归于守时测角法,为进步丈量的精确度,有时选用多符号或开齿的办法,其不确定度首要取决于时刻丈量和计数量化。
测周法是在转速脉冲的距离内,用时钟脉冲来丈量转速的一种办法,适合于低转速丈量。该法实际上便是定角丈量法,即用时标填充的办法来丈量相当于某一旋转视点的时刻距离。在高、中转速时,可选用多周期均匀来进步丈量精确度,其不确定度首要取决于时刻丈量、计数量化及触发的不确定度。
混合法是在测频法的基础上,汲取测周法的长处聚集而成的一种转速丈量办法。它是在转速传感器输出脉冲发动守时脉冲的一起,计取传感器输出脉冲个数和时钟脉冲个数,而当抵达丈量时刻时,先中止对传感器输出脉冲的计数,鄙人一个守时脉冲发动之前再中止时钟脉冲的计数。因而,该种办法可在较宽的范围内运用。
此处,咱们挑选测频法来丈量转速,其作业原理为:当被测信号在特守时刻段T内的周期个数为N时,则被测信号的频率f=N/T。
2.2转速丈量程序规划
运用TimerOne守时器库来完成守时,经过外部中止对电机编码器输出的脉冲进行计数,计数值除以守时时刻即为一守时刻内的转速。完成1秒内转速丈量的程序如程序代码2所示。
程序代码2:转速丈量程序
#include
long counter_val[2] = {0,0};
byte CurCnt = 0;
int j=0;
void setup() {
}
void loop()
{
}
//外部中止处理函数
void counter()
{
}
//守时器中止处理函数
void timerIsr()
{
}
2.3验证频率丈量的精确性
前面提到了Arduino的模拟输出(PWM)的频率约为490Hz,且转速丈量选用的是测频法,此刻用来正好来验证一下程序规划的正确性。在上面的转速丈量程序中的void setup()里边delay(2000)之前添加如下代码,以发生方波。串口输出的频率丈量成果如图4所示。