智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1877|回复: 7
打印 上一主题 下一主题

求助加速度计跟陀螺仪的调试。

[复制链接]

6

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
924
威望
447
贡献
287
兑换币
236
注册时间
2015-3-3
在线时间
95 小时
毕业学校
苏州大学
跳转到指定楼层
1#
发表于 2015-3-22 10:12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4贡献
前几天调试加速度计跟陀螺仪模块,选用的清华直立方案,对陀螺仪的输出换算成角度积分,然后在Visualscope上面调试,但是输出的波形是这样的。表示很不解?我看到其他队的都是很连续的波形,算法没有问题的话,那一定在程序上了。希望哪位大神指点指点,感激不尽。(图里面Ch1是角速度,Ch2是加速度计的角度,Ch3是处理后的最终的角度)


程序是这样的:
#include "main.h"
#define acce_zero 1310
#define gyro_zero 1500
//#define   LED1       PORTK_PK7
//#define   LED1_DIR   DDRK_DDRK7
unsigned char i=0,j=0,Timerflag1ms=0;
unsigned int ad_acceler=0,ad_gyro=0,av_ad_acceler=0,av_ad_gyro=0;
float gyro_angle_intergral=0,accer_angle=0,gyro_speed=0;
static float acceler_rate=0.125,gyro_rate=0.235;
void PLL_32M(void)                      //BUS CLOCK = 32MHZ, PLL CLOCK = 64MHZ
{
    CLKSEL &= 0x7f;                     //set OSCCLK as sysclk
    PLLCTL &= 0x8F;                     //Disable PLL circuit   
    CRGINT &= 0xDF;
   
    SYNR = 0x43;                             
    REFDV = 0x81;                       //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
   
    PLLCTL = PLLCTL | 0x70;             //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08));              //PLLCLK is Locked already
    CLKSEL |= 0x80;                     //set PLLCLK as sysclk
}
/****************************初始化设备**************************************/
void DeviceInit()
{
  
PLL_32M() ;
UART_Init();
}
void PIT_inits(void)                    //定时间断初始化函数 1ms定时间断设置
{
  PITCFLMT_PITE=0;                      //关PIT
  PITCE_PCE0=1;                         //定时器通道0使能
  PITMTLD0=32-1;                        //8位定时器初值设定,32分频,在32MHzBusClock下,为1MHz。即1us
  PITLD0=1000-1;                        //16位定时器初值设定。1000*1us=1ms
  PITINTE_PINTE0=1;                     //定时器间断通道0间断使能
  PITCFLMT_PITE=1;                      //使能PIT
}
/*************************************************************/
/*                         延时函数                          */
/*************************************************************/
void AD_GYRO_ACC_Init()
{
ATD0DIEN=0x00;//禁止数字输入
ATD0CTL0=0x02;//从0通道开始采集到2通道返回
ATD0CTL1=0x40;//无外部触发,12位,不放电
ATD0CTL2=0x40;//快速清零,禁止外部触发,禁止比较中断
ATD0CTL3=0x98;//右对齐,转换序列3,非FIFO模式
ATD0CTL4=0x01;//采样时间4个AD周期
ATD0CTL5=0x30;//禁止特殊通道,AD连续转换,通道0开始
}
void AD_measure()
{
   for(i=0;i<16;i++)
   {
      while(!ATD0STAT2_CCF2);
      ad_acceler+=ATD0DR2;
      while(!ATD0STAT2_CCF1);
      ad_gyro+=ATD0DR1;
   }
   av_ad_acceler= ad_acceler>>4;
   av_ad_gyro= ad_gyro>>4;
}   
/*void AD_measure()
{
   while(!ATD0STAT2_CCF2);
   ad_acceler+=ATD0DR2;
   while(!ATD0STAT2_CCF1);
   ad_gyro+=ATD0DR1;
} */
void caculate()
{
   float deltaangle;
   gyro_speed=gyro_rate*(av_ad_acceler-gyro_zero);
   accer_angle=acceler_rate*(av_ad_gyro-acce_zero);
   deltaangle=(accer_angle-gyro_angle_intergral)*200;
   gyro_angle_intergral+=(gyro_angle_intergral+ gyro_speed)/200;
         
}
void main(void)
{
  
  DisableInterrupts;                    
  DeviceInit();
  PIT_inits();
  AD_GYRO_ACC_Init();
  EnableInterrupts;
  uart_putstr("Usart Is Working!");
//  LED1_DIR = 1;                         //PK2口设置为输出
// LED1 = 0;                             //初始化输出低电平
  for(;;)
  {  
    caculate();
    OutData[0] = gyro_speed*1000;
    OutData[1] = accer_angle*1000;
    OutData[2] = gyro_angle_intergral;
    OutData[3] = 0;
      
    OutPut_Data();               
  }
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)  //1ms
{
  //中断执行程序
   PITTF_PTF0 = 1;   //清中断标志位   
   AD_measure();               
}

附件: 您需要 登录 才可以下载或查看,没有帐号?注册
回复

使用道具 举报

24

主题

190

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3373
威望
2087
贡献
678
兑换币
453
注册时间
2014-9-8
在线时间
304 小时
2#
发表于 2015-3-22 14:22:58 | 只看该作者
你把x轴缩小一下
回复

使用道具 举报

6

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
924
威望
447
贡献
287
兑换币
236
注册时间
2015-3-3
在线时间
95 小时
毕业学校
苏州大学
3#
 楼主| 发表于 2015-3-26 23:35:58 | 只看该作者
▓追梦﹏forever 发表于 2015-3-22 14:22
你把x轴缩小一下

3q3q,解决了呢,滤波的算法出问题了还有一点程序上的语法问题,总算弄出来了。
回复

使用道具 举报

1

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
QQ
威望
154
贡献
83
兑换币
102
注册时间
2015-1-22
在线时间
35 小时
毕业学校
安徽师范大学
4#
发表于 2015-3-30 11:14:00 | 只看该作者
我用的128芯片,一直测不到输出波形,请问是用串口调试的嘛?
回复

使用道具 举报

6

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
924
威望
447
贡献
287
兑换币
236
注册时间
2015-3-3
在线时间
95 小时
毕业学校
苏州大学
5#
 楼主| 发表于 2015-3-30 11:28:58 | 只看该作者
wy941016 发表于 2015-3-30 11:14
我用的128芯片,一直测不到输出波形,请问是用串口调试的嘛?

嗯,sci通信,发送到这个上位机。看到很多这种帖子,Visualscope的。
回复

使用道具 举报

1

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
QQ
威望
154
贡献
83
兑换币
102
注册时间
2015-1-22
在线时间
35 小时
毕业学校
安徽师范大学
6#
发表于 2015-3-30 14:49:21 | 只看该作者
哦哦,我多看看吧,关键不太理解。。 谢谢啦
回复

使用道具 举报

2

主题

11

帖子

0

精华

注册会员

Rank: 2

积分
174
威望
99
贡献
39
兑换币
48
注册时间
2015-2-4
在线时间
18 小时
毕业学校
南京工业大学
7#
发表于 2015-4-6 13:07:03 | 只看该作者
请问一下gyro_rate这个参数代表什么。。表示自己手上也有程序,但看不懂。。
回复

使用道具 举报

6

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
924
威望
447
贡献
287
兑换币
236
注册时间
2015-3-3
在线时间
95 小时
毕业学校
苏州大学
8#
 楼主| 发表于 2015-4-8 21:33:25 | 只看该作者
彼时年少 发表于 2015-4-6 13:07
请问一下gyro_rate这个参数代表什么。。表示自己手上也有程序,但看不懂。。

就是从ad采集过来的值,还要把它转换会实际的模拟值,这个可以根据加速度计的精度跟ad的位数来算,或者通过实验的方式来测(把它认为是线性的情况)。
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-21 20:23 , Processed in 0.153141 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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