|
已上传视频:
- #include "Wire.h"
- #include "i2cdev.h"
- #include "MPU6050.h"
- MPU6050 accelgyro;
- int16_t ax, ay, az;
- int16_t gx, gy, gz;
- #define Gry_offset 296//陀螺仪X轴的静态飘移。
- #define Gyr_Gain -0.00763//由陀螺仪X轴读数转换为角速度值,=1/131,向前方向与X轴为反方向,故乘以-1
- #define ACC_Gain 0.000061//由读数转换为加速度值,=1/16384
- #define pi 3.1415926
- #define K 0.715//一阶互补滤波权重取值,不知由来,可更改。
- unsigned long preTime = 0;
- float angleG = 0;
- void setup()
- {
- Wire.begin();
- Serial.begin(38400);
- accelgyro.initialize();//MPU6050初始化。
- for (int i=3; i<=9; i++)//将3,4,5,6,7,8,9定义为输出口
- {
- pinMode(i, OUTPUT);
- }
- delay(500);
- }
- void loop()
- {
-
- unsigned long now = millis();//当前时间(ms)
- float dt = (now - preTime) / 1000.0;//微分时间(s)
- preTime = now;//上一次采样时间(ms)
-
- accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//读取六轴数值
-
- float Y_Accelerometer = ay * ACC_Gain;//转换为向前的加速度(g),为负值
- float Z_Accelerometer = az * ACC_Gain;//转换为向下的加速度(g)
- float angleA= atan(Y_Accelerometer/ Z_Accelerometer)* (-180)/ pi;//加速度仪,反正切获得弧度值,乘以180度/pi
- //获得角度值,乘以-1得正值
-
- float gx_revised = gx + Gry_offset;//陀螺仪x轴静态时修正后的角速度读数,向前为负值
- float omega= Gyr_Gain* gx_revised;//陀螺仪,转换为向前的角速度(o/s),Gyr_Gain取负,故负负得正
- float angle_dt = omega * dt;//角度的单次积分值
- //angleG+= angle_dt;//陀螺仪,积分获得角度值
-
- angleG+= (Gyr_Gain * (gx + Gry_offset)) * dt;
- float A= K/ (K+ dt);//陀螺仪的权值
- angleG= A* (angleG+ omega* dt)+ (1-A)* angleA;//一阶互补滤波后的输出角度(o)
- delay(10);
-
-
- //********************************************************************/
- /****以下为PWM输出代码****/
- //********************************************************************
-
- if (angleG > 0)
- {
- digitalWrite(3, LOW);
- digitalWrite(4, HIGH);
- digitalWrite(8,LOW);
- digitalWrite(7, HIGH);
- }
- if (angleG < 0)
- {
- digitalWrite(3, HIGH);
- digitalWrite(4, LOW);
- digitalWrite(8,HIGH);
- digitalWrite(7, LOW);
- }
- int output = min(200,abs(40*angleG));//此函数输出较小值,将PWM最大值限定在200,下面起步补偿55
- analogWrite(5, output+55);//左右轮都补偿起步PWM值30,左右轮电机不一致,5针ENA右轮多补偿25
- analogWrite(9, output+30);//output的值在100左右时,香蕉电机才起动,汗!。
- delay(10);
- Serial.print("output = ");
- Serial.println(output);
- }
复制代码 现在问题是:
1、角度输出还比较可以,但有滞后情况;
2、小车运行1分钟左右,无论是静态还是动态都死机,最后一刻电机的速度是多少,就保持在多少速度;
就是平衡着突然卡蹦一下,就倒了!
3、是不是L298N驱动的问题?
各位达人帮帮出出主意,不胜感激!!!
我怀疑是不是硬件L298N板子的问题?请各位支招!!!谢!
库文件: |
|