|
我测一个波谷在2.5到1.7v,波峰2.5到3.3V变化的交流信号,频率为50HZ,采用MSP430内部AD,取3个周期,每个周期取500个点,在500个点中取六个最大值取平均,最后把3个周期的最大值取平均之后输出,但是液晶显示不对啊,我怀疑是AD中断的问题,调了好几天,始终发现不料问题,希望大神们帮忙看看,MSP430的初学者,我恳请大家帮帮忙,小弟在这里谢过了。
#include <MSP430.h>
#include "cry1602.h"
typedef unsigned int uint;
typedef unsigned char uchar;
#define CYCLE 500//一个周期采集数据点数
#define POLE 6 //在峰值采集的点数
uchar shuzi[]={"0123456789"};
uint results[500]={0};
uint index = 0;
/*******************************
延时函数
*******************************/
void delay1(uint z)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
/***********************************************************
采集一个周期 20ms 的数据,取出六个最大值然后在取平均
***********************************************************/
uint OneCycDate(void)
{
uint results[CYCLE];
uint temp;
uint sum = 0;
uint j;
uchar i=0;
ADC12CTL0 |= ADC12SC;// 开始转换
_EINT(); //允许全局中断
delay1(500);
/******************************************************************
从CYCLE个数据中选取6个峰值,再取平均值
*****************************************************************/
for(i=0; i<POLE; i++)
{
for(j=i+1; j<CYCLE; j++)//则查找后面的第一个正值与之交换
{
if((results[j] >=0x800)& (results < results[j]))
{
temp = results;
results = results[j];
results[j] = temp;
}
}
sum+=results;
}
sum=sum/POLE;
return sum;
}
/************************************
取3个周期中的最大值再平均
*************************************/
uint NumCycData(void)
{
uchar i ;
uint peak[3];
unsigned long int tem=0;
for(i=0; i<3; i++)
{
peak = OneCycDate();
tem+=peak;
}
tem=tem/3;
return tem;
}
/*******************************************
AD进入转换中断函数
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
results[index++] = ADC12MEM0;
if(index == 500)
{
ADC12IE = 0x00;
}
}
/***********************************************
将十六进制数据发送到1602,转换成电流显示
***********************************************/
void Trans_val(uint Hex_Val)
{
uint caltmp;
uchar ptr[4];
caltmp = Hex_Val;
ptr[0] =caltmp/1000;
ptr[1] = caltmp%1000/100;
ptr[2] = caltmp%100/10;
ptr[3] =caltmp%10;
Disp1Char(6,1,shuzi[ptr[0]]);
Disp1Char(7,1,shuzi[ptr[1]]);
Disp1Char(8,1,shuzi[ptr[2]]);
Disp1Char(9,1,shuzi[ptr[3]]);
}
/************************主函数****************************/
void main(void)
{
uint ad_data = 0;
WDTCTL = WDTPW+WDTHOLD; //关闭看门狗
LcdReset(); //1602液晶初始化
P6SEL = 0x00; // 使能ADC通道
ADC12CTL0 = ADC12ON+SHT0_4+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_2;
ADC12MCTL0=INCH_0+SREF_0; // 使用采样定时器
while(1)
{
ADC12IE = 0x01; // 使能ADC中断
ADC12CTL0 |= ENC; // 使能转换
ad_data = NumCycData();
Trans_val(ad_data);
}
} |
|