我的程序中是否需要多线程?

时间:2017-04-10 16:18:39

标签: arduino

我的项目是关于制造旋涂机。基本上是一种使用离心机来覆盖微厚度基板的机器。无论如何,对于这个项目,它需要我键入电机用于旋转基板的时间和速度。然后读取电机的转速,并重新启动新的会话。我现在的问题是,如何在使用传感器读取转速的同时运行电机。让我来看看这台机器的过程,

步骤1:设置电机速度(使用伺服值103-180)和电机定时秒(电机需要旋转多长时间)。

在此步骤中,有3个阶段的速度和时间设置。我需要使用键盘键入这个阶段的速度和时间。

步骤2:旋转电机和转速测量读数

对于此步骤,速度和时间的值将变为整数。这允许电动机根据给定的时间旋转。同时,当电机旋转时,转速测量也开始,读取电机的转速并显示在LCD屏幕上。

步骤3:电机停止并重复步骤1

这是我的问题,如何在转速读取时让电机旋转?我可以用单线程还是多线程(希望在多线程中获胜,仍然是arduino的初学者)

1 个答案:

答案 0 :(得分:3)

Arduino没有线程。线程通常是操作系统的一个功能。使用Arduino,您不具备经典意义上的操作系统。  您的代码(包括它使用的库)直接在硬件上运行。

设置系统,以便一次又一次地调用loop函数。一次做多件事的常用方法(如控制电机速度和读取传感器以及更新显示器)是在循环过程中完成每项任务的一小部分。在伪代码中,它可能如下所示:

void loop() {
  int rpm = read_rpm_from_sensor();
  adjust_motor_timing(rpm, target_rpm);
  display_speed(rpm);
}

您似乎也有阶段:初始化阶段,用户输入值,运行阶段和完成阶段。您可以使用全局"状态"来处理这些问题。跟踪你进入哪个阶段的变量。你在setup()中初始化状态,然后在循环()中读取它以决定你需要做什么工作。

enum { enter_values, run, finish } state;

void setup() {
  // your other initialization goes here
  state = enter_values;  // set up the starting state
}

void loop() {
  switch (state) {
    case enter_values:
      get_values_from_keyboard();
      state = run;
      break;
    case run:
      int rpm = read_rpm_from_sensor();
      adjust_motor_timing(rpm, target_rpm);
      display_speed(rpm);
      if (enough time has elapsed) {
        state = finish;
      }
      break;
    case finish:
      stop_motor();
      // go back to the initial state for the next run
      state = enter_values;
      break;
  }
}

这应该让你了解一般结构。

对于需要非常精确定时的某些类型的传感器和外围设备,您可能会使用直接处理硬件的中断。但这是一个非常相似的想法:你将你需要做的工作分解成非常小的块,你可以一遍又一遍地做。唯一改变的是中断可能会(简单地)中断你正在做的事情。但CPU一次只做一件事。