2017-04-10 39 views
2

我的项目是关于制造旋涂机。基本上是使用离心机来覆盖具有微厚度的基板的机器。无论如何,对于这个项目来说,它需要我输入电机用来旋转基板的时间和速度。然后读取电机的转速,并重新开始新的会话。我现在的问题是,如何在使用传感器读取转速时运行电机。步骤1:设置电机的速度(使用伺服值103-180)和电机的时间(秒)(电机需要旋转多长时间)。我的程序中是否需要多线程?

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

步骤2:将马达和rpm测量读数

对于该步骤的纺丝,速度和时间的值是变成整数。这允许电机根据给定的时间旋转。同时,随着电机旋转,转速测量也会开始,读取电机的转速并显示在LCD屏幕上。

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

这里是我的问题,我该如何使电机旋转而转读取?我可以做单线程或多线程(希望不会在多线程中,仍然是arduino的初学者)

+0

Arduino上没有线程。 –

回答

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一次只能做一件事。

+0

我了解你的FSM结构。在一个大的图景中,我可以看到。所以对于所有的功能,我必须编写具体的任务来使这个功能起作用? – rjadkins

+0

是的,这些仅仅是占位符函数,可以让您了解您必须提供的具体内容以及它们适用于结构的位置。 当您实施它们时,请确保您不添加任何延迟呼叫。每一步都必须在相当短的时间内完成,以便“同时”发生的其他任务可以做他们需要做的事情。 –

相关问题