📄 dn100_gas-hpiar.c
字号:
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 + -