使用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键盘数据
}
}
|