analogRead 在“for 循环”中不给出与外部相同的值

analogRead in "for loop" not giving same values as outside of it

提问人:amidar 提问时间:11/13/2023 最后编辑:Philippe Signoretamidar 更新时间:11/13/2023 访问量:33

问:

enter image description here

Arduino(https://www.amazon.de/gp/product/B01D0OI90U/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1)

在此代码中,我向电机驱动器发送脉冲(第 8-11 行)。这些脉冲之间的时间由第 11 行确定,变量为 。为了使电机移动到某个位置,我将脉冲循环多次,然后(在第 13-17 行中)我反转方向,使其返回原点。电机驱动的长度也是如此,而它的速度也是如此。VLLV

然而,(很快)是我从电位计(第 6 行)读取的值 - 我应该将其移动到循环中,以便我得到速度的瞬时变化。而不必每次都等待它完成循环,然后再更改。但是当我这样做时,它不再达到相同的速度。而不是脉冲之间有 2.6us(us:微秒)。感觉更像是 200us - 而如果它在循环之外,它可以达到更高的速度 - 但我不知道为什么!VL

提前感谢您的所有答案/时间投入:

我尝试将代码块(第 6 行中的代码)移动到循环中,它极大地减慢了最大速度。

然后,我将代码块移动到 ,在那里它根本不起作用,然后在无效设置之前 - 它不再适应速度,只是在 222us(美国:微秒)左右运行。void setup

由于它显然能够达到速度,我认为它以某种方式与我不熟悉的代码/语言的某些方面有关 - 因为我是一个菜鸟,这基本上就是全部。

循环 Arduino Arduino-C++ 步进器

评论

0赞 Philippe Signoret 11/13/2023
欢迎来到 StackOverflow!请不要发布代码或任何文本的图像/屏幕截图。相反,将文本复制或键入到您的问题中。有关更多详细信息,请参阅如何提出好问题?

答:

1赞 ChipChop Gizmo 11/13/2023 #1

您每次都有效地阻止了模拟读取,因为您之后运行了整个循环,其中也包含一堆延迟。

您的代码读取如下内容

  • 决定走多远 (800 * 4) = 3600

  • 检查速度 = V

  • 3600 次执行以下操作(

    • 发送脉冲
    • 等待 2.6us
    • 发送停止脉冲
    • 等待 V 时间
    • 等待 50 个US

    )结束3600次重复

这意味着在每次移动中,您至少会有 52.6 微秒的延迟(至少取决于值)。V

与其每次都做循环(内部),不如简单地保持电机运转,并在需要时改变方向:loop()

int L = 800 * 4; // put in the loop() is you will be changing this dynamically
int direction = 1; // 1 = forward , -1 = backward
int distance = 0;

void loop() {

    int V = map(analogRead(PotV),0,1023,V_max, V_min);
    
    distance = distance + direction; //increment or reduce the traveled distance 

    //decide on the change of direction 
    if(distance >= L){ //if we have traveled over the max distance L, reverse the direction
        direction = -1
        delayMicroseconds(50); //only delay once the motor is changing direction
        digitalWrite(dir,LOW); 
    }else if(distance <= 0){ //if we are back to start reverse direction to forward
        direction = 1
        delayMicroseconds(50); //only delay once the motor is changing direction
        digitalWrite(dir,HIGH); 
        
    }

    // pulse the motor 
    digitalWrite(pulse,HIGH);
    delayMicroseconds(2.6);
    digitalWrite(pulse,LOW);
    delayMicroseconds(V);
    

}

这将使电机在所需的距离内保持前后运行,如果您只想运行一次(例如在按下按钮时),那么您可以包含另一个变量,当 true 时将启用代码,当电机回到 0 位置时将自行重置为 false