我有一个奇怪的问题,我有Arduino UNO / MEGA,我需要获取陀螺仪传感器的数据,我想在串行监视器中查看数据。似乎是一个简单的任务,我编写了一个简单的C程序,它可以通过串行监视器从Arduino收集数据,我可以看到这些数据。一切都工作了几分钟,然后停了下来。
该代码用于计算到达所需位置后机器使用U型转弯时使用编码器(使用陀螺仪数据实现直线运动的PID算法实现)在一条直线上的行进距离。
在掉头后停下来一秒钟,然后再次开始直线运动。我面临的问题是,机器转弯时,陀螺仪的读数会随机停止。因此,机器会一直围绕该点旋转而不会停止。
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
float timeStep = 0.01, yaw=0;
const int motor11=6;//LEFT MOTOR FW
const int motor12=7;//LEFT MOTOR BK
const int motor1pwm=3;
const int motor21=8;//RIGHT MOTOR FW
const int motor22=9;//RIGHT MOTOR BK
const int motor2pwm=5;
int flag1 = 0;
int thres1=120;//PWM Values
int thres2=120;
void setup()
{
Serial.begin(115200);
// Initialize MPU6050
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
mpu.calibrateGyro();
mpu.setThreshold(1);
pinMode(motor11, OUTPUT);
pinMode(motor12, OUTPUT);
pinMode(motor1pwm, OUTPUT);
pinMode(motor21, OUTPUT);
pinMode(motor22, OUTPUT);
pinMode(motor2pwm, OUTPUT);
}
void loop()
{
Vector norm=mpu.readNormalizeGyro();
yaw=yaw+norm.ZAxis*timeStep;
if(flag1 == 0){
straight();
}
if(flag1 == 2){
taketurn();
}
}
void straight()
{
digitalWrite(motor11, HIGH);
digitalWrite(motor12, LOW);
analogWrite(motor1pwm, thres1);
digitalWrite(motor21, HIGH);
digitalWrite(motor22, LOW);
analogWrite(motor2pwm, thres2);
delay(8000);
flag1 = 2;
}
void taketurn()
{
float setPoint = yaw - 500;
digitalWrite(motor11, HIGH);
digitalWrite(motor12, LOW);
analogWrite(motor1pwm, 120);
digitalWrite(motor21, LOW);
digitalWrite(motor22, LOW);
analogWrite(motor2pwm, 120);
while(true)
{
Vector norm = mpu.readNormalizeGyro();
yaw = yaw + norm.ZAxis * timeStep;
Serial.print("Turning Yaw= ");
Serial.println(yaw);
if(setPoint >= yaw) {
digitalWrite(motor11, LOW);
digitalWrite(motor12, LOW);
analogWrite(motor1pwm, thres2);
digitalWrite(motor21, LOW);
digitalWrite(motor22, LOW);
analogWrite(motor2pwm, thres1);
delay(2000);
break;
}
}
flag1 = 0;
}
串行监视器仅停止显示读数。这并非每次都发生,并且是非常随机的。我想获取正确且连续的数据。是逻辑问题还是董事会问题?
答案 0 :(得分:0)
通常情况下,随机崩溃会表明可能未处理的中断或内存被覆盖,但是查看您的代码并将其作为Arduino程序,则不太可能。我也看不到任何除法运算,因此您未除以零。我看到的两种可能的情况是:a)您有一个“ while(true)”而没有退出,因此肯定会惹上您的麻烦; b)也许您的延迟函数被意外地以非常大的值调用,并且MCU实际上只是延迟了很长时间。