智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3859|回复: 4
打印 上一主题 下一主题

[软件类] 12位AD陀螺仪加速度采集与陀螺仪积分处理串口发送(串口猎人)这样写对吗,真诚求指导

[复制链接]

17

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1077
威望
501
贡献
196
兑换币
44
注册时间
2012-4-4
在线时间
190 小时
毕业学校
唐山师范
跳转到指定楼层
1#
发表于 2012-5-27 20:50:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define BUS_CLOCK     32000000    //总线频率
#define OSC_CLOCK     16000000    //晶振频率
#define BAUD 9600                    //串口波特率
   unsigned char AD_data0 ;
   unsigned char AD_data1 ;
   unsigned char AD_data2 ;
   unsigned char AD_data3 ;  
   float k1=2.15;
    float k2=2.2;
    float k3;
     float k4;
     int i;
     int acc0;
     int angle,acc,ty;
     int acc1;
     int ty0;
     int ty1;
     int data0;
     int data1;
     int num0;
     int num1;
     int hnum0;
     int hnum1;
    unsigned char jiah ;
    unsigned char jial;
    unsigned char tuoh ;
    unsigned char tuol;
   int angle1;
   int angle2;
   int angle0;
   unsigned char speed0 ;
   float m1;
   float m2;
   float m3;
   unsigned char AD_data ;
   int count;
   float   g_fGravityAngle ;
   float   g_fCarAngle, AngleSpeed;
   float g_fCarAnglelast ;                                                            
//*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif
    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
}
/*************************************************************/
/*                        初始化SCI                          */
/*************************************************************/
void INIT_SCI(void)
{
  SCI0BD = BUS_CLOCK/16/BAUD;   //设置SCI0波特率为9600
  SCI0CR1 = 0x00;       //设置SCI0为正常模式,八位数据位,无奇偶校验
  SCI0CR2 = 0x08;       //允许发送数据,禁止中断功能
}
/*************************************************************/
/*                      初始化AD模块 ,AD01陀螺仪转换,AD00重力加速度                        */
/*************************************************************/
void INIT_AD(void)
{
ATD0CTL2 = 0xc0;  //启动A/D转换,快速清零,禁止中断
ATD0CTL1=0x40;  //选用12位模数转换
ATD0CTL3 = 0x94;   //每次转换二个通道
ATD0CTL4 = 0x01;   //AD模块时钟频率为2MHz
  ATD0CTL5=0x30;//
}
//                     串口发送函数                        
/*************************************************************/
void SCI_send(unsigned char AD_capture)
{
  while(!SCI0SR1_TDRE);       //等待发送数据寄存器(缓冲器)为空
  SCI0DRL =AD_capture;
}
//AD采集函数
void AD_captur(void)
  {   i=0;  hnum0=0;hnum1=0;
     for(i=0;i<15;i++) {
     while(!ATD0STAT2_CCF0);
     num0=ATD0DR0;  //读结果
     hnum0+=num0;//求和
     while (!ATD0STAT2_CCF1);
      num1=ATD0DR1;  //读结果
      hnum1+=num1;
     }
    data0=hnum0/15;    //15次求平均值,加速度
    data1=hnum1/15;    //陀螺仪
    jiah=(char)(data0/256);     //加速度高位 (求高地位发送用)
    jial=(char)(data0%256);      //低位
    tuoh=(char)(data1/256);     //陀螺仪高位
    tuol=(char)(data1%256);     //低位
   // SCI_send(jiah);
    //SCI_send(jial);
    //AD_data= 0xAA;
    //SCI_send(AD_data);
    //AD_data= 0xA5;
    //SCI_send(AD_data);
    //SCI_send(tuoh);
    //SCI_send(tuol);   
}
//                     PIT模块初始化函数                  
/*************************************************************/
void init_PIT(void)
{
PITCFLMT=0x00;    //禁止中断
PITMTLD0=249;     //为0通道8位计数器赋值
PITLD0=639;     //为0通道16位计数器赋值   //(249+1)*(639+1)=16000000个总线周期=5ms秒
PITMUX_PMUX0=0;   //第0通道使用微计数器0
PITCE_PCE0=1;     //第0通道计数器工作
PITINTE_PINTE0=1; //0通道定时器定时中断被使能
PITCFLMT=0x80;    //使能周期中断定时器
}

  void  AngleCalculate (void)     //角度计算
   {
     float fDeltaValue;                                                      
     g_fGravityAngle = (data0- 1408.5) * 0.11668;  //180/(2025-670)加速度
         m1=g_fGravityAngle;
         if(m1<0) {m1=-m1; }
         acc=(int)m1;
         acc0=acc/256;//重力高位
         acc1=acc%256;// 重力低位
         AngleSpeed = (data1 - 1189) *0.05219;  //5.12/4096/(20.1*0.001)陀螺仪
         m2=AngleSpeed;
            if(m2<0) {m2=-m2; }
            ty=(int)m2;
            ty0=ty/256;//陀螺仪高位
            ty1=ty%256; // 陀螺仪低位
     g_fCarAngle = g_fCarAnglelast ;
     fDeltaValue =(g_fGravityAngle-g_fCarAngle)/3;  
     g_fCarAnglelast+= (AngleSpeed + fDeltaValue)*0.005;
              m3=g_fCarAnglelast;
              k3=g_fCarAnglelast;
          if(m3<0) {m3=-m3; }
          angle=(int)m3;
          angle1=angle/256;  //角度高位
          angle2= angle%256;//角度低位                    
          //return(angle);
}
/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  
  INIT_PLL();
  INIT_SCI();
  INIT_AD();
  init_PIT();
  EnableInterrupts;   
  for(;;)
  {
  }
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vpit0 void PIT_ISR(void)
{    PITTF_PTF0=1;
     count=count+1;
     if(count==1)
   {
       AD_captur();   //AD采集
   }
     else if(count==2)
{
   AngleCalculate();  //角度计算,串口发送
AD_data=(char)angle1;   //发送高位
   SCI_send(AD_data);
   AD_data=(char)angle2;   //低位
   SCI_send(AD_data);
   AD_data= 0xAA;
   SCI_send(AD_data);
   AD_data= 0xA5;
  SCI_send(AD_data);
   AD_data=(char)acc0;      //发送高位
   SCI_send(AD_data);
   AD_data=(char)acc1;        
  SCI_send(AD_data);         //发送低位
   AD_data= 0xAA;
  SCI_send(AD_data);
   AD_data=(char)ty0;         //陀螺仪高位
   SCI_send(AD_data);
   AD_data=(char)ty1;         //陀螺仪低位
   SCI_send(AD_data);
}
     else if(count>=3)
     {  count=1;
        AD_captur();
     }
}
   #pragma CODE_SEG DEFAULT

8

主题

145

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1021
威望
570
贡献
137
兑换币
22
注册时间
2011-9-19
在线时间
157 小时
2#
发表于 2012-5-29 06:52:21 | 只看该作者
看看,试试不就知道了
回复 支持 反对

使用道具 举报

4

主题

239

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1869

优秀会员奖章

威望
932
贡献
543
兑换币
340
注册时间
2012-11-25
在线时间
197 小时
3#
发表于 2013-1-25 20:11:32 | 只看该作者
回复 支持 反对

使用道具 举报

13

主题

265

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3090

优秀会员奖章活跃会员奖章

QQ
威望
1496
贡献
832
兑换币
898
注册时间
2012-10-11
在线时间
381 小时
4#
发表于 2013-3-12 23:52:38 | 只看该作者
你好  就是陀螺仪用串口出来的十六位的值  怎么算成角度啊!
回复 支持 反对

使用道具 举报

5

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
606
威望
306
贡献
184
兑换币
200
注册时间
2013-1-27
在线时间
58 小时
5#
发表于 2013-3-18 20:38:41 | 只看该作者
学习学习
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 19:37 , Processed in 0.076357 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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