打印

【TI 技术资料分享】+使用MSP430低功耗微处理器制作的斜度计

[复制链接]
637|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
必胜客A|  楼主 | 2015-3-10 17:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR) 使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR).zip (36.26 KB)
/*****************************************************************************
*
* 程序说明:
*          斜度测试程序
*          程序对应的硬件设置为:利而达MSP430-Test44x实验板,斜度计使用的
*          是ADXL202E,数字y连接TA1/P1.2,数据x连接P1.0/TA0,P4.6对应斜度计电源
*          每个方向的斜度显示时都占用三个字符,
*          斜度范围为0~90,高于90的,斜度为(180-斜度)
******************************************************************************/
#include "msp430x44x.h"
#include "lcd.c"
#include "math.h"

#define RLEN 6
unsigned int rbuf[RLEN];
unsigned int sdata[RLEN];

unsigned char status1,status2,rd1,flag,cnt,tmpv;
float odata;
void main()
{  
    WDTCTL = 0x5a80;                // stop watch dog
    BTCTL  = 0x07;                  //  Basic Timer 1 中断频率设置
    IE2   |= 0x80;                  // 使能 basic timer 中断
    P4DIR &= 0x00;                  //
    P4DIR |= 0x40;                  //
    P4OUT |= 0x40;                  // 打开Tilt电源
    P1DIR  = 0x00;                  //
    P1SEL  = 0xff;                  //
    FLL_CTL1|=SELS+XT2OFF+SELM_XT2;        //开启第二个振荡器
    do
    {
      IFG1 &= ~OFIFG;                      // 清除OSCFault标志
      for(tmpv = 0xff;tmpv > 0;tmpv--);    //
    }while ((FLL_CTL0&XT2OF) == XT2OF );   // 第二个振荡器是否正常工作
   
    TACTL   = 0x0104; // 工作在辅助时钟,不分频
    TAR = 0;
    TACCTL0 = 0x4110;// IE=1,CAP=1,SCS=1,CCI0A选择,起始时只是上升沿捕获
    init_LCD();
    rd1     = 0;
    tmpv    = 0;
    status1 = 0;  // 状态为起始
    status2 = 0;
    for(tmpv=0;tmpv<6;tmpv++)
    {
        rbuf[tmpv] = 0x00;
    }
    TACTL |= 0x20;   // 连续计数模式
     _EINT();
    while(1);
   
}

#pragma vector = TIMERA1_VECTOR
__interrupt void B_ISR(void)
{
    if(status2==0)
    {
             rbuf[5] = CCR1;
             status2 = 1;
             TACCTL1 = 0x8110;  // 下降沿允许
    }else if(status2==1)
    {
             status2 = 2;
             rbuf[3] = rbuf[3] + CCR1 - rbuf[5];
      
             TACCTL1 = 0x0110;
             TACCTL1 = 0x8110;  // 上升沿允许
    }else if(status2==2)
    {
              rbuf[4]= CCR1 - rbuf[5] + rbuf[4];
              rd1 +=1;
              
              TACCTL1 = 0x0110;     // B停止捕获模式
              if(rd1== 100)
             {
                TACCTL1 = 0x0100;
                status1 = 3;
                TACTL &= 0xFFCF;
               
              }else
              {
                status1 = 0;
                TACCTL0 = 0x4110;    // A上升沿允许
              }
    }
}
#pragma vector = TIMERA0_VECTOR
__interrupt void A_ISR(void)
{
   
    if(status1==0)
    {
             rbuf[2] = CCR0;
             status1 = 1;
             TACCTL0 = 0x8110;      // 下降沿允许
    }else if(status1==1)
    {
             status1 = 2;
             rbuf[0] = rbuf[0] + CCR0 - rbuf[2];
      
             TACCTL0 = 0x0110;
             TACCTL0 = 0x4110;      // 上升沿允许
    }else if(status1==2)
    {
              rbuf[1]= CCR0 - rbuf[2] + rbuf[1];
              rd1 +=1;
              
              TACCTL0 = 0x0110;     // A停止捕获模式
              status2 = 0;
              TACCTL1 = 0x4110;     // B的上升沿允许
     }
}
#pragma vector = BASICTIMER_VECTOR
__interrupt void  BT_Interrupt(void)
{   
      int tmpi;
      
      if(rd1==100)
      {   
           odata = rbuf[0]*1.0;             // 转成float型
           odata = odata/rbuf[1];
           odata = (odata  - 0.5)/0.116;   
            if(odata<0)
            {
               odata = -odata;
            }
            if(odata >=1) odata = 1;
            odata  = asin(odata);
            odata = odata/3.14159*180;
            tmpi = 0;
            while(odata>=1)//获取斜度
            {
               if(odata>=100)
               {
                  odata=odata-100;
                  tmpi+=100;
               }else if(odata>=10)
               {
                  odata -= 10;
                  tmpi +=10;
                }else if(odata >=1){
                   odata -=1;
                   tmpi += 1;
                }
            }
            for(tmpv=0;tmpv<3;tmpv++)
            {
               
                lcd_Buf[tmpv]= (char)(tmpi%10);
                tmpi =(tmpi/10);
            }
           
           odata = rbuf[3]*1.0;
           odata = odata/rbuf[4];
           odata = (odata  - 0.327)/0.0505; //系数的计算应该根据实际的电路测量后确定
           if(odata<0)
           {
               odata = -odata;
            }
            if(odata >=1) odata = 1;
            odata  = asin(odata);
            odata = odata/3.14159*180;
            tmpi = 0;
            while(odata>=1)//获取斜度
            {
               if(odata>=100)
               {
                  odata=odata-100;
                  tmpi+=100;
               }else if(odata>=10)
               {
                  odata -= 10;
                  tmpi +=10;
                }else if(odata >=1)
                {
                   odata -=1;
                   tmpi += 1;
                }
            }
            
            for(tmpv=3;tmpv<6;tmpv++)
            {
                lcd_Buf[tmpv]= (char)(tmpi%10); //填充数据到LCD缓冲区
                tmpi =(tmpi/10);
            }
            status1 = 0;               // 参数、状态重置,以避免TAR溢出
            rd1     = 0;
            cnt     = 0;
            rbuf[0] = 0;
            rbuf[3] = 0;
            rbuf[4] = 0;
            rbuf[1] = 0;
            TAR     = 0x00;
            TACCTL0 = 0x4110;            // 上升沿允许
            TACTL  |= 0x20;
            status1 = 0;
            lcd_Display();               // 使用LcD键盘数据  
         }
      
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

176

帖子

2

粉丝