智能车学习(十三)——角度控制

一、手册代码以及图示

二、流程说明

1、角度计算函数说明

//============================================================================
//函数名称:void AngleCalculate(void)
//函数返回:无
//参数说明:无
//功能概要:车身角度计算。
//============================================================================
void AngleCalculate(void)
{
  //读取加速度计
  MMA8451_Read();

  //读取陀螺仪
  LS3G4200D_Read();

  //取陀螺仪的X轴数据
  VOLTAGE_GYRO = Gyro_X;

  //取加速度读计的Y轴数据
  VOLTAGE_GRAVITY = Gray_Y;

  //陀螺仪零偏跟随
  Gyro_Offset_Calculate();

  if(VOLTAGE_GRAVITY > 1050)                              //限制加速度计读数-1050 ~1050
  {
    VOLTAGE_GRAVITY = 1050;
  }

  if(VOLTAGE_GRAVITY <=  -1050)
  {
    VOLTAGE_GRAVITY = - 1050;
  }

  //加速度计读取的Y轴数值转换为角度
  g_fGravityAngle = (VOLTAGE_GRAVITY - GRAVITY_OFFSET) * GRAVITY_ANGLE_RATIO;

  //陀螺仪提取角速度
  g_fGyroscopeAngleSpeed = (VOLTAGE_GYRO - GYROSCOPE_OFFSET) * GYROSCOPE_ANGLE_RATIO;

  //车身角度计算
  g_fCarAngle = g_fGyroscopeAngleIntegral;
  fDeltaValue = (g_fGravityAngle - g_fCarAngle) / GRAVITY_ADJUST_TIME_CONSTANT;
  g_fGyroscopeAngleIntegral += (g_fGyroscopeAngleSpeed + fDeltaValue) / GYROSCOPE_ANGLE_SIGMA_FREQUENCY;
}

首先是通过加速度计测得重力加速度,然后通过归一化(因为g和角度成正比),计算出角度。然后由于车子运动过程中,车子加速度会产生一定的影响,导致不是正比关系,所以使用陀螺仪进行修正,陀螺仪测得是角速度,积分之后就是角度,然后再和加速度计测得角度进行融合,然后反馈回去,使得系统平衡。

2、陀螺仪零点跟随

/============================================================================
//函数名称:void Gyro_Offset_Calculate()
//函数返回:无
//参数说明:无
//功能概要://陀螺仪三个轴的零点跟随  Cut_Gyro_X为经过处理后的值, Gyro_X为实际的读值,Gyro_X_Offset 为零点
//============================================================================
void Gyro_Offset_Calculate()
{
  float Cut_Gyro_X;

  //减去偏移值得到的实时值
  Cut_Gyro_X = Gyro_X - GYROSCOPE_OFFSET;

  //根据实时值,修改零偏置
  if(Cut_Gyro_X>=2)
  {
    GYROSCOPE_OFFSET += 0.001;
  }
  else if(Cut_Gyro_X<=-2)
  {
    GYROSCOPE_OFFSET -= 0.001;
  }
  else
  {
    GYROSCOPE_OFFSET = GYROSCOPE_OFFSET * 0.99 + 0.01 * Gyro_X;
  }
  //开机2秒进行跟随
  if (Clocks_Gyro <= 400)
  {
    GYROSCOPE_OFFSET = GYROSCOPE_OFFSET * 0.5 + 0.5 * Gyro_X;
  }

}

根据实时值,修改零偏值。

3、其中有一些参数设置:

/***************直立控制*****************/

float g_fGravityAngle = 0;                                              //加速度计转换来的角度
float g_fGyroscopeAngleSpeed  = 0;                                      //陀螺仪转换来的角速度
float g_fCarAngle = 0;                                                  //车身角度

float VOLTAGE_GYRO = 0;                                                 //定义陀螺仪(选X,Y,Z)
float VOLTAGE_GRAVITY = 0;                                              //定义加速度计(选X,Y,Z)

float GRAVITY_OFFSET = 27;                                               //加速度计零偏
float GRAVITY_ANGLE_RATIO = (90 /(1050.0 - 27)) ;                       //加速度计归一化因子

float GYROSCOPE_OFFSET = 0  ;                                            //陀螺仪零偏移
float GYROSCOPE_ANGLE_RATIO = 1.780;                                       //归一化因子

float GRAVITY_ADJUST_TIME_CONSTANT = 2;                                  //陀螺仪加速度计加和的比例因子
float GYROSCOPE_ANGLE_SIGMA_FREQUENCY = 200;                             //积分的频率

float Clocks_Gyro = 0;                                                   //开机2s内进行陀螺仪零点比对
时间: 2024-12-29 12:19:24

智能车学习(十三)——角度控制的相关文章

智能车学习(二十三)&mdash;&mdash;浅谈心得体会

      因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的.       在厦大信科通信系,参加这个比赛,大家都觉得性价比太低,毕竟这个系,学霸太多,能力太强,课程多,分数还必须要高,如果参加这种要花大半年的时间来准备,但是却只能抱着不确定性拿奖的比赛,对于那些拼保研名额的同学简直有点太过于奢侈.所以基本上选择了创客类比赛,电子设计竞赛,ACM,数学建模,这些短周期的比赛.其实我也纠结了很久,其实,本来我也就是简简

智能车学习(二十三)&mdash;&mdash;K60单片机注册中断函数

一.头文件: #ifndef __ISR_H #define __ISR_H 1 #include "include.h" /* 重新定义中断向量表 * 先取消默认的中断向量元素宏定义 #undef VECTOR_xxx * 在重新定义到自己编写的中断函数 #define VECTOR_xxx xxx_IRQHandler * 例如: * #undef VECTOR_003 * #define VECTOR_003 HardFault_Handler 重新定义硬件上访中断服务函数 *

智能车学习(六)&mdash;&mdash;OLED屏幕使用

一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned char Font_8x16[]; extern const unsigned char HanZi[][32]; extern const unsigned char Map[]; /*--------------------*OLED写数据*--------------------*/ void OL

智能车学习(十一)&mdash;&mdash;陀螺仪学习

一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /***********函数声明***********/ extern void Gyro_Init(void); extern void Read_GY(void); /*****************************/ /***********全局变量声明***********/ extern float G

智能车学习(2)---舵机学习

原理和控制 一.舵机原理简述 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压.它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出.最后,电压差的正负输出到电机驱动芯片决定电机的正反转.当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动. 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms.以180度角度伺

智能车学习(十七)&mdash;&mdash;舵机学习

一.舵机的结构      舵机简单的说就是集成了直流电机.电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元.能够利用简单的输入信号比较精确的转动给定角度的电机系统.舵机安装了一个电位器(或其它角度传感器)检测输出轴转动角度,控制板根据电位器的信息能比较精确的控制和保持输出轴的角度.这样的直流电机控制方式叫闭环控制,所以舵机更准确的说是伺服马达,英文servo.   二.舵机的规格和选型      舵机的规格主要有几个方面:转速.转矩.电压.尺寸.重量.材料等.我们在做舵机的选型时要对

智能车学习(十八)&mdash;&mdash;电机学习

一.C车电机选择 1.摘要:      因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就会变的很弱很弱.所以请准备好钞票. 2.选择方法: (1) 使用恒流源,配合单片机程序,测试出,对应电压的电流和转速,一般采样10个点即可,正反转都要   (2)使用Matlab进行相关性拟合(以电压和电流为输入),转速为输出,得到  cnt = a * V + b * I   中a和b的参数(正反

智能车学习(二十二)&mdash;&mdash;浅谈速度控制

一.经典PID控制       使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期..   二.PID加棒棒控制       针对C车,因为电机太弱了.所以可以使用棒棒进行加减速可以有效的提升车子性能.一般推荐控制周期10ms   三.模糊控制

智能车学习(二十)&mdash;&mdash;浅谈C车硬连接与软连接

一.为何要追求软连接?       车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大摩擦力,在这种调节下,可以保持高速而不会翻车,且不会减速,增加过弯速度.然后还有在过陂的时候,可以有减震的作用(说到底就是C车电机太差了 = = ).       但存在一种情况..电机过分差的时候..速度无法过高,否则的话直接翻车,比赛结束.       经过个人的分析比对,参考上届的国特学长,以