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

2019-07-30 17:37发布

使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR) 使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR).zip (36.26 KB, 下载次数: 5) 2015-3-10 17:12 上传 点击文件名下载附件
  1. /*****************************************************************************
  2. *
  3. * 程序说明:
  4. *          斜度测试程序
  5. *          程序对应的硬件设置为:利而达MSP430-Test44x实验板,斜度计使用的
  6. *          是ADXL202E,数字y连接TA1/P1.2,数据x连接P1.0/TA0,P4.6对应斜度计电源
  7. *          每个方向的斜度显示时都占用三个字符,
  8. *          斜度范围为0~90,高于90的,斜度为(180-斜度)
  9. ******************************************************************************/
  10. #include "msp430x44x.h"
  11. #include "lcd.c"
  12. #include "math.h"

  13. #define RLEN 6
  14. unsigned int rbuf[RLEN];
  15. unsigned int sdata[RLEN];

  16. unsigned char status1,status2,rd1,flag,cnt,tmpv;
  17. float odata;
  18. void main()
  19. {  
  20.     WDTCTL = 0x5a80;                // stop watch dog
  21.     BTCTL  = 0x07;                  //  Basic Timer 1 中断频率设置
  22.     IE2   |= 0x80;                  // 使能 basic timer 中断
  23.     P4DIR &= 0x00;                  //
  24.     P4DIR |= 0x40;                  //
  25.     P4OUT |= 0x40;                  // 打开Tilt电源
  26.     P1DIR  = 0x00;                  //
  27.     P1SEL  = 0xff;                  //
  28.     FLL_CTL1|=SELS+XT2OFF+SELM_XT2;        //开启第二个振荡器
  29.     do
  30.     {
  31.       IFG1 &= ~OFIFG;                      // 清除OSCFault标志
  32.       for(tmpv = 0xff;tmpv > 0;tmpv--);    //
  33.     }while ((FLL_CTL0&XT2OF) == XT2OF );   // 第二个振荡器是否正常工作
  34.    
  35.     TACTL   = 0x0104; // 工作在辅助时钟,不分频
  36.     TAR = 0;
  37.     TACCTL0 = 0x4110;// IE=1,CAP=1,SCS=1,CCI0A选择,起始时只是上升沿捕获
  38.     init_LCD();
  39.     rd1     = 0;
  40.     tmpv    = 0;
  41.     status1 = 0;  // 状态为起始
  42.     status2 = 0;
  43.     for(tmpv=0;tmpv<6;tmpv++)
  44.     {
  45.         rbuf[tmpv] = 0x00;
  46.     }
  47.     TACTL |= 0x20;   // 连续计数模式
  48.      _EINT();
  49.     while(1);
  50.    
  51. }

  52. #pragma vector = TIMERA1_VECTOR
  53. __interrupt void B_ISR(void)
  54. {
  55.     if(status2==0)
  56.     {
  57.              rbuf[5] = CCR1;
  58.              status2 = 1;
  59.              TACCTL1 = 0x8110;  // 下降沿允许
  60.     }else if(status2==1)
  61.     {
  62.              status2 = 2;
  63.              rbuf[3] = rbuf[3] + CCR1 - rbuf[5];
  64.       
  65.              TACCTL1 = 0x0110;
  66.              TACCTL1 = 0x8110;  // 上升沿允许
  67.     }else if(status2==2)
  68.     {
  69.               rbuf[4]= CCR1 - rbuf[5] + rbuf[4];
  70.               rd1 +=1;
  71.               
  72.               TACCTL1 = 0x0110;     // B停止捕获模式
  73.               if(rd1== 100)
  74.              {
  75.                 TACCTL1 = 0x0100;
  76.                 status1 = 3;
  77.                 TACTL &= 0xFFCF;
  78.                
  79.               }else
  80.               {
  81.                 status1 = 0;
  82.                 TACCTL0 = 0x4110;    // A上升沿允许
  83.               }
  84.     }
  85. }
  86. #pragma vector = TIMERA0_VECTOR
  87. __interrupt void A_ISR(void)
  88. {
  89.    
  90.     if(status1==0)
  91.     {
  92.              rbuf[2] = CCR0;
  93.              status1 = 1;
  94.              TACCTL0 = 0x8110;      // 下降沿允许
  95.     }else if(status1==1)
  96.     {
  97.              status1 = 2;
  98.              rbuf[0] = rbuf[0] + CCR0 - rbuf[2];
  99.       
  100.              TACCTL0 = 0x0110;
  101.              TACCTL0 = 0x4110;      // 上升沿允许
  102.     }else if(status1==2)
  103.     {
  104.               rbuf[1]= CCR0 - rbuf[2] + rbuf[1];
  105.               rd1 +=1;
  106.               
  107.               TACCTL0 = 0x0110;     // A停止捕获模式
  108.               status2 = 0;
  109.               TACCTL1 = 0x4110;     // B的上升沿允许
  110.      }
  111. }
  112. #pragma vector = BASICTIMER_VECTOR
  113. __interrupt void  BT_Interrupt(void)
  114. {   
  115.       int tmpi;
  116.       
  117.       if(rd1==100)
  118.       {   
  119.            odata = rbuf[0]*1.0;             // 转成float型
  120.            odata = odata/rbuf[1];
  121.            odata = (odata  - 0.5)/0.116;   
  122.             if(odata<0)
  123.             {
  124.                odata = -odata;
  125.             }
  126.             if(odata >=1) odata = 1;
  127.             odata  = asin(odata);
  128.             odata = odata/3.14159*180;
  129.             tmpi = 0;
  130.             while(odata>=1)//获取斜度
  131.             {
  132.                if(odata>=100)
  133.                {
  134.                   odata=odata-100;
  135.                   tmpi+=100;
  136.                }else if(odata>=10)
  137.                {
  138.                   odata -= 10;
  139.                   tmpi +=10;
  140.                 }else if(odata >=1){
  141.                    odata -=1;
  142.                    tmpi += 1;
  143.                 }
  144.             }
  145.             for(tmpv=0;tmpv<3;tmpv++)
  146.             {
  147.                
  148.                 lcd_Buf[tmpv]= (char)(tmpi%10);
  149.                 tmpi =(tmpi/10);
  150.             }
  151.            
  152.            odata = rbuf[3]*1.0;
  153.            odata = odata/rbuf[4];
  154.            odata = (odata  - 0.327)/0.0505; //系数的计算应该根据实际的电路测量后确定
  155.            if(odata<0)
  156.            {
  157.                odata = -odata;
  158.             }
  159.             if(odata >=1) odata = 1;
  160.             odata  = asin(odata);
  161.             odata = odata/3.14159*180;
  162.             tmpi = 0;
  163.             while(odata>=1)//获取斜度
  164.             {
  165.                if(odata>=100)
  166.                {
  167.                   odata=odata-100;
  168.                   tmpi+=100;
  169.                }else if(odata>=10)
  170.                {
  171.                   odata -= 10;
  172.                   tmpi +=10;
  173.                 }else if(odata >=1)
  174.                 {
  175.                    odata -=1;
  176.                    tmpi += 1;
  177.                 }
  178.             }
  179.             
  180.             for(tmpv=3;tmpv<6;tmpv++)
  181.             {
  182.                 lcd_Buf[tmpv]= (char)(tmpi%10); //填充数据到LCD缓冲区
  183.                 tmpi =(tmpi/10);
  184.             }
  185.             status1 = 0;               // 参数、状态重置,以避免TAR溢出
  186.             rd1     = 0;
  187.             cnt     = 0;
  188.             rbuf[0] = 0;
  189.             rbuf[3] = 0;
  190.             rbuf[4] = 0;
  191.             rbuf[1] = 0;
  192.             TAR     = 0x00;
  193.             TACCTL0 = 0x4110;            // 上升沿允许
  194.             TACTL  |= 0x20;
  195.             status1 = 0;
  196.             lcd_Display();               // 使用LcD键盘数据  
  197.          }
  198.       
  199. }
复制代码

0条回答

一周热门 更多>