📄 原文件 main.c
字号:
#include <msp430x14x.h>
#include <stdlib.h>
void Init_clk(void); //函数声明
void Init_ADC(void);
void Init_TimerA(void);
void Init_port(void);
void Init_sys(void);
void BaoLuo_Detector(int nLen);
void bandpassfilter(int nLen);
int nADC_Flag; //全局变量,标志ADC12采集到新数据
int nADC_Count;
int ADC_BUF_Temp[318]; //交换数据的缓冲区
int ADC_BUF_Temp1[318];
int ADC_BUF_Temp2[318];
int ADC_BUF[318];
//********************主函数***************************
void main(void)
{
int i;
int nCount;
WDTCTL =WDTPW + WDTHOLD; //关闭看门狗
_DINT(); //禁止中断
nADC_Flag=0; //初始化变量
nADC_Count=0;
nCount=0;
Init_sys();
_EINT(); //该函数打开中断
start:
LPM1; //低功耗模式1
if (nADC_Flag ==1)
{
//LPM1_EXIT; //退出休眠模式
nADC_Flag =0;
bandpassfilter(318); //???
BaoLuo_Detector(318); //???
for (i=0;i<1;i++) //设置门限比较
{
if (ADC_BUF_Temp2[i]>3)
nCount+=1;
}
if (nCount>200) //满足条件则实现功能
{
P3OUT |=BIT2;
P4OUT |=BIT0;
P4OUT |=BIT1;
P4OUT |=BIT2;
P4OUT |=BIT3;
}
else
{
nCount=0;
P3OUT &=~(BIT2);
P4OUT &=~(BIT0);
P4OUT &=~(BIT1);
P4OUT &=~(BIT2);
P4OUT &=~(BIT3);
LPM1; //工作模式1
}
goto start;
}
}
//***********ADC12,定时器A初始化,定时器中断*****************
void Init_sys(void) //系统初始化
{
Init_clk();
Init_ADC();
Init_TimerA();
Init_port();
}
//***********************初始化时钟*************************
void Init_clk(void)
{
unsigned int i;
BCSCTL1=0X00; //将寄存器BCSCTL1的内容清零
//XT2开启,LFTX1工作在低频,ACLK的分频因子为1
do
{
IFG1 &=~OFIFG; //清除OSCFault标志位
for(i=0x20;i>0;i--); //IFG1中断标志寄存器1
}
while((IFG1 & OFIFG)== OFIFG);//如果OSCFault=1
BCSCTL2=0X00;
BCSCTL2 += SELM_2; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS +DIVS_3; //SMCLK的时钟源为TX2CLK,分频因子为8
return;
}
//*******************初始化ADC12*****************
void Init_ADC(void)
{
WDTCTL= WDTPW + WDTHOLD;
P6SEL= 0X10; //选择P6.7口为外围模块模拟输入
ADC12CTL0 &=~(ENC); //使能ADC12寄存器修改,ENC=0
ADC12CTL1 |= CSTARTADD_0; //转换起始地址
ADC12MCTL0 = INCH_0+EOS; //参考电压设置
ADC12CTL0 =ADC12ON; //ADC12内核控制,打开ADC12可以转换
ADC12CTL0 =MSC; //首次转换由SHI信号的上升沿触发采样定时器,而后采样转换
//将在前一次转换完成后立即进行,不需要SHI的上升沿触发
ADC12CTL1 |=CONSEQ_1; //序列通道单次转换
ADC12CTL1 |=ADC12SSEL_3; //ADC内核时钟SMCLK
ADC12CTL1 |=ADC12DIV_0; //不分频
ADC12CTL0 |=ENC;
ADC12CTL1 |=(SHP); //采样脉冲由采样定时器产生
ADC12CTL1 =SHS0;
return;
}
//******************初始化定时器A********************
void Init_TimerA(void)
{
TACTL =TASSEL1+TACLR; //选择SMCLK,计数器清零
TACTL &=~(ID1); //不分频
TACTL &=~(ID0);
CCTL1 |=CCIE; //捕获/比较控制寄存器中断允许
CCR1 =50; //设置计数为50,计时时间间隔0.05ms或20KHZ
TACTL |=MC0; //增计数模式
return;
}
//*******************端口初始化******************
void Init_port(void)
{
P1DIR=0X10; //设置P1.4为输入
P1SEL=0; //设置P1.4为一般I/O口
P3DIR=0X07; //同上类似
P3SEL=0;
P4DIR=0X0F;
P4SEL=0;
P6DIR=0X10;
}
//*****************定时器中断,完成ADC转换********
//#pragma vector=CCIFG0_VECTOR
//TIMERA0
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
//interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
{
int results;
int i;
ADC12CTL0 &=~ENC; //关闭ADC12转换
results = ADC12MEM0; //读出转换结果
ADC_BUF[nADC_Count] =results;
nADC_Count +=1;
if(nADC_Count ==318) //设置采样点数,缓存大小
{
nADC_Flag =1; //设置标志
for(i =0;i<1;i++) ADC_BUF_Temp[i]=ADC_BUF[i];
nADC_Count =0;
}
ADC12CTL0 |= ENC+ADC12SC; //开ADC12转换
}
//**************fir滤波器设计*********************
//int h1[]={-5.0002e-005,4.4518e-005,7.1623e-006,-1.6362e-005,-2.2914e-005,-1.2762e-005,1.0423e-005,3.894e-005,6.169e-005,6.6992e-005,4.742e-005,4.4912e-006,-4.9226e-005,-9.2831e-005,-0.00010449,-7.1387e-005,2.2389e-006,9.2878e-005,0.00016412,0.00018021,0.00012228,2.2599e-007,-0.00014583,-0.0002575,-0.00028018,-0.0001878,7.8165e-007,0.00022197,0.00038735,0.00041748,0.00027761,-4.0998e-007,-0.00032127,-0.0005568,-0.00059595,-0.00039349,5.9121e-007,0.00044927,0.00077387,0.00082318,0.00054043,-5.2489e-007,-0.00060951,-0.0010444,-0.0011052,-0.00072201,5.1519e-007,0.00080597,0.0013747,0.0014481,0.00094187,-4.2438e-007,-0.0010419,-0.0017698,-0.0018568,-0.0012029,3.5133e-007,0.00132,0.0022339,0.0023351,0.0015075,-2.556e-007,-0.0016421,-0.0027697,-0.0028855,-0.0018566,1.2834e-007,0.0020091,0.0033781,0.0035085,0.0022507,1.5833e-008,-0.0024206,-0.0040582,-0.0042026,-0.0026883,-1.3623e-007,0.0028749,0.0048067,0.0049643,0.0031672,2.946e-007,-0.0033688,-0.0056182,-0.0057876,-0.0036831,-4.6517e-007,0.0038979,0.0064847,0.0066641,0.0042307,6.0912e-007,-0.0044561,-0.0073961,-0.0075832,-0.0048032,-7.5098e-007,0.0050361,0.00834,0.008532,0.0053923,8.6507e-007,-0.0056291,-0.0093021,-0.0094958,-0.0059887,-9.5962e-007,0.0062255,0.010266,0.010458,0.0065823,1.0171e-006,-0.0068148,-0.011215,-0.011402,-0.007162,-1.06e-006,0.0073858,0.012131,0.012309,0.0077166,1.0486e-006,-0.0079273,-0.012996,-0.013161,-0.0082349,-9.996e-007,0.008428,0.01379,0.01394,0.008706,9.2612e-007,-0.0088773,-0.014499,-0.014629,-0.0091194,-8.134e-007,0.0092653,0.015105,0.015213,0.0094661,6.5574e-007,-0.0095832,-0.015595,-0.015678,-0.009738,-4.8481e-007,0.0098237,0.015957,0.016014,0.009929,2.9908e-007,-0.0099812,-0.016184,-0.016213,-0.010034,-1.0586e-007,0.010052,0.01627,0.01627,0.010052,-1.0586e-007,-0.010034,-0.016213,-0.016184,-0.0099812,2.9908e-007,0.009929,0.016014,0.015957,0.0098237,-4.8481e-007,-0.009738,-0.015678,-0.015595,-0.0095832,6.5574e-007,0.0094661,0.015213,0.015105,0.0092653,-8.134e-007,-0.0091194,-0.014629,-0.014499,-0.0088773,9.2612e-007,0.008706,0.01394,0.01379,0.008428,-9.996e-007,-0.0082349,-0.013161,-0.012996,-0.0079273,1.0486e-006,0.0077166,0.012309,0.012131,0.0073858,-1.06e-006,-0.007162,-0.011402,-0.011215,-0.0068148,1.0171e-006,0.0065823,0.010458,0.010266,0.0062255,-9.5962e-007,-0.0059887,-0.0094958,-0.0093021,-0.0056291,8.6507e-007,0.0053923,0.008532,0.00834,0.0050361,-7.5098e-007,-0.0048032,-0.0075832,-0.0073961,-0.0044561,6.0912e-007,0.0042307,0.0066641,0.0064847,0.0038979,-4.6517e-007,-0.0036831,-0.0057876,-0.0056182,-0.0033688,2.946e-007,0.0031672,0.0049643,0.0048067,0.0028749,-1.3623e-007,-0.0026883,-0.0042026,-0.0040582,-0.0024206,1.5833e-008,0.0022507,0.0035085,0.0033781,0.0020091,1.2834e-007,-0.0018566,-0.0028855,-0.0027697,-0.0016421,-2.556e-007,0.0015075,0.0023351,0.0022339,0.00132,3.5133e-007,-0.0012029,-0.0018568,-0.0017698,-0.0010419,-4.2438e-007,0.00094187,0.0014481,0.0013747,0.00080597,5.1519e-007,-0.00072201,-0.0011052,-0.0010444,-0.00060951,-5.2489e-007,0.00054043,0.00082318,0.00077387,0.00044927,5.9121e-007,-0.00039349,-0.00059595,-0.0005568,-0.00032127,-4.0998e-007,0.00027761,0.00041748,0.00038735,0.00022197,7.8165e-007,-0.0001878,-0.00028018,-0.0002575,-0.00014583,2.2599e-007,0.00012228,0.00018021,0.00016412,9.2878e-005,2.2389e-006,-7.1387e-005,-0.00010449,-9.2831e-005,-4.9226e-005,4.4912e-006,4.742e-005,6.6992e-005,6.169e-005,3.894e-005,1.0423e-005,-1.2762e-005,-2.2914e-005,-1.6362e-005,7.1623e-006,4.4518e-005,-5.0002e-005};
int h2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,1,1,1,1,0,-1,-2,-2,-1,0,1,2,3,2,0,-2,-3,-4,-2,0,3,5,5,3,0,-4,-6,-7,-4,0,5,8,9,6,0,-6,-11,-11,-7,0,8,14,14,9,0,-10,-17,-18,-11,0,12,21,22,14,0,-15,-25,-26,-17,0,18,30,31,19,0,-21,-35,-36,-23,0,24,40,41,26,0,-27,-45,-47,-30,0,31,51,52,33,0,-35,-57,-58,-37,0,38,63,64,40,0,-42,-69,-70,-44,0,45,75,76,47,0,-49,-80,-81,-51,0,52,85,86,54,0,-55,-89,-90,-56,0,57,93,94,58,0,-59,-96,-96,-60,0,60,98,98,61,0,-61,-99,-100,-62,0,62,100,100,62,0,-62,-100,-99,-61,0,61,98,98,60,0,-60,-96,-96,-59,0,58,94,93,57,0,-56,-90,-89,-55,0,54,86,85,52,0,-51,-81,-80,-49,0,47,76,75,45,0,-44,-70,-69,-42,0,40,64,63,38,0,-37,-58,-57,-35,0,33,52,51,31,0,-30,-47,-45,-27,0,26,41,40,24,0,-23,-36,-35,-21,0,19,31,30,18,0,-17,-26,-25,-15,0,14,22,21,12,0,-11,-18,-17,-10,0,9,14,14,8,0,-7,-11,-11,-6,0,6,9,8,5,0,-4,-7,-6,-4,0,3,5,5,3,0,-2,-4,-3,-2,0,2,3,2,1,0,-1,-2,-2,-1,0,1,1,1,1,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0};
void bandpassfilter(int Len)
{
int i,j,k;
int Buff1[318]={0}; //318信号长度,待定!!
int sum0;
for (i=0;i<318;i++)
{
Buff1[1]=ADC_BUF_Temp[i];
sum0=0;
for(j=0;j<Len;j++)sum0+=Buff1[j]*h2[j];
ADC_BUF_Temp1[i]=sum0;
}
for (k=0;k<Len-1;k++)Buff1[Len-k+1]=Buff1[Len-k];
}
//*********************包络检波**************************
//int h3[]={0};
int h4[]={0};
void BaoLuo_Detector(int nLen)
{
int i,j,k;
int Buff2[318]={0};
int sum1;
for (i=0;i<nLen;i++)
{
Buff2[1]=ADC_BUF_Temp1[i];
Buff2[i]=abs(Buff2[i]); //取绝对值
sum1=0;
for(j=0;j<nLen;j++)sum1+=Buff2[j]*h4[j];//FIR低通滤波
ADC_BUF_Temp2[i]=sum1>>15;
}
for (k=0;k<nLen-1;k++)
{
Buff2[nLen-k+1]=Buff2[nLen-k];
}
}
/*
h5[212]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,0,1,2,2,1,0,-2,-3,-4,-3,0,3,6,6,4,0,-5,-9,-10 -7,0,8,14,15,10,0,-11,-20,-21,-14,0,16,27,28,18,0,-21,-35,-37,-24,0,26,44,46,30,0,-32,-54,-56,-36,0,38,63,65,42,0,-44,-73,-75,-47,0,49,82,83,52,0,-54,-89,-90,-57,0,58,95,96,60 0,-61,-99,-99,-61,0,62,100,100,62,0,-61,-99,-99,-61,0,60,96,95,58,0,-57,-90,-89,-54,0,52,83,82,49,0,-47,-75,-73,-44,0,42,65,63,38,0,-36,-56,-54,-32,0,30,46,44,26,0,-24,-37,-35,-21,0,18,28,27,16,0,-14,-21,-20,-11,0,10,15,14,8,0,-7,-10,-9,-5,0,4,6,6,3,0,-3,-4,-3,-2,0,1,2,2,1,0,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
h6[128]={0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,0,0,-1,-3,-4,-5,-7,-8,-10,-12,-13,-15,-16,-17,-18,-19,-19,-19,-18,-17,-15,-13,-10,-6,-2,3,9,14,21,27,34,41,49,56,63,69,75,81,86,91,94,97,99,100,100,99,97,94,91,86,81,75,69,63,56,49,41,34,27,21,14,9,3,-2,-6,-10,-13,-15,-17,-18,-19,-19,-19,-18,-17,-16,-15,-13,-12,-10,-8,-7,-5,-4,-3,-1,0,0,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0};
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -