|
2012-08-03:现在我用一个JoyStick控制L298N,用MPU6050单独采集角度,电机不转动,一切正常;只要电机一转动,立即卡机! 而后,我把接MPU6050的时钟信号线SCL拔除,一切正常。确定是L298N和MPU6050犯冲。但是我看到一个视频,用的也是L298N、香蕉电机和传感器,很正常啊,是不是因为I2C接口的抗干扰能力太差?
请问有什么好些的电机驱动么?谢!
2012-08-02:今天和达人沟通,故障缩小如下:
用UNO带L298N(带光耦),电机不转动,一切正常;我强制电机堵转,也一切正常;当电机一转动或加速时,就卡机。
我用的是香蕉电机!!!此电机当PWM达到100以上时才起动,我严重怀疑是当电机启动瞬间,骤降或骤升的电流引起的反向脉冲使得Arduino卡机,问题是已经加了光耦了啊。那请问各位怎样才能解决此问题?谢!!!
现在总结应该是电机转动产生的干扰,电机输出OUT1 & OUT2间已经接了电容了,请问怎样可以消除因电机转动产生的干扰?
2012-08-01:今天新增测试如下:
Arduino板单独供电,L298N单独供电,运行5秒后,当机!串口显示卡住不动,电机转速保持在最后一刻的速度;
最后总结:加上以下代码时,才出现的问题,请问各位,以下代码该怎么写?根据角度的正负来控制电机的正反转!- 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);
- }
复制代码 已上传视频:
- #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板子的问题?请各位支招!!!谢!
库文件: |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|