极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11120|回复: 1

mpu6050单轴转动控制步进电机转动相应角度

[复制链接]
发表于 2015-4-2 16:26:35 | 显示全部楼层 |阅读模式
mpu6050单轴转动控制步进电机转动相应角度,程序可以运行,但是在转动MPU6050的过程中,电机转动相应角度后电机出现抖动的情况,不知道是Mpu6050灵敏度高的原因还是程序写得有问题。但是修改了MPU6050的量程并没有改善电机抖动的情况,贴上程序,求教大神,可能是什么问题?



#include <REG52.H>       
#include <math.h>    //Keil library  
#include <stdio.h>   //Keil library       
#include <INTRINS.H>

typedef unsigned char  uchar;
typedef unsigned short ushort;
typedef unsigned int   uint;

//******功能模块头文件*******
#include "DELAY.H"                    //延时头文件
#include "MPU6050.H"                //MPU6050头文件

//******参数定义************
float Accel_ax;
float Accel_az;             //X轴加速度值暂存
int Angle;         //小车最终倾斜角度
uchar value;                 //角度正负极性标记
int Angle_pre1=0;
int Angle_now1=0;
int angle1=0;
signed long beats=0;
int Angle_Calcu(void);
void Calcu();
void StartMotor(signed long angle);
void Turnmotor();

void main()
{   InitMPU6050();
    delaynms(150);
        TMOD = 0x01;
           TH0 = 0xf9;                 //1.5ms
        TL0 = 0x45;
        ET0 = 1;
        TR0 =1;
   Angle_pre1=Angle_Calcu();
   StartMotor(Angle_pre1);
        while(1)
        {
          Calcu();
        }
}

//*********************************************************
// 倾角计算
//*********************************************************
int Angle_Calcu(void)         
{

        Accel_ax  = GetData(ACCEL_XOUT_H);          //读取X轴加速度
        Accel_az  = GetData(ACCEL_ZOUT_H);          //读取X轴加速度
        Angle = (int)(atan(Accel_ax/Accel_az)*180/3.14);
        Angle=90-Angle;
        if(Angle>170)
        {Angle=0;}
        else
        {Angle=Angle;}
        return         Angle;                                                                                                          
}
//*********************************************************
// 电机转动角度计算
//*********************************************************
void Calcu()
{
  if(beats==0)
  {         EA=0;
           Angle_now1=Angle_Calcu();
         angle1=Angle_now1-Angle_pre1;
        StartMotor(angle1);
        Angle_pre1=Angle_now1;
  }
}

void StartMotor(signed long angle)
{
        beats = (angle*298)/18;
        EA =1;
}

void InterruptTimer0() interrupt 1
{
    TH0 = 0xf9;                 //1.5ms
        TL0 = 0x45;
        Turnmotor();
}

void Turnmotor()
{    static signed char index = 0;
   unsigned char code BeatCode[4] ={0xf5,0xf6,0xfa,0xf9};
     if(beats!=0)
      {
          if(beats > 0)
                {
                        index++;
                     index = index & 0x03;
                           beats--;
                }
                else
                {
                        index--;
                     index = index & 0x03;
                        beats++;
                }
         P1=BeatCode[index];                         
         }
        else
        {
                P1=0x00;
        }
}
回复

使用道具 举报

发表于 2015-4-6 11:05:11 | 显示全部楼层
直接读出来的角度有波动,本身的波动就很大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 07:37 , Processed in 0.035759 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表