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

📄 dn100_gas-hpiar.c

📁 用单片机和DSP测量DN100管道的气体流量,使用涡街传感器
💻 C
📖 第 1 页 / 共 2 页
字号:
        hpid_w_autoinc(ADValue);
        AD_cnt++;       
      }
      else                            // >1024 FFT start DSP 
      {                 
        ADC12CTL0 &=~ENC;             // ENC=0时可以配置 
        TACTL &=~MC_1;                // Stop TimerB
        AD_cnt=0;        
        re_cal = hpi_run();  
        for(long int i=0;i<40000;i++) i=i;        
        dz=0x3C00;          
        re_cal = hpia_w(dz);         
        msdelay(1);
        for(int i=0;i<8;i++)
        {
           result[i/2]=hpid_R_autoinc();
           i++;
        result_f=result[0];
        power_spc1=(unsigned long int)result[1];
        power_spc2=(unsigned long int)result[2];
        power_spc3=(unsigned long int)result[3];
             
        result_f=result_f-1;
        re2=(unsigned long int)result_f;
        re2=re2*1000;
        fre1=re2;
          
        if(Rectangle_Windows)          //  Rectangle_Windows power-spectrum correction
        {
           if(power_spc1<=power_spc3)
           {
              re2 = power_spc2 + power_spc3;
              fre2 = power_spc3*1000/re2;
              fre = fre1 + fre2;
           }
           else
           {
              re2 = power_spc2 + power_spc1;
              fre2 = power_spc1*1000/re2;
              fre = fre1 - fre2;
           }
        }
        else                           //  Hannning_Windows power-spectrum correction
        {
           if(power_spc1<=power_spc3)
           {
              re2 = 2*power_spc3 - power_spc2;
              fre2 = re2*1000/(power_spc3 + power_spc2);
              fre = fre1 + fre2;
           }
           else
           {
              re2 = 2*power_spc1 - power_spc2;
              fre2 = re2*1000/(power_spc2 + power_spc1);
              fre = fre1 - fre2;
           }
        }    
        
        view=fre;
        int_ascii();
        updisp();
        
        f_ave = fre/1000.0;
    //    Output(f); 
        if(f_ave>DN100_gas_lowlimit)
        {
          sysflag=3;
          ADC12CTL0=0;
          P2SEL&=~BIT3;      
          CCR0=0;
          CCR1=0;
          CCTL1=0;
          TACTL=0;
        }
            
       break;

      }
   }
}

//-------------------------- Pulse_calculate -------------------------------------
void Pulse_calculate(void)
{
  //  number = 20;
  f_cnt=5;
  
  P1SEL |= BIT2;                          // P1.2 option select
  P1DIR = 0x1B;                           // P1.2 vortex pulse signal input                       
  CCTL1 = CM_1 + CCIS_0 + CAP + CCIE;     // Capture on rising edge, CCI1A, CAP
  TACTL =TASSEL_2 + ID_3 + MC_2 + TACLR;  // SMCLK, 1/4Smclk = 500KHz, Continuous mode, clear
  _EINT();                       // 打开全局中断  
  
  while(sysflag==1)
  {
     _BIS_SR(LPM1);            // Enter LPM1 w/ interrupt
     
     while(Taflag==1)
     {
//        _DINT();
        Taflag=0;
        sum=0;
        cap_cnt=0;

        for(int i=1;i<number+1;i++)  // calculate average f
        {
	  sum+=cap[i];
        }
        cap_n=sum/number;
        f = 250000.0/cap_n;
   
        if(f>1500.0)                    // change cap number
        {
          number = 300;
        }
        else if(f>1000.0){
          number = 250;
        }
        else if(f>800.0){
          number = 200;
        }
        else if(f>600.0){
          number = 150;
        }
        else if(f>400.0){
          number = 100;
        }
        else if(f>200.0){
          number = 50;
        }
        else
        {
          number = 20;
        }   
        
        fsum[f_cnt] = f;
        f_cnt--;
        
        if(f_cnt<=0)
        {
           f_sum=0;
           for(int i=5;i>0;i--)
           {
             f_sum+=fsum[i];
           }
           f_ave = f_sum/5.0;
          
           re2=(unsigned long int)(f_ave * 1000);
           view=re2;                   // LCD display frequency         
           int_ascii(); 
           updisp();  
        //   Output(f);                // Pulse output     
   
           if(f_ave<DN100_gas_lowlimit)
           {
              sysflag=2;
              TACTL|=MC_0;
              break;
           }
           else
           {
             f_cnt=5;
             CCTL1 = CM_1 + CCIS_0 + CAP + CCIE;     // Capture on rising edge, CCI1A, CAP 
           //  _EINT();
           }
        }
        CCTL1 = CM_1 + CCIS_0 + CAP + CCIE;     // Capture on rising edge, CCI1A, CAP 
        
     } // while(Taflag==1)

  }
}
/*
***********---------------- Pulse output--------------**********************
void Output(float f)                       // 脉冲输出子程序(脉冲输出函数)
{  
   long int a;
   P4DIR |= 0x01;                          // P4.0 output
   P4SEL |= 0x01;                          // P4.0 option select
   TBCCTL0 = OUTMOD_4;                     // CCR0 toggle mode
   if(f>100)
   { 
      a=2000000/(2*f);
      TBCTL = TBSSEL_2 + MC_1;             // SMCLK, up mode
   }
   else
    { 
      a=32768/(2*f);
     TBCTL = TBSSEL_1 + MC_1;              // ACLK, up mode
    }
   TBCCR0 = a-1;
}
*/

/*-----------ADC12 initialize, Single Channel Rpt Mode, TA1 as Sample Trigger at 1000Hz(1ms)----------*/     
void ADC12_Init(void)
{
/*	
  ADC12CTL1 = SHS_1 + SHP + CONSEQ_2;                 // TA trig., rpt conv.
  ADC12MCTL0 = SREF_1 + INCH_10;                      // Channel A10, Vref+
  ADC12IE = 0x01;                                     // Enable ADC12IFG.0          
  ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC;  // config ADC12
  TACCTL1 = OUTMOD_4;                                 // Toggle on EQU1 (TAR = 0)
  TACTL = TASSEL_2 + MC_2;                            // SMCLK, cont-mode
	*/
	
   P6DIR &=~BIT0;
   P6SEL |= 0x01;                            // select A0 as input
   ADC12CTL0 = ADC12ON + SHT0_1;             // Setup ADC12
   ADC12CTL1 = SHP + CONSEQ_2 + SHS_1;       // Timer triggers sampling, ADC12OSC
   ADC12MCTL0 = 0x00;                        // choose A0 as input
   ADC12IE = 0x0001;                         // Enable ADC12IFG.0
   
   P2SEL |= BIT3;                            // Set for TimerA1
   P2DIR |= BIT3;

   TACCR0 = 32;                              // Init TACCR0 w/ sample prd=CCR0+1
   TACCR1 = 16;                              // Trig for ADC12 sample & convert
   TACCTL1 = OUTMOD_3;                       // Set/reset
   TACTL = TACLR + TASSEL_1;                 // ACLK, clear TAR
}


//------------------- Timer A0 interrupt service routine------------------------
#if VERSION>126
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
#else
interrupt[TIMERA1_VECTOR] void Timer_A(void)
#endif
{
    CCTL1&=~CCIFG;                          // clear CCI1A interrupt flag
    Newcapture = TACCR1;                    // Get current captured Pulse 
    Compare = Newcapture - Oldcapture;         // Pulse difference
    Oldcapture = TACCR1;                    // Save current captured Pulse
    cap[cap_cnt]=Compare;
    cap_cnt++;                                        
    if(cap_cnt>number)                                                                                                       
    { 
      CCTL1 = 0;
      Taflag= 1;
   }

    LPM1_EXIT;                              // Exit LPM1                
}


/**************************************************************************************
函数原型: void ADC12(void)
函数功能: ADC12中断服务子程序,将采样结果存放到变量ADvalue中
调用函数:无
入口参数: 无
出口参数: 无
***************************************************************************************/ 
#if VERSION>126
#pragma vector=ADC_VECTOR
__interrupt void ADC12(void)
#else
interrupt[ADC_VECTOR] void ADC12(void)
#endif
{
   ADvalue = ADC12MEM0;             // Move results
   
   LPM3_EXIT;//Exit LPM3
}



//***********---------------- LCD display ----------------**********************
void Disp_Init(void)
{ 
    P6OUT|=BIT7;                     // ~CS=1 reset 
    for(delay=0;delay<100;delay++);
    buffer=0x00;
    wrcommand();
    buffer=0x29;                     // 上电初始化命令专用模块
    wrcommand();
    buffer=0x18;                     // 定义内部振荡器工作
    wrcommand();
    buffer=0x01;                     // 开振荡器
    wrcommand();
    buffer=0x03;                     // 开显示器
    wrcommand(); 
    addr_buffer=0x1B;                // 显示Q标志
    buffer=0x08;
    wrdata();  
}

void wrcommand(void)                 // LCD写命令
{  
   P6OUT&=~BIT7;                     // ~CS=0
   P6OUT|=BIT5;                      // DATA=1
   wr_act(); 
   P6OUT&=~BIT5;                     // DATA=0
   wr_act(); 
   P6OUT&=~BIT5;                     // DATA=0
   wr_act();
   for(count=0;count<8;count++)
   {
	if((buffer&0x80)==0x80)
	  P6OUT|=BIT5;
        else P6OUT&=~BIT5;
	wr_act(); 
	buffer<<=1;
   }
   P6OUT&=~BIT5;                     // DATA=0
   wr_act(); 
   P6OUT|=(BIT7+BIT6+BIT5);          // ~CS=1,~WR=1,DATA=1
}

void wr_act(void)
{
   P6OUT&=~BIT6;
   for(delay=0;delay<10;delay++);
   P6OUT|=BIT6;              
   for(delay=0;delay<10;delay++);
}

void wrdata(void)                    // LCD写数据程序
{ 	 	
        P6OUT&=~BIT7;                // CS=0,使能液晶
	P6OUT|=BIT5;     /*1*/      
        wr_act(); 	
	P6OUT&=~BIT5;   /*0*/
	wr_act(); 
	P6OUT|=BIT5;   /*1*/
	wr_act(); 
        P6OUT&=~BIT5;  /*0*/
	wr_act(); 
	
	addr_buffer<<=3;             // 左移三位,低五位有效
	for(count=0;count<5;count++)
	  {	    
		if((addr_buffer&0x80)==0x80)
		P6OUT|=BIT5;
		else P6OUT&=~BIT5;
		wr_act(); 
		addr_buffer<<=1;
	   }
	for (count=0;count<8;count++)
	  {
		if((buffer&0x01==0x01))
		P6OUT|=BIT5;
		else P6OUT&=~BIT5;
		wr_act(); 
		buffer>>=1;
	   }
	P6OUT|=(BIT7+BIT6+BIT5);      // ~CS=1,~WR=1,DATA=1
}
 
void int_ascii(void)            //将整型数转化为用于显示的ASCII
{
  int i;
  unsigned long int view_temp;
  for(i=0;i<8;i++)
  {
     view_temp=view/10;
     asc[i]=view-view_temp*10;  //求余数
     view=view/10;
  }
  for(i=0;i<6;i++)
  {
     dis_up[i]=asc[i];
  }  
  for(i=0;i<8;i++)
  {
     dis_down[i]=asc[i];
  }  
}

void updisp(void)                //上排液晶显示程序
{
        int t;
        addr_buffer=addr_up[0];  //显示上排第0位
        t=dis_up[0]; 
	buffer=upseg[t];
	wrdata();

        addr_buffer=addr_up[1];  //显示上排第1位
        t=dis_up[1]; 
	buffer=upseg[t];
	wrdata();  
	
	addr_buffer=addr_up[2];  //显示上排第2位
        t=dis_up[2]; 
	buffer=upseg[t];
	wrdata();

	addr_buffer=addr_up[3];  //显示上排第3位
        t=dis_up[3]; 
	buffer=upseg[t];
	buffer|=0x08;
	wrdata();
	
	addr_buffer=addr_up[4];  //显示上排第4位
        t=dis_up[4]; 
	buffer=upseg[t];
	wrdata();

	addr_buffer=addr_up[5];  //显示上排第5位
        t=dis_up[5]; 
	buffer=upseg[t];
	wrdata();
}

void downdisp(void)//下排液晶显示程序
{
        int t;
        addr_buffer=addr_down[0];//显示下排第0位
        t=dis_down[0]; 
	buffer=downseg[t];
	wrdata();

	addr_buffer=addr_down[1];//显示下排第1位
        t=dis_down[1]; 
	buffer=downseg[t];
	wrdata();
	
	addr_buffer=addr_down[2];//显示下排第2位
        t=dis_down[2]; 
	buffer=downseg[t];
	wrdata();

	addr_buffer=addr_down[3];//显示下排第3位
        t=dis_down[3]; 
	buffer=downseg[t];
	wrdata();

	addr_buffer=addr_down[4];//显示下排第4位
        t=dis_down[4]; 
	buffer=downseg[t];
	wrdata();

	addr_buffer=addr_down[5];//显示下排第5位
        t=dis_down[5]; 
	buffer=downseg[t];
	wrdata();
 
	addr_buffer=addr_down[6];//显示下排第6位
        t=dis_down[6]; 
	buffer=downseg[t];
	wrdata();
	
	addr_buffer=addr_down[7];//显示下排第7位
        t=dis_down[7]; 
	buffer=downseg[t];
	wrdata();
} 

⌨️ 快捷键说明

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