| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516 | /******************************************AD程序*编写:李平*版本号:V1.00*日期:2011-7-16*文件名:Ad.c*/#include "Ad.h"#include "flash.h"#include "usart.h"#include "buffer.h"#include "weight.h"#define ZERO		500000#define SPANZERO  	ZERO#define TRN_INI   	2extern unsigned char usart1_send_data[64];extern void USART_Send_DMA(unsigned char j,int n);extern unsigned char WeightConst_ChanCheShu;ulng keyword=0;uchar stas_s0=0;//状态标志变量  0:称重状态 1:工厂标定和工厂设置状态   2:用户设置状态uchar fs[16]= {0}; //工厂参数uchar ZeroPass=0;uchar IsRealZero=0;uchar IsZeroFlag=0;uchar num_stbn=0;uchar n_stbn=0;uchar num_trn=0;uchar stbn=0;uchar IsStb=0;uchar Isol=0;uchar ad_nag_flag=0;uchar nag=0;uchar IsTare=0;ulng ad_lcd=0;ulng ad_lcd1=0;ulng ad_read=0;ulng ad_start=0;ulng ad_sample=0;ulng ad_zero=0;ulng real_zero=0;ulng ad_last=0;ulng ad_tare=0;ulng Maxval=0;uchar Inteval=0;uchar point1=0;uchar point2=0;float spanz=0;ulng Low_w=0;ulng Up_w=0;ulng err_cnt=0;ulng ok_cnt=0;uchar STB_N=2;uchar start_loop;ulng AD=0;/*******************************************/float Avad[6]= {0};float Bvad[6]= {0};float Cvad[6]= {0};float Dvad[6]= {0};float Evad[6]= {0};float Fvad[6]= {0};float Gvad[6]= {0};float Hvad[6]= {0};float Ivad[6]= {0};float Jvad[6]= {0};float AD_result=0;uchar ad_ini_flag=0;uchar ad_ini_flag1=0;float Ad_tol=0;uchar Ad_cnt=0;uchar Ad_I=0;uchar AVG_CNT=4;uchar f_zeroset=1;uchar FLT_CNT=16;uchar FLT_XF_CNT=1;ulng FilterArray[128];uchar FilterPos=0;uchar dat[32]= {0};ulng Kalman_FilterArray[128];uchar Kalman_ini_flag=0;uchar Kalman_FilterPos=0;uchar key_CNT_f=0;float percent_fl=1.000f;ulng percent_ul=999;extern uchar ini_flag1;uchar Rsbuffer[7]= {0}; //RS232使用uchar RsWeight[]={    0x30,0x31,0x32,0x33,0x34,0x35,//	"0"	 "1"  "2"  "3"  "4"  "5"    0x36,0x37,0x38,0x39//	"6"	 "7"  "8"  "9"};float x1=0,x2=0,x0=0,y0=0,y1=0,y2=0;unsigned	char	buf[4] = {0,0,0,0};unsigned	char isIRQ;ulng ad_sample_temp;extern void Delay(__IO uint32_t nCount);#define  _nop_()		Delay(1)ulng get_weight(void){	  ulng tempval=0;	  ulng tempvalw=0;    isIRQ=0;	  tempval = Ad_Sample1();	  if (tempval<0xFFFFFFFF)	  {      ad_sample_temp = tempval;	  }   // if (ad_sample_temp>0 && ad_sample_temp<0xFFFFF && isIRQ==0)	  if (isIRQ==0 && tempval<0xFFFFFFFF)        ad_sample=ad_sample_temp;    // ad_sample_=ad_sample;    //  ad_sample=(int)((float)ad_sample * 0.01 + (1.0 - 0.01) * (float)ad_sample);   // ad_sample = AdFilter_xf(ad_sample);  //限幅滤波	 FLT_XF_CNT=32;		ad_sample = middleFilter(ad_sample);						tempvalw = ad_sample;				switch(fs[1])		{		case 1:				ad_sample = Kalman_Filter(ad_sample, 0.5, 0.5);				break;		case 2:				ad_sample = Kalman_Filter(ad_sample, 0.1, 0.5);				break;		case 3:				ad_sample = Kalman_Filter(ad_sample, 0.05, 0.5);				break;		case 4:				ad_sample = Kalman_Filter(ad_sample, 0.01, 0.5);				break;		case 5:				ad_sample = Kalman_Filter(ad_sample, 0.1, 0.5);				break;		case 6:				ad_sample = Kalman_Filter(ad_sample, 0.05, 0.5);				break;		case 7:				ad_sample = Kalman_Filter(ad_sample, 0.1, 0.5);				break;		default:				ad_sample = Kalman_Filter(ad_sample, 0.125, 0.5);				break;		}	  			//ad_sample = AdFilter(ad_sample);     //滑动滤波	  FLT_CNT=32;										if (tempWeighttime<100){				tempWeighttime ++;				ad_sample = tempvalw;				}	    ad_read = adcalculate(ad_sample);    Common();  //称量状态   // RS232weight(ad_lcd1);    return ad_lcd1;}//---------------------------------//Function that writes to the AD7190 via the SPI port.//--------------------------------------------------------------------------------void WriteToAD7190(unsigned char count, unsigned char *buf){    unsigned	char	ValueToWrite = 0;    unsigned	char	i = 0;    unsigned	char	j = 0;   // __disable_irq();    AD_CLK_1;    _nop_();    for(i=count; i>0; i--)    {        ValueToWrite = *(buf + i - 1);        for(j=0; j<8; j++)        {            AD_CLK_0;            if(0x80 == (ValueToWrite & 0x80))            {                AD_DIN_1;	  //Send one to SDO pin            }            else            {                AD_DIN_0;  //Send zero to SDO pin            }            _nop_();            AD_CLK_1;            _nop_();            ValueToWrite <<= 1;	//Rotate data        }    }    AD_DIN_0;  //  __enable_irq();}//---------------------------------//Function that reads from the AD7190 via the SPI port.//--------------------------------------------------------------------------------void ReadFromAD7190(unsigned char count, unsigned char *buf){    unsigned	char	i = 0;    unsigned	char	j = 0;    unsigned	int  	iTemp = 0;    unsigned	char  RotateData = 0;   // __disable_irq();    AD_CLK_1;    _nop_();    for(j=count; j>0; j--)    {        for(i=0; i<8; i++)        {            AD_CLK_0;            RotateData <<= 1;		//Rotate data            _nop_();            iTemp = AD_R_DI;			//Read SDI of AD7190            AD_CLK_1;            if(0x00000001 == (iTemp & 0x00000001))            {                RotateData |= 1;            }            _nop_();        }        *(buf + j - 1)= RotateData;    }   // __enable_irq();}// extern void led_change(void);/************************************读AD7190函数*/ulng Ad_Sample1(void){    uchar i;    ulng j=0;    ulng AdSample=0XFFFFFFFF;    // __disable_irq();    AD_CLK_1;    _nop_(); //   _nop_();    while(AD_R_DI==1) {        j++;        if (j>1000) break;    }    if (j<1000)    {        AdSample=0;        for(i=0; i<24; i++)        {            AD_CLK_0;        //    _nop_();            _nop_();            AdSample<<=1;            if(AD_R_DI==1)                AdSample++;            AD_CLK_1;            _nop_();       //     _nop_();        }/*        if ((AdSample&0x00800000)!=0)        {            AdSample=~AdSample+1;            AdSample&=0x007fffff;            AdSample=0x007fffff-AdSample;        }        else        {            AdSample&=0x007fffff;            AdSample=0x007fffff+AdSample;        }				*/        if (fs[1]<=4 && fs[1]>0 )            AdSample = AdSample>>3;        else if (fs[1]>4 && fs[1]<=6 )            AdSample = AdSample>>2;              else            AdSample = AdSample;				  //      led_change();    }    //__enable_irq();    return(AdSample);}/**********************************************AD7190上电初始化处理*/void adFs(unsigned char fs_){    Delay(100);    AD_CS_0;    AD_SYNC_1;    Delay(100);//Reset AD7190    buf[2]= 0xff;    buf[1]= 0xff;    buf[0]= 0xff;    WriteToAD7190(3,buf);    buf[1]= 0xff;    buf[0]= 0xff;    WriteToAD7190(2,buf);    Delay(200);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   0   0   0   1    0    0   0    */    /***********************************    模式寄存器    MD2|MD1|MD0|DAT_STA|CLK1|CLK0| 0 | 0     0   0   0     0     0    0    0   0    SINC3| 0 |ENPAR| 0 |SINGLE|REJ60|FS9|FS8    	0    0    0    0    0      1    0   0    FS7|FS6|FS5|FS4|FS3|FS2|FS1|FS0     0   0   0   0   0   1   0   1    *///mode register    buf[0] = 0x08;    WriteToAD7190(1,buf);    buf[2] = 0x00;    buf[1] = 0x04;//	buf[0] = 0x50;//xxx Hz    if (fs_==0)        buf[0] = 80;//xxx Hz    else        /*if (fs_==1)        {          buf[1] = buf[1]|((480>>8)&3);//xxx Hz          buf[0] = 480&0xff;//xxx Hz        }        else if (fs_==2)        {          buf[1] = buf[1]|((480>>8)&3);//xxx Hz          buf[0] = 480&0xff;//xxx Hz        }        else if (fs_==3)        {          buf[1] = buf[1]|((640>>8)&3);//xxx Hz          buf[0] = 640&0xff;//xxx Hz        }        else if (fs_==4)        {          buf[1] = buf[1]|((640>>8)&3);//xxx Hz          buf[0] = 640&0xff;//xxx Hz        }        else if (fs_==5)        {          buf[1] = buf[1]|((1023>>8)&3);//xxx Hz          buf[0] = 1023&0xff;//xxx Hz        }        else if (fs_==6)        {          buf[1] = buf[1]|((1023>>8)&3);//xxx Hz          buf[0] = 1023&0xff;//xxx Hz        }        else if (fs_==7)        */    {        buf[1] = buf[1]|((120>>8)&3);//xxx Hz        buf[0] = 120&0xff;//xxx Hz    }    /*    else    {      buf[0] = 80;//xxx Hz    }    */    WriteToAD7190(3,buf);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   0   0   1   0    0    0   0    */    /*********************************    配置寄存器    CHOP| 0 | 0 |REFSEL| 0 | 0 | 0| 0      0   0   0     0    0   0   0  0    CH7|CH6|CH5|CH4|CH3|CH2|CH1|CH0     0   0   0   0   0   0   1   0    BURN|REFDET| 0 |BUF|U/B|G2|G1|G0     0      0    0   1   0   1  1  1    *///Configuration register    buf[0] = 0x10;    WriteToAD7190(1,buf);    buf[2] = 0x80; //buf[2] = 0x80;    buf[1] = 0x02;    buf[0] = 0x17;    WriteToAD7190(3,buf);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   0   1   0   1    0    0   0    */    /***********************************    GPOCON寄存器     0 |BPDSW|GP32EN|GPIOEN|P3DAT|P2DAT|P1DAT|P0DAT     0    1      0      0      0    0     0     0    *///GPOCON register    buf[0] = 0x28;    WriteToAD7190(1,buf);    buf[0] = 0x40;    WriteToAD7190(1,buf);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   1   0   1   1    1    0   0    *///通信寄存器,连续读数据寄存器    buf[0] = 0x5c;    WriteToAD7190(1,buf);    Delay(5);}/**********************************************AD7190上电初始化处理*/void adini(void){    Delay(100);    AD_CS_0;    AD_SYNC_1;    Delay(100);//Reset AD7190    buf[2]= 0xff;    buf[1]= 0xff;    buf[0]= 0xff;    WriteToAD7190(3,buf);    buf[1]= 0xff;    buf[0]= 0xff;    WriteToAD7190(2,buf);    Delay(200);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   0   0   0   1    0    0   0    */    /***********************************    模式寄存器    MD2|MD1|MD0|DAT_STA|CLK1|CLK0| 0 | 0     0   0   0     0     0    0    0   0    SINC3| 0 |ENPAR| 0 |SINGLE|REJ60|FS9|FS8    	0    0    0    0    0      1    0   0    FS7|FS6|FS5|FS4|FS3|FS2|FS1|FS0     0   0   0   0   0   1   0   1    *///mode register    buf[0] = 0x08;    WriteToAD7190(1,buf);    buf[2] = 0x00;    buf[1] = 0x04;    buf[0] = 0x50;//xxx Hz    WriteToAD7190(3,buf);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   0   0   1   0    0    0   0    */    /*********************************    配置寄存器    CHOP| 0 | 0 |REFSEL| 0 | 0 | 0| 0      0   0   0     0    0   0   0  0    CH7|CH6|CH5|CH4|CH3|CH2|CH1|CH0     0   0   0   0   0   0   1   0    BURN|REFDET| 0 |BUF|U/B|G2|G1|G0     0      0    0   1   0   1  1  1    *///Configuration register    buf[0] = 0x10;    WriteToAD7190(1,buf);    buf[2] = 0x00;    buf[1] = 0x02;    buf[0] = 0x17;    WriteToAD7190(3,buf);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   0   1   0   1    0    0   0    */    /***********************************    GPOCON寄存器     0 |BPDSW|GP32EN|GPIOEN|P3DAT|P2DAT|P1DAT|P0DAT     0    1      0      0      0    0     0     0    *///GPOCON register    buf[0] = 0x28;    WriteToAD7190(1,buf);    buf[0] = 0x40;    WriteToAD7190(1,buf);    /***********************************    通信寄存器    WEN|R/W|RS2|RS1|RS0|CREAD| 0 | 0     0   1   0   1   1    1    0   0    *///通信寄存器,连续读数据寄存器    buf[0] = 0x5c;    WriteToAD7190(1,buf);    Delay(5);}/*************************AD采样速度选择函数*/void Speed(void){    switch(fs[1])    {    case 0:        ad_ini_flag=0;        ad_ini_flag1=0;        FLT_CNT=4;      //滑动滤波        AVG_CNT=4;      //平均滤波        break;    case 1:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    case 2:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    case 3:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    case 4:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    case 5:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    case 6:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    case 7:        ad_ini_flag1=0;        FLT_CNT=24;        AVG_CNT=6;        break;    default:        ad_ini_flag1=0;        FLT_CNT=32;        AVG_CNT=4;        break;    }}/****限幅滤波**********************/uchar count_xf;ulng AdFilter_xf_value;uchar ad_ini_flag_xf=0;ulng AdFilter_xf(ulng x) {    uint32_t FILTER_A = 0x7FFF; //限幅100公斤    int32_t FILTER_1 ;    if(ad_ini_flag_xf==0)    {        ad_ini_flag_xf=1;        count_xf=0;        AdFilter_xf_value=x;        return x;    }    FILTER_1 = x - AdFilter_xf_value;    if (FILTER_1<0)        FILTER_1 = FILTER_1 * -1;    if(FILTER_1 > FILTER_A  && count_xf<=FLT_XF_CNT)    {        count_xf++;    }    else    {        count_xf=0;        AdFilter_xf_value = x;    }    return AdFilter_xf_value;}/***kalman滤波*************//*        Q:过程噪声,Q增大,动态响应变快,收敛稳定性变坏        R:测量噪声,R增大,动态响应变慢,收敛稳定性变好*/ulng Kalman_Filter(const double ResrcData, double ProcessNiose_Q,double MeasureNoise_R){    int32_t ad_sum = 0;    ulng ad_avg = 0;    double R = MeasureNoise_R;    double Q = ProcessNiose_Q;    static double x_last;    static double p_last;    double x_mid;    double x_now;    double p_mid ;    double p_now;    double kg;    uchar i;    uchar x__=3;    uchar y__=1<<x__;    if(Kalman_ini_flag==0)    {        for(i=0; i<y__; i++)            Kalman_FilterArray[i]=0;        Kalman_ini_flag=1;    }    Kalman_FilterPos++;    if (Kalman_FilterPos>=y__)        Kalman_FilterPos=0;    Kalman_FilterArray[Kalman_FilterPos]=ResrcData;    ad_sum = 0;    for (i=0; i<y__; i++)        ad_sum+=Kalman_FilterArray[i];    ad_avg = ad_sum>>x__;    ad_sum = 0;//	for (i=0; i<y__; i++)//	    ad_sum+=(int)(Kalman_FilterArray[i]-ad_avg)*(int)(Kalman_FilterArray[i]-ad_avg);////	R = (ad_sum>>(x__+2));    for (i=0; i<y__; i++)        ad_sum+=(Kalman_FilterArray[i]-ad_avg);    if (ad_sum <0) ad_sum=ad_sum*-1;//	R = 1<<ad_sum;    x_mid=x_last;          //x_last=x(k-1|k-1),x_mid=x(k|k-1)    p_mid=p_last+Q;        //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声    kg=p_mid/(p_mid+R);    //kg为kalman filter,R为噪声    x_now=x_mid+kg*(ResrcData-x_mid); //估计出的最优值    p_now=(1-kg)*p_mid;               //最优值对应的covariance    p_last = p_now;                   //更新covariance值    x_last = x_now;                   //更新系统状态值    return x_now;}ulng middleFilterdata[128];ulng middleFilter(ulng x){	ulng i;	ulng j;	ulng temp;	for (j = 0; j < 31-1; j++)	  middleFilterdata[j] = middleFilterdata[j+1];	middleFilterdata[31] = x;		for (j = 0; j < 31-1; j++)	{		for (i = 0; i < 31-j; i++)		{			if (middleFilterdata[i] > middleFilterdata[i+1])			{				temp = middleFilterdata[i];				middleFilterdata[i] = middleFilterdata[i+1];				middleFilterdata[i+1] = temp;			}		}	}		return middleFilterdata[floor((FLT_CNT-1)/2)];} /****************************/ulng AdFilter(ulng x){    ulng ad_sum = 0;    uchar i;    if(ad_ini_flag1==0)    {        for(i=0; i<FLT_CNT; i++)        {            FilterArray[i]=x;        }        ad_ini_flag1=1;        return x;    }    FilterPos++;    if (FilterPos>=FLT_CNT)    {        FilterPos=0;    }    FilterArray[FilterPos]=x;    for (i=0; i<FLT_CNT; i++)    {        ad_sum+=FilterArray[i];    }    return(ad_sum/(FLT_CNT));}/****************************标定系数保存*地址:33--52*/void ArgSave(void){		ad_Maxval =	Maxval;		ad_Inteval = Inteval;		ad_Point = point1;		ad_Spanz = spanz;		ad_Zero	= ad_zero;		write_Flash("ad_Maxval", &ad_Maxval, sizeof(ad_Maxval));							write_Flash("ad_Inteval", &ad_Inteval, sizeof(ad_Inteval));							write_Flash("ad_Point", &ad_Point, sizeof(ad_Point));				write_Flash("ad_Spanz", &ad_Spanz, sizeof(ad_Spanz));							write_Flash("ad_Zero", &ad_Zero, sizeof(ad_Zero));						    W_fs();    if((stas_s0==0)||(stas_s0==1))        Zero_Save();}/****************************标定系数读出*地址:32--52*/void ArgRead(void){								Maxval = ad_Maxval;		Inteval = ad_Inteval;		point1 = ad_Point;		spanz = ad_Spanz;		ad_zero = ad_Zero;    point2=0;	    adini();    R_fs();    Zero_Read();    Speed();    adFs(fs[1]);}/***********************************写工厂设置参数*固定地址:1-16*/void W_fs(void){		ad_FS = fs[1];	  write_Flash("ad_FS", &ad_FS, sizeof(ad_FS));						}/****************************读工厂设置参数*固定地址:1-16*/void R_fs(void){    fs[1] = ad_FS;	}/*************************************标定参数默认值*/void ArgIni(void){    fs[1]=0;    Maxval=3000;    spanz=0.5;    Inteval=1;    point1=3;    point2=0;    ad_zero=ZERO;}/*************************************零点参数保存*地址 53--56*/void Zero_Save(void){		ad_Tare = ad_tare;		  write_Flash("ad_Tare", &ad_Tare, sizeof(ad_Tare));	}/*************************************零点参数读出*地址 53--56*/void Zero_Read(void){   ad_tare = ad_Tare;	}/*************************************Description: 转换十进制至bcd准备显示(重量)Argument:	noneReturn:		none*************************************/void DisplayWeight_ww(__IO ulng dis_data){    uchar digit;    ulng divider=100000;   		//除数    uchar quotient=0;           	//商    if(dis_data>999999)    {        dis_data=0;				//超过显示最大值送零    }    for(digit=0; digit<6; digit++)    {        quotient=0;        while(dis_data>(divider-1))        {            dis_data-=divider;            quotient++;        }        divider/=10;        Rsbuffer[digit]=RsWeight[quotient];    }}void RS232weight(__IO ulng x){    DisplayWeight_ww(x);    //2D 33 36 35 34 0D    //02 2B 30 30 30 30 30 30 33 03    // 30 30 2E 30 30 30 0D 0A    if (WeightConst_ChanCheShu==9)    {			  usart1_send_data[0] = 0x04;			  usart1_send_data[1] = (ad_sample_temp>>24)&0xFF;			  usart1_send_data[2] = (ad_sample_temp>>16)&0xFF;			  usart1_send_data[3] = (ad_sample_temp>>8)&0xFF;			  usart1_send_data[4] = ad_sample_temp&0xFF;    }    else    {			  usart1_send_data[0] = 0x06;        if (nag)        {					  usart1_send_data[1] = 0x2D;            for(int i=2; i<6; i++) usart1_send_data[i] = Rsbuffer[i];        }        else            for(int i=1; i<6; i++) usart1_send_data[i] = Rsbuffer[i];				    }		usart1_send_data[6] = 0x0D;		rt_sem_take(uart1_lock, RT_WAITING_FOREVER);    HAL_UART_Transmit_DMA(&huart1, usart1_send_data, usart1_send_data[0]);		rt_sem_release(uart1_lock);}/**********************************小数点位  1-5*/void setPoint(__IO uchar val_){    point1 = val_;    ArgSave();}/**********************************分度值  1、2、5、10*/void setInteval(__IO uchar val_){    Inteval=val_;    ArgSave();}/**********************************滤波级别 1-8*/void setFS(__IO uchar val_){    fs[1] = val_;    adFs(fs[1]);    Speed();    ArgSave();}/**********************************校正百分比*/void setPercent(__IO int val_){    percent_fl=(float)val_/1000;    spanz = spanz + spanz * percent_fl;      //保存新的校正    ArgSave();}/**********************************最大称量*/void setMaxval(__IO ulng val_){    Maxval = val_;    ArgSave();}/**********************************0点校正*/void setZeroCal(void){    if ((ad_sample>0)&&(ad_sample<50000000))    {        zerocalculate();   //0点计算        ArgSave();    }}/**********************************砝码校正*/void setFullCal(__IO ulng val_){    keyword = val_;    if ((ad_sample-ad_zero)>=(keyword/Inteval*10)&&(ad_sample>ad_zero)&&(keyword!=0))    {        fullcalculate();       //砝码计算        ArgSave();    }}/**********************************置零*/void setZero(void){    Zero_Pro();}/**********************************称量计算显示函数*/void Common(void){    if(f_zeroset==0)    {        CommonModeIni();    }    CheckZero(ad_read);    Do();    Dis_Weight();}/**********************************************零点检测*/void CheckZero(__IO ulng check_data){    ulng zero_range;    zero_range=24;    if(check_data>real_zero)    {        check_data-=real_zero;    }    else    {        check_data=real_zero-check_data;    }    IsRealZero=(check_data<zero_range);    IsZeroFlag=IsRealZero;}/**********************************************初始零点建立*/void CommonModeIni(void){    IsStb=0;    while(!IsStb)    {        ad_sample=Ad_Sample1();        ad_sample=AdFilter(ad_sample);        ad_sample=EX_QR_Filter(ad_sample);        ad_read=adcalculate(ad_sample);        Check_Wen1();        ad_last=ad_read;    }    Zero_Read();    ad_read=ad_tare;    ad_lcd=ad_read;    ad_start=ad_read;    ad_last=ad_read;    real_zero=ad_read;    f_zeroset=1;}/**********************************************开机稳定判别*/void Check_Wen1(void){    ulng check_Wdata1;    ulng check_Wdata2;    ulng stb_w;    stb_w=50;    check_Wdata1 = ad_last - stb_w;    check_Wdata2 = ad_last + stb_w;    if(((ad_read>check_Wdata1)&&(ad_read<check_Wdata2) ))    {        if(n_stbn>=20)        {            n_stbn=0;            IsStb=1;        }        else        {            n_stbn++;        }    }    else    {        n_stbn=0;    }}/**********************************************稳定判别*/void Check_Wen(void){    ulng check_Wdata1;    ulng check_Wdata2;    ulng stb_w;    stb_w=5;    STB_N=5;    check_Wdata1 = ad_last - stb_w;    check_Wdata2 = ad_last + stb_w;    if((ad_read>check_Wdata1)&&(ad_read<check_Wdata2))    {        if(n_stbn>=STB_N)        {            n_stbn=0;            IsStb=1;        }        else        {            n_stbn++;        }    }    else    {        n_stbn=0;    }}/**********************************************不稳定判别*/void Check_Not_Wen(void){    ulng check_data1;    ulng check_data2;    ulng nstb_w;    nstb_w=10;    check_data1=ad_lcd-nstb_w;    check_data2=ad_lcd+nstb_w;    if((ad_read<check_data1)||(ad_read>check_data2))    {        IsStb=0;    }}/**********************************************开机零点检测*Return: 0 开机零点超出范围*	  1 开机零点在范围内*/uchar Check_Start(void){    ulng check1=0;    ulng check2=0;    check1=SPANZERO-(Maxval/(ulng)Inteval*2);//20%    check2=SPANZERO+(Maxval/(ulng)Inteval*2);    if((ad_read<check1)||(ad_read>check2))    {        return(0);    }    else    {        return(1);    }}/**********************************************零点跟踪*/void Zero_Trace(void){    ulng check_data1;    ulng check_data2;    ulng ZeroTrace_w;    uchar trn_cnt;    ZeroTrace_w = 5;    check_data1=ad_start-Maxval/((ulng)Inteval*2)/10;//600;    check_data2=ad_start+Maxval/((ulng)Inteval*2)/10;//600;    if((ad_read<check_data1)||(ad_read>check_data2))    {        num_trn=0;        return;    }    check_data1=real_zero-1;    check_data2=real_zero+1;    if((ad_read>=check_data1)&&(ad_read<=check_data2))    {        num_trn=0;        return;    }    check_data1=real_zero-ZeroTrace_w;    check_data2=real_zero+ZeroTrace_w;    if((ad_read<=check_data1)||(ad_read>=check_data2))    {        num_trn=0;        return;    }    trn_cnt=5;    if(num_trn>=trn_cnt)    {        if (ad_read>=real_zero)        {            real_zero++;            ad_tare++;        }        else        {            real_zero--;            ad_tare--;        }        num_trn=0;    }    else    {        num_trn++;    }}/**********************************************四舍五入计算*/ulng RoundOff(__IO ulng data1,__IO ulng data2){    ulng result;    ulng remainder;    result=data1/data2;    remainder=data1%data2 ;    if ((remainder*2)>=data2)    {        result++;    }    return (result);}/**********************************************外码计算*/void Dis_Weight(void){    ulng Ovcheck;    ad_dis_calcu();    AD=ad_lcd1;//保存ad码    if(ad_lcd>=real_zero)    {        Ovcheck=ad_lcd-real_zero;    }    else    {        Ovcheck=real_zero-ad_lcd;    }    if(Ovcheck<=((Maxval/Inteval)*10+90))    {        Isol=0;    }    else    {        Isol=1;    }    ad_lcd1=RoundOff(ad_lcd1,10);    ad_lcd1 = ad_lcd1 * Inteval;    if(ad_lcd1==0)    {        ad_nag_flag=0;    }    if (ad_lcd1<=Inteval*3)    {        nag=0;    }    if (ad_lcd1<=20*Inteval)    {        ZeroPass=0;    }}/****************************************皮重计算*/void ad_dis_calcu(void){    if(ad_lcd>=ad_tare)    {        ad_nag_flag=0;        nag=0;        ad_lcd1=ad_lcd-ad_tare;    }    else    {        ad_nag_flag=1;        nag=1;        ad_lcd1=ad_tare-ad_lcd;    }    if(ad_tare>=real_zero)    {        if((ad_tare-real_zero)<5)        {            IsTare=0;        }        else        {            IsTare=1;        }    }    else    {        if((real_zero-ad_tare)<5)        {            IsTare=0;        }        else        {            IsTare=1;        }    }}/********************************************* Description: Argument   : Return     :**********************************************/void Do(){    if(IsStb)    {        Check_Not_Wen();        Zero_Trace();        ad_lcd = ad_read;    }    else    {        Check_Wen();        ad_lcd = ad_read;    }    CheckZero(ad_read);    ad_last=ad_read;}/*********************************************//*******************************置零处理*/void Zero_Pro(void){    //ulng Start_w;    if(stas_s0==0)    {        //Start_w=((Maxval/(ulng)Inteval)*5)/10;//5%        //if ((IsStb)&&(ad_lcd<=(ad_start+Start_w))&&(ad_lcd>=(ad_start-Start_w))&&(!IsTare))       if ((IsStb)&&(!IsTare))  		//	 if (IsStb)        {            ad_tare=ad_tare+(ad_lcd-real_zero);            real_zero=ad_lcd;            Zero_Save();        }        return;    }}/****************************最大去皮量计算*/ulng maxtare(void){    return(Maxval-Inteval);}/****************************去皮处理*/void Tare_Pro(void){    if ((IsStb)&&(stas_s0==0))    {        if ((ad_lcd>=real_zero) && ((ad_lcd-real_zero)<=((maxtare()/Inteval)*10)))        {            ad_tare = ad_lcd;        }    }    if ((IsStb)&&(IsZeroFlag)&&(stas_s0==0))    {        ad_tare = ad_lcd;        real_zero = ad_lcd;        IsTare = 0;    }    if ((IsStb)&&(IsTare)&&(ad_lcd<real_zero)&&(stas_s0==0))    {        ad_tare = real_zero;    }}/*************************************************//*******************************置零处理*/void Zero_Pro1(void){    ulng Start_w;    if(stas_s0==0)    {        Start_w=((Maxval/(ulng)Inteval)*5)/10;//5%        if ((IsStb)&&(ad_lcd<=(ad_start+Start_w))&&(ad_lcd>=(ad_start-Start_w))&&(!IsTare))        {            ad_tare=ad_tare+(ad_lcd-real_zero);            real_zero=ad_lcd;            Zero_Save();        }        return;    }}/************************************重量标定计算*/void fullcalculate(void){    float SpanFull=0;    float spanz1=0;    SpanFull=((float)keyword/(float)Inteval*10);    spanz1=SpanFull;    spanz=(spanz1/((float)ad_sample-(float)ad_zero));    ad_read=adcalculate(ad_zero);				//建立零点    ad_last=ad_read;    ad_lcd= ad_read;    ad_start=ad_read;    ad_tare=ad_read;    real_zero=ad_read;    f_zeroset=1;}/*******************************************标定零位计算*/void zerocalculate(void){    ad_zero=ad_sample;}/************************************AD值计算*/ulng adcalculate(__IO ulng ads){    float adcal=0;    adcal=(float)ads-((float)ad_zero-((float)ZERO/spanz)); // ZERO=500000; ad_zero=500000; spanz=1。2010-01-24    adcal=adcal*spanz;    return((ulng)(adcal+0.5));}/***************************************//**************************************滤波函数*输入:采样值x*输出:返回滤波后的结果值*/ulng EX_QR_Filter(ulng x){    uchar i;    if(ad_ini_flag==0)    {        for(i=0; i<4; i++)        {            Avad[i]=x;            Bvad[i]=x;            Cvad[i]=x;            Dvad[i]=x;            Evad[i]=x;            Fvad[i]=x;            Gvad[i]=x;            Hvad[i]=x;            Ivad[i]=x;            Jvad[i]=x;        }        ad_ini_flag=1;        return(x);    }    else    {        Ad_tol+=x;        Ad_cnt++;        if(Ad_cnt>=AVG_CNT)        {            Avad[3]=Avad[2];            Avad[2]=Avad[1];            Avad[1]=Avad[0];            Avad[0]=Ad_tol/AVG_CNT;            Ad_cnt=0;            Ad_tol=0;        }        else        {            return((ulng)(AD_result+0.5f));        }    }    Bvad[3]=Bvad[2];    Bvad[2]=Bvad[1];    Bvad[1]=Bvad[0];    Bvad[0]=0.1f*Avad[0]+0.2f*Avad[1]+0.3f*Avad[2]+0.4f*Avad[3];    Cvad[3]=Cvad[2];    Cvad[2]=Cvad[1];    Cvad[1]=Cvad[0];    Cvad[0]=0.1f*Bvad[0]+0.2f*Bvad[1]+0.3f*Bvad[2]+0.4f*Bvad[3];    Dvad[3]=Dvad[2];    Dvad[2]=Dvad[1];    Dvad[1]=Dvad[0];    Dvad[0]=0.1f*Cvad[0]+0.2f*Cvad[1]+0.3f*Cvad[2]+0.4f*Cvad[3];    Evad[3]=Evad[2];    Evad[2]=Evad[1];    Evad[1]=Evad[0];    Evad[0]=0.1f*Dvad[0]+0.2f*Dvad[1]+0.3f*Dvad[2]+0.4f*Dvad[3];    Fvad[3]=Fvad[2];    Fvad[2]=Fvad[1];    Fvad[1]=Fvad[0];    Fvad[0]=0.1f*Evad[0]+0.2f*Evad[1]+0.3f*Evad[2]+0.4f*Evad[3];    if (fs[1]==0)        AD_result=Avad[0];    else if (fs[1]==1)        AD_result=Avad[0];    else if (fs[1]==2)        AD_result=Avad[0];    else if (fs[1]==3)        AD_result=Avad[0];    else if (fs[1]==4)        AD_result=Avad[0];    else if (fs[1]==5)        AD_result=Bvad[0];    else if (fs[1]==6)        AD_result=Cvad[0];    else        AD_result=Dvad[0];    return((ulng)(AD_result+0.5f));}/*****************************************************	这是一个延迟函数*/void Delay(__IO uint32_t nCount){    /* __IO 就是volatile, 加上这个后可以避免延迟函数被编译器优化掉 */    for(; nCount != 0; nCount--);}/********************************************************/
 |