智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3090|回复: 9
打印 上一主题 下一主题

用128采集陀螺仪和加速度仪的零偏值,可是返回的始终是0,看很久也没看出是什么问题

[复制链接]

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
跳转到指定楼层
1#
发表于 2014-1-24 21:38:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <hidef.h>      
#include "derivative.h"  

unsigned int g_iAdGravityAngle, g_iAdGyroscopeAngleSpeed;   

void ATD_Init(void)
{
    ATD0DIEN = 0x00;                  //禁止数字输入功能
    ATD0CTL1 = 0x40;                  //分辨率选择12位
    ATD0CTL2 = 0x40;                  //AD快速清零,禁止外部触发,禁止中断
    ATD0CTL3 = 0x90;                  //右对齐,转换序列长度为2
    ATD0CTL4 = 0x03;                  //采样时间选择为4个AD时钟周期一次
                                      // PRS=后五位的值
                                      //f(AD转换时间频率)=f(总线频率)/(2*(PRS+1))
    ATD0CTL5 = 0x30;                  //禁止特殊通道转换,连续转换,多通道采样
}

void SCI0_Init(void){

    SCI0BD = 52;
    SCI0CR1 = 0x00;                                    
    SCI0CR2 = 0x0c;
}

void capture_ATD(void)
{
    unsigned int iAdGravityAngle = 0, iAdGyroscopeAngleSpeed = 0;
    unsigned int i;

    for (i = 0; i < 20; i++)
    {
        while (!ATD0STAT2L_CCF0);
        iAdGravityAngle = ATD0DR0;
        while (!ATD0STAT2L_CCF1);
        iAdGyroscopeAngleSpeed = ATD0DR1;

        if(i == 20)
        {
            g_iAdGravityAngle = iAdGravityAngle/20;
            g_iAdGyroscopeAngleSpeed = iAdGyroscopeAngleSpeed/20;
        }
    }
}

void delay(void){

    unsigned int i, j;
    for (i = 0; i < 500; i++)
      for (j = 0; j < 500; j++);

}

void main(void) {

    unsigned char data1, data2, data3, data4;
    ATD_Init();
    SCI0_Init();
    for (;;) {

        capture_ATD();
        while(!SCI0SR1_TDRE);
        data1 = (unsigned char)(g_iAdGravityAngle & 0x00ff);
        data2 = (unsigned char)(g_iAdGravityAngle >> 8);
        SCI0DRL = data2;
        delay();
        SCI0DRL = data1;
        delay();  
        while(!SCI0SR1_TDRE);
        data3 = (unsigned char)(g_iAdGyroscopeAngleSpeed & 0x00ff);
        data4 = (unsigned char)(g_iAdGyroscopeAngleSpeed >> 8);
        SCI0DRL = data4;
        delay();
        SCI0DRL = data3;
        delay();
    }
}

回复

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
2#
 楼主| 发表于 2014-1-24 21:59:02 | 只看该作者
稍微有点思路了,用单步测试时有在第一次读到变量的值,,后面那个变量没有被分配,这个我待会看看什么问题,之后读出来的值就始终是0,所以问题我想出在AD设置上面

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
3#
 楼主| 发表于 2014-1-24 22:22:07 | 只看该作者
还是没搞懂。。。只有当i=0的时候才有读数,当i++后,两个读数值始终为0。。。菜鸟希望求解答。。。自己检查了很长时间没找到问题所在。。。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
4#
 楼主| 发表于 2014-1-24 22:51:24 | 只看该作者
好吧,那些值本身就是不对的,并不是读取的,而且上面的程序也有很多毛病,根本问题应该就是AD寄存器设置不正确,导致没能读出数字量
回复 支持 反对

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
5#
 楼主| 发表于 2014-1-25 10:11:41 | 只看该作者
新的一天,继续来解决问题
回复 支持 反对

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
6#
 楼主| 发表于 2014-1-25 20:58:41 | 只看该作者
还是不行啊。。。。求大神发个能用的参考一下啊
回复 支持 反对

使用道具 举报

24

主题

492

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13138
威望
5341
贡献
1645
兑换币
2222
注册时间
2012-3-9
在线时间
3076 小时
毕业学校
嘉兴学院
7#
发表于 2014-1-25 21:03:00 | 只看该作者
  for (i = 0; i < 20; i++)
    {
         while (!ATD0STAT2L_CCF0);
         iAdGravityAngle = ATD0DR0;
         while (!ATD0STAT2L_CCF1);
         iAdGyroscopeAngleSpeed = ATD0DR1;

        if(i == 20)
        {
             g_iAdGravityAngle = iAdGravityAngle/20;
             g_iAdGyroscopeAngleSpeed = iAdGyroscopeAngleSpeed/20;
        }
     }数据都没累加 还有i能等于20嘛
回复 支持 反对

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
8#
 楼主| 发表于 2014-1-25 21:12:13 | 只看该作者
机遇 发表于 2014-1-25 21:03
for (i = 0; i < 20; i++)
    {
         while (!ATD0STAT2L_CCF0);

嗯,这里是错了,~现在修改到#include <hidef.h>      #include "derivative.h"  

unsigned int g_iAdGravityAngle = 0, g_iAdGyroscopeAngleSpeed = 0;

void ATD_Init(void){

    ATD0CTL0 = 0x01;                  //AN1反转
    ATD0CTL1 = 0x40;                  //分辨率选择12位
    ATD0CTL2 = 0x40;                  //AD快速清零,禁止外部触发,禁止中断
    ATD0CTL3 = 0x90;                  //右对齐,转换序列长度为2
    ATD0CTL4 = 0x01;                  //采样时间选择为4个AD时钟周期一次
                                      // PRS=后五位的值
                                      //f(AD转换时间频率)=f(总线频率)/(2*(PRS+1))
    ATD0CTL5 = 0x30;                  //禁止特殊通道转换,连续转换,多通道采样
    ATD0DIEN = 0x00;                  //禁止数字输入功能
}

void SCI0_Init(void){

    SCI0BD = 52;
    SCI0CR1 = 0x00;                                    
    SCI0CR2 = 0x0c;
}

void capture_ATD(void) {

    while (!ATD0STAT2_CCF0);  
    g_iAdGravityAngle = ATD0DR0;
    while (!ATD0STAT2_CCF1);                       
    g_iAdGyroscopeAngleSpeed = ATD0DR1;
}

void delay(void){

    unsigned int i, j;
    for (i = 0; i < 500; i++)
      for (j = 0; j < 500; j++);

}

void main(void) {

    unsigned char data1, data2, data3, data4;
    ATD_Init();
    SCI0_Init();
    for (;;) {

        capture_ATD();
        while(!SCI0SR1_TDRE);
        data1 = (unsigned char)(g_iAdGravityAngle & 0x00ff);
        data2 = (unsigned char)(g_iAdGravityAngle >> 8);
        SCI0DRL = data2;
        delay();         
        while(!SCI0SR1_TDRE);
        SCI0DRL = data1;
        delay();  
        while(!SCI0SR1_TDRE);
        data3 = (unsigned char)(g_iAdGyroscopeAngleSpeed & 0x00ff);
        data4 = (unsigned char)(g_iAdGyroscopeAngleSpeed >> 8);
        SCI0DRL = data4;
        delay();
        while(!SCI0SR1_TDRE);
        SCI0DRL = data3;
        delay();
    }
}
回复 支持 反对

使用道具 举报

10

主题

346

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3064
威望
1392
贡献
1084
兑换币
707
注册时间
2014-1-1
在线时间
294 小时
9#
 楼主| 发表于 2014-1-25 21:59:48 | 只看该作者
好吧。。。换了一块芯片。。。读的出来了0 0。。。唉,大概是芯片问题吧
回复 支持 反对

使用道具 举报

12

主题

176

帖子

0

精华

高级会员

Rank: 4

积分
952
威望
480
贡献
316
兑换币
304
注册时间
2014-11-6
在线时间
78 小时
10#
发表于 2015-4-10 19:01:39 | 只看该作者
e    我的数据也是0   
float OutData[4] = { 0 };
unsigned char databuf[10] = {0};
unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
{
    unsigned short CRC_Temp;
    unsigned char i,j;
    CRC_Temp = 0xffff;

    for (i=0;i<CRC_CNT; i++){      
        CRC_Temp ^= Buf[i];
        for (j=0;j<8;j++) {
            if (CRC_Temp & 0x01)
                CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
            else
                CRC_Temp = CRC_Temp >> 1;
        }
    }
    return(CRC_Temp);
}

void OutPut_Data(void)
{
  int temp[4] = {0};
  unsigned int temp1[4] = {0};
  //unsigned char databuf[10] = {0};
  unsigned char i;
  unsigned short CRC16 = 0;
  for(i=0;i<4;i++)
   {
   
    temp[i]  = (int)OutData[i];
    temp1[i] = (unsigned int)temp[i];
   
   }
   
  for(i=0;i<4;i++)
  {
    databuf[i*2]   = (unsigned char)(temp1[i]%256);
    databuf[i*2+1] = (unsigned char)(temp1[i]/256);
  }
  
  CRC16 = CRC_CHECK(databuf,8);
  databuf[8] = CRC16%256;
  databuf[9] = CRC16/256;
  
  for(i=0;i<10;i++)
  uart_putchar(databuf[i]);
}
我用的这种   我的是128
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 14:27 , Processed in 0.134333 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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