⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ashi.cpp

📁 上、下边沿开始测量脉冲脉宽
💻 CPP
字号:
#include "stdio.h"
#include "memory.h"
#include "iostream.h"
#include "math.h"

//返回采样数据中每个脉宽内含的采样数据个数
void impluse_width(unsigned long RadData[1024],unsigned int N[1024]);
void impluse_width1(unsigned long RadData[1024],unsigned int N[1024]);
/*
//返回采样数据中脉宽内含的采样数据平均个数
unsigned int impluse_width(unsigned long RadData[1024]);
*/

void main()
{
	int i;

	// 采样得到的数据  幅度是10或者5
	unsigned long SampleData1[1024]={168430090,168428810,84542730,0,
		168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
		168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
		168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
		168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
		168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,0,0};
	unsigned long SampleData2[1024]={0,168430090,168428810,84542730,0,
		168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
		168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
		168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,
		168430090,168430090,168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,168430090,
		0,0,0,0,168430090,168430090,168430090,168430090,0,0,0,0,0,0,168430090,168430090,168430090,168430090,
		168430090,0,0,0,0,168430090,168430090,168430090,0,0,0,0,168430090,0,0};

	//在下面一种条件下,刚开始会多产生两个数
	unsigned int SampleNum[1024];//数据大小根据实际调整,高16位村脉冲采样个数,低16位存脉宽采样个数

	// Test
	memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
	
	impluse_width(SampleData1,SampleNum);
	
		
	for(i=0;SampleNum[i]!=0;i++)
			cout<<"   "<<((SampleNum[i]&0xFFFF0000)>>16)<<"   "<<(SampleNum[i]&0x0000FFFF);
	cout<<endl<<"Parameter1 Measure method1 Over";
	cout<<endl;
	printf("\n");
	printf("\n");

	memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
	
	impluse_width(SampleData2,SampleNum);
	
	
	for(i=0;SampleNum[i]!=0;i++)
		cout<<"   "<<((SampleNum[i]&0xFFFF0000)>>16)<<"   "<<(SampleNum[i]&0x0000FFFF);
	cout<<endl<<"Parameter2 Measure method1 Over";
	cout<<endl;
	printf("\n");
	printf("\n");


	memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
	
	impluse_width1(SampleData1,SampleNum);
	
	
	for(i=0;SampleNum[i]!=0;i++)
		cout<<"   "<<((SampleNum[i]&0xFFFF0000)>>16)<<"   "<<(SampleNum[i]&0x0000FFFF);
	cout<<endl<<"Parameter1 Measure method2 Over";
	cout<<endl;
	printf("\n");
	printf("\n");

	memset(SampleNum,0,1024*sizeof(unsigned int));//给SampleNum[1024]赋初值
	
	impluse_width1(SampleData2,SampleNum);
	
	
	for(i=0;SampleNum[i]!=0;i++)
		cout<<"   "<<((SampleNum[i]&0xFFFF0000)>>16)<<"   "<<(SampleNum[i]&0x0000FFFF);
	cout<<endl<<"Parameter2 Measure method2 Over";
	cout<<endl;
	printf("\n Over!");

}

void impluse_width(unsigned long RadData[1024],unsigned int N[1024])
{
	int	i=0,j=0,k=0;
	int PW_Sample=0,PRI_Sample=0;	//脉宽内采样点个数   周期内采样点个数
	unsigned int RadDataTemp1=0,RadDataTemp2=0;
	bool	RSampleFlag=false;		//高电平标志 
	bool	DSampleFlag=false;		//低电平标志

	while (i<1024)
	{
		
		//RadDataTemp2为前面一个数
		//RadData采样数据格式,现认为是先存高位后存低位,用右移;否则左移
		
		
		/************************************************************************/
		/*	  这段代码有问题                                                    */
		/*	  如果是第一个数是高电平的话,则不管怎样就会认为有上边沿            */
		/*	  开始,RadDataTemp1=0,RadDataTemp2=0;								*/
		/*	  执行完	 RadDataTemp2=RadDataTemp1;								*/		
		/*	  RadDataTemp1=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);			*/
		/*	  这时:RadDataTemp2=0;RadDataTemp1为高电平,那么开始计算脉宽;    */
		/*	  实际上,采样数据不一定刚好是上边沿的第一个,有可能高电平的中间;  */
		/*	  这样第一个数据数据就有不对的										*/
		/************************************************************************/

		RadDataTemp2=RadDataTemp1;		
		RadDataTemp1=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);
		j++;


		/************************************************************************/
		/*     我具体不知你的想法,大体这么理解的:								*/
		/*     后一数据大前一数据6,就认为有上边沿								*/
		/*     后一数据小前一数据6,就认为有下边沿								*/
		/*     当有边沿时,记下数值												*/	
		/************************************************************************/
		if ((RadDataTemp1<RadDataTemp2)&&(RadDataTemp2-RadDataTemp1>6)&&PW_Sample)
		//两个数大小不超过6就认为没有经过上升沿或者下降沿
		{
			N[k]=PW_Sample;
			PW_Sample=0;
		}
		else if((RadDataTemp2<RadDataTemp1)&&(RadDataTemp1-RadDataTemp2>6)&&PRI_Sample)
		{
			N[k]=PRI_Sample<<16|N[k];
			PRI_Sample=0;
			k++;
		}

		/************************************************************************/
		/*     只要为高电平或低电平,就计数										*/
		/*     应该是有边沿后计数												*/	
		/************************************************************************/
		if ( RadDataTemp1>4)//大小大于4 就认为是高电平
		{
			RSampleFlag=true;
			DSampleFlag=false;
		}
		else 
		{
			DSampleFlag=true;
			RSampleFlag=false;
		}
		if (RSampleFlag&&(!DSampleFlag))
		//是高电平	
		{
			PW_Sample++;
			PRI_Sample++;
		}
		else if(DSampleFlag&&(!RSampleFlag)) 	//是低电平	
		{
			PRI_Sample++;
		}


		
		if (j>3)
		//完成对4个采样数据的处理
		{
			j=0;
			i++;
		}
	}

}


//修改后的
/************************************************************************/
/* 思路如下:                                                            */
/* 采样数据近来后,判到有跳沿后才开始脉宽计数、周期计数;                                                            */
/* 当得到两次跳沿后,认为一个周期完成,存脉宽计数、周期计数;                                                            */
/* 一个周期完成,即另一个周期的开始,应在存完后,清脉宽计数、周期计数;
	开始另一个周期的计数                                                */
/* 存在的问题:采样数据若有一段时间采空,即为0,那么可能这段时间也有可能被
	当作周期计数                                                         */
/************************************************************************/

void impluse_width1(unsigned long RadData[1024],unsigned int N[1024])
{
	int	i=0,j=0,k=0;
	int PW_Sample=0,PRI_Sample=0;	//脉宽内采样点个数   周期内采样点个数
	unsigned int RadDataTemp1=0,RadDataTemp2=0;
	int	EdgeFlag=0;//边沿标志
	int tolerance=6;//低平抖动容差
	unsigned int threshold=4;//高、低电平判决门限
	
	//RadDataTemp2为前面一个数
	RadDataTemp2=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);
	j++;
	while (i<1024)
	{
		RadDataTemp1=(RadData[i]&(0xFF000000>>(8*j)))>>(24-8*j);
		j++;
		
		/* 前后差大于tolerance,有跳沿	*/
		if (abs(RadDataTemp1-RadDataTemp2)>=tolerance)
		{
			if (EdgeFlag==0) 
			{
				if((RadDataTemp1>=threshold)&&(RadDataTemp2<threshold))
					EdgeFlag++;
			}
			else
				EdgeFlag++;	/*	跳沿加1*/
			
			if (EdgeFlag==3)/*	经过2次跳沿,一周期完成*/
			{
				N[k]=(PRI_Sample<<16)|PW_Sample;
				k++;
				PRI_Sample=0;
				PW_Sample=0;
				EdgeFlag=1;/* 一周期完成,即另一周期的开始*/
			}
		}
		if (EdgeFlag!=0) /*一周期开始才计数*/
		{
			PRI_Sample++;
			if ( RadDataTemp1>=threshold)//大于等于threshold,就认为是高电平
				PW_Sample++;
		}
			
		//完成对4个采样数据的处理
		if (j>3)	
		{
			j=0;
			i++;
		}

		RadDataTemp2=RadDataTemp1;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -