提问人:amidar 提问时间:11/13/2023 最后编辑:Philippe Signoretamidar 更新时间:11/13/2023 访问量:33
analogRead 在“for 循环”中不给出与外部相同的值
analogRead in "for loop" not giving same values as outside of it
问:
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 行中)我反转方向,使其返回原点。电机驱动的长度也是如此,而它的速度也是如此。V
L
L
V
然而,(很快)是我从电位计(第 6 行)读取的值 - 我应该将其移动到循环中,以便我得到速度的瞬时变化。而不必每次都等待它完成循环,然后再更改。但是当我这样做时,它不再达到相同的速度。而不是脉冲之间有 2.6us(us:微秒)。感觉更像是 200us - 而如果它在循环之外,它可以达到更高的速度 - 但我不知道为什么!V
L
提前感谢您的所有答案/时间投入:
我尝试将代码块(第 6 行中的代码)移动到循环中,它极大地减慢了最大速度。
然后,我将代码块移动到 ,在那里它根本不起作用,然后在无效设置之前 - 它不再适应速度,只是在 222us(美国:微秒)左右运行。void setup
由于它显然能够达到速度,我认为它以某种方式与我不熟悉的代码/语言的某些方面有关 - 因为我是一个菜鸟,这基本上就是全部。
答:
您每次都有效地阻止了模拟读取,因为您之后运行了整个循环,其中也包含一堆延迟。
您的代码读取如下内容
决定走多远 (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
评论