arduino - Arduino 可以同时处理中断和 Timer1 功能吗?
问题描述
我想用arduino构建和编程一个角磨机的速度控制器。因此我买了一个电机速度控制器模块(它上面有一个电位器,我将用我的 arduino 的模拟输出代替)和一个红外避障模块(它也可以用于 rpm 测量)。
arduino 应该使用传感器测量轴的转速(因此我在代码中使用了中断函数)。
然后将该 rpm 值传递给我计算的控制器(控制器使用 Timer1 功能运行,以保持循环时间恒定),并使用模拟输出将计算值传递给电机速度控制器。角磨机的实际速度也会显示在 I2C 显示器上。
现在我的问题是 arduino 是否能够同时运行中断和 Timer1 功能,或者它们会相互干扰吗?
(Controller 的值已经使用 Winfact 的 Boris 进行了测试)
我的代码:
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h>
//Regler: Siehe Haager S.147
//RPM Counter: Siehe https://forum.arduino.cc/index.php?topic=634139.0
const int X_input=1;
const int U_output=3;
int X=0;
int U=0, W=0;
const float kr=0.1;
const float Tn=0.12;
const float Tv=0.3;
const float T1=1.0e6;
const float T=0.01;
double w_k, u_k, e_k, e_k1, e_k2, u_k1, u_k2, x_k, d1, d2, c0, c1, c2;
float value = 0;
float rev = 0;
int rpm;
int oldtime = 0;
int time;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
//RPM Counter:
attachInterrupt(digitalPinToInterrupt (2), RPM_Count, RISING); //interrupt pin
//Regler:
Timer1.initialize(T*1.0e6);
Timer1.attachInterrupt(regler);
d1=(T+2*T1)/(T+T1);
d2=-T1/(T+T1);
c0=kr*(1+T/Tn+Tv/(T+T1));
c1=kr*((T*T+T*Tn-2*Tv*Tn)/(T*Tn+T1*Tn)-T/Tn-2);
c2=kr*(Tv+T1)/(T+T1);
e_k1=0.0, e_k2=0.0, u_k1=0.0, u_k2=0.0;
//Display:
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("------Drehzahl------");
}
void regler(){
detachInterrupt(digitalPinToInterrupt(2));
time = millis() - oldtime;
rpm = (rev / time) * 60000;
oldtime = millis();
rev = 0;
attachInterrupt(digitalPinToInterrupt (2), RPM_Count, RISING);
w_k=rpm;
X=analogRead(X_input);
x_k=X*1000.0/1024-500;
e_k2=e_k1;
e_k1=e_k;
e_k=w_k-x_k;
u_k2=u_k1;
u_k1=u_k;
u_k=d1*u_k1 + d2*u_k2 + c0*e_k + c1*e_k1 + c2*e_k2;
U=256.0/320.0*u_k + 128;
if(U>255) U=255;
if(U<0) U=0;
analogWrite(U_output, U);
}
void RPM_Count() {
rev++;
}
void loop() {
lcd.setCursor(0,1);
lcd.print(rpm);
lcd.print(" U/min");
}
解决方案
Timer1:
Timer1 是一个 16 位定时器。
在 Arduino 世界中,Servo 库在 Arduino Uno
引脚 9 和 10 上使用 timer1:由 timer1
Timer2 控制:
Timer2 是一个类似于 timer0 的 8 位定时器。
在 Arduino 工作中,tone() 函数使用 timer2。
引脚 11 和 3:由 timer2 控制
详细信息:https
://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072
我也使用基于传感器值的 RPM 控制,但只使用了计时器的功能1 我部分重写了/扩展。到目前为止没有问题。
Timer1 使用中断来处理定时器溢出,因此请检查源代码是否可能对您的应用程序造成问题,
推荐阅读
- javascript - 在 Typescript 中实现 Joi
- c++ - 如何获取向量中每个维度的大小
>> 构造? - google-bigquery - UI 中的 BigQuery 作业历史记录已消失
- python - 具有复杂 z matplotlib 的 3D 曲面图
- javascript - 使用正则表达式的输出来提供函数
- python - 如何绘制预测值与真实值?
- google-colaboratory - ModuleNotFoundError:当我在 Colab 中安装 ELMo 时,没有名为“elmoformanylangs”的模块
- node.js - 如何更新 MERN 堆栈中的数据
- json - 如何使用 manifest / service-worker 制作 PWA?
- c# - 无法转换 LINQ 表达式中的 OData $top 查询,将使用 EF Core 和 .NET Core 2.2 在本地进行评估