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

📄 09.05am_dn100_gas.c

📁 用单片机和DSP测量DN100管道的气体流量,使用涡街传感器
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************************************************
//                 MSP430F149
//              ______________________
//          /|\|                 XT2IN|-  
//           | |                      | 4MHz
//           --|RST             XT2OUT|-
//             |                      |
//  sine_sig-->|P6.0/A0            XIN|-
// pulse_sig-->|P1.2/CCIA1            | 32768HZ
//             |                  XOUT|- 
//   KEY1(>)-->|P1.5/TA0              |
//   KEY1(F)-->|P1.6/TA1      P4.0/TB0|-->MCU_OUT    
//   KEY1(^)-->|P1.7/TA2              |
//             |                      |
// DSP_nRST<-->|P2.0/ACLK        P5.0 |<-->HD0
//    nHINT<-->|P2.1/TAINCLK     P5.1 |<-->HD1 
//   HCNTL0<-->|P3.0             P5.2 |<-->HD2
//   HCNTL1<-->|P3.1             P5.3 |<-->HD3 
//   HR/~W <-->|P4.4             P5.4 |<-->HD4 
//      HDS<-->|P4.5             P5.5 |<-->HD5
//     HBIL<-->|P3.2             P5.6 |<-->HD6
//     HRDY<-->|P4.7             P5.7 |<-->HD7
//             |                      |
//      AVCC<--|VeREF+        P6.7/A7 |-->LCD_~CS
//	       |	      P6.6/A6 |-->LCD_~WR
//	       |              P6.5/A5 |-->LCD_DATA
//	       |	              |
//	       |	              |
//******************************************************************************************************

/*******************************************************************************************************
    

     Attention:  The CPU is MSP430F149 [ACLK=32K, MCLK=XT/2=2MHz, SMCLK=XT/2=2MHz]
                
     Function: When power-on, 430 calculate f through CAP(TA CCIA1). When f below 40Hz, FFT instead
               of Pulse-in.
       
               LCD display and pulse output.
                    
     Updated for IAR Embedded Workbench Version: 3.40
                     

  Author: XingJuan
  latest changed: 2006.09.05

                              
********************************************************************************************************/

#include <msp430x14x.h>
#include "dspcode-idle3.h"
#include "Han_win.h"

#define  VERSION          340
#define  DN100_gas_lowlimit   35     // DN100 gas lower limit f = 40Hz
#define  Rectangle_Windows  1        // Rectangle_Windows = 1
#define  DSP_ENTRY        0x2000  
#define  DSP_MAXSIZE      0x5000     // max 0x6000(24k) bytes 

char sysflag;//system flag
int delay;

// Pulse in-out 
int cap_cnt = 0, number = 20;
unsigned int Compare, Newcapture, Oldcapture = 0;
char Taflag=0;
unsigned long int sum;
float cap_n;
float cap[301];
float f = 0.0;
signed char f_cnt = 6;
float fsum[7];
float f_sum, f_ave;

//FFT calculate variable definition
unsigned int result_f, dz, AD_cnt, ADvalue, TB_cnt, ADValue;
unsigned long int power_spc1, power_spc2, power_spc3;
unsigned int TEMP[10];
unsigned int result[4];//存DSP得出的涡街频率值和对应的功率谱最大值及其左右两个谱值
unsigned int fre, fre1, fre2;
float ADtemp, ADfloat;

//HPI variable definition
int res, re_init, re_hpiinit, re_hpicw, re_hpiwrite, re_hpiaw, re_hpidwinc, re_hpidrnew, re_cal;


//lcd variable definition
int addr_buffer, buffer, count;
unsigned long int view;
unsigned long int re2;
char asc[8];//整型数数对应的8位ASCII码数组
char dis_up[6];//上排显示寄存器
char dis_down[8];//下排显示寄存器
const char addr_up[6]={0x0F,0x11,0x13,0x15,0x17,0x19};
const char addr_down[8]={0x0A,0x08,0x06,0x04,0x02,0x00,0x1C,0x1E};
const char downseg[11]={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED,0x00};
const char upseg[11]={0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x00};


//delay subprogram
void msdelay(int);//msdelay: 1ms * n

//initialization program
void MSP430Init(void);//系统初始化子程序

//display program
void Disp_Init(void);
void wrcommand(void);   // 写命令
void wr_act(void);      // 上升沿控制
void wrdata(void);      // 写数据
void int_ascii(void);   // 将整型数转化为用于显示的ASC
void updisp(void);      // 液晶上排显示程序
void downdisp(void);    // 下排液晶显示程序

//HPI program
int HPI_Init(void);//上电后430初始化DSP的HPI接口
int HPI_reset(void);//430 offers a 200ms reset to DSP untill testing the HDRY=1
int HPI_chkrdy(void);// check the HPI ready?
int hpi_write(unsigned long, char*, unsigned long);//430通过HPI口向DSP装载DSP的运行代码
int hpi_run(void);
int hpic_w(unsigned int);
int hpia_w(unsigned int);//将430即将访问DSP的地址写入HPIA寄存器
int hpid_w_inc(unsigned int);
unsigned int hpid_read(void);//430读取HPID寄存器数据,HPIA寄存器值自动加1

//system subprogram
void Pulse_calculate(void);
void FFT_calculate(void);
void Output(float);

//ADC12 initialization program
void ADC12_Init(void);


/*---------------------主程序启动-----------------------*/
void main(void)
{ 
  
  WDTCTL=WDTPW+WDTHOLD;          // STOP WDT
  
  MSP430Init();
  
//  _EINT();                       // 打开全局中断
   
  while(1)
  {
     switch(sysflag)
     {
       case 1:
          Pulse_calculate();
       break;
       case 2:
          FFT_calculate();
       break;
       default:
       break;
     }
  }
}


//---------------------system initialization----------------------------------
void MSP430Init(void)
{ 
   int i;
   
  /*-------------------------------Osc initialize-------------------------  
    Purpose:  
              ACLK <- XT1, DIVA =1
              MCLK <- XT2, DIVM =2
              SMCLK <- XT2, DIVS =2
    Note:     XT1=32768Hz, XT2 = 4MHz
  ----------------------------------------------------------------------------*/ 
   
  IE1 =0x00;                         // disabel Oscillator fault interrupt 
  BCSCTL1=0x00;                      // set XT2ON
  BCSCTL2=0x9A;                      // MCLK=SMCLK=4MHz/2=2MHz
                                     // 等待时钟源转换完成
  do{
    IFG1 &= ~OFIFG;
    for(i=0;i<100;i++);              // delay 50uS
  }while(IFG1&OFIFG);                // 查OSCFault,为0时转换完成   


 /*---------------port initialize---------------*/  
  
//  P1IES &= 0x1F;       // P1.5~P1.7 key input interrupt by L-H drop
//  P1IE  |= 0xE0;       // enable interrupt 
//  P1IFG &= 0x1F;       // clear interrupt flag
  P1DIR = 0x1B;
  P1OUT|= 0x1B;
  P2DIR = 0xFC;         // P2.0:DSPnRST, P2.1:nHINT(DSP向430申请中断) are input  
  P2IES|= 0x80;        //set falling edge as interrupt ,by hyq
  P2IE |= BIT7;        // enable the interrupt from DSP
  P3DIR = 0xFF;        // P3.0-3.7 unused
  P3OUT = 0; 
  P4DIR = 0xFF;        // P4.7 HRDY, P4.5 HDS, P4.4 HRnW
  P4OUT = 0;
  P5DIR = 0xFE;        // HD0-HD7   
  P5OUT = 0;
  P6DIR = 0xFE;        // P6.5=DATA; P6.6=~WR; P6.7=~CS 
                       // P6.0:vortex sine-signal input
  P6OUT|= 0xFE;


/*---------------LCD initialize---------------*/  
  
  Disp_Init();  
  view=0;                            
  int_ascii(); 
  updisp();
  downdisp();
  
  
/*---------------system variable initialize---------------*/    
  sysflag=1;              // clear system flag

}


//***********---------------- 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();
} 

void msdelay(int n)                  //mdelay: 1ms * n(MCLK: 4MHz)
{
  unsigned int i, mdelay;
  for(i=0;i<n;i++)
    for(mdelay=0; mdelay<200; mdelay++);
}


int HPI_Init(void)
{
  P5DIR &= ~BIT0;                         // HRDY input	
  
  re_hpiinit = HPI_reset();               // reset DSP for 20ms
  if(re_hpiinit!=0) return -1;
  
/*----------------------HPIC: BIT0=BOB=1->首先传输的字节是低8位,
            BIT3=HINT=1->此位是DSP向430申请中断位,430通过向其写0实现0--------------------*/
  
  re_hpiinit = hpic_w(0x0909);            // 向HPIC写入09字节两遍
  if(re_hpiinit!=0) return -1;

  return 0;
}   

int HPI_reset(void)                       // 430 offers a 20ms reset to DSP untill testing the HDRY=1
{
  int j=0;

  P2DIR|=BIT0;                            // P2.0:DSP_nRST=OUTPUT
  do{
       P2OUT|=BIT0;
       msdelay(50); 
       
       P2OUT&=~BIT0;                      // reset DSP
       msdelay(200);                      // delay: 0.1ms*20=20ms
   
       P2OUT|=BIT0;
       msdelay(50);      
                                          // wait untill HRDY=1
       if((P5IN&BIT0)!=0) break;
       j++;
    }while(((P5IN&BIT0)==0)&&(j<10));  
  if(j==10)
    return -1;
  else
    return 0;
}


int hpic_w(unsigned int val)
{
  P4DIR = 0xFF; //output

  //hpic <- val
  P5OUT |= BIT4;  //~HDS=1
  P5OUT &= ~(BIT5+BIT6+BIT7);//HCNT0=HCNT1=HR/~W=0
  P5OUT &= ~BIT3; //HBIL=0
  P5OUT &= ~BIT4;  //~HDS=0
  P4OUT = (char)val;
  for(delay=0;delay<10;delay++);
  P5OUT |= BIT4; //~HDS1=1
  re_hpicw = HPI_chkrdy();

⌨️ 快捷键说明

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