📄 pmmain.c
字号:
if(Mode==WATT) Mode=dBm;
else if(Mode==dBm) Mode =WATT;
else Mode=WATT;;
pACK->header=HEADER_L;
pACK->answer=CMD_WATT_OR_DB|Mode;
pACK->valid=VALID;
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
break;
case CMD_DBREF:
Mode=dBREF;
pACK->header=HEADER_L;
pACK->answer=CMD_DBREF|dBREF;
pACK->valid=VALID;
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
break;
case CMD_READSTATE:
pSTATE->header=HEADER_L;
pSTATE->mode_now=Mode;
pSTATE->range_now=Range;
pSTATE->valid=VALID;
pSTATE->tail1=TAIL1;
pSTATE->tail2=TAIL2;
Usart_printf((unsigned char *) pSTATE, sizeof(STATE));
break;
case CMD_READDATA:
pDATA->header=HEADER_L;
pDATA->value=power_value;
pDATA->exp='E';
pDATA->sign='-';
pDATA->n=point_pos-1;
pDATA->mode=WATT;
pDATA->valid=VALID;
pDATA->tail1=TAIL1;
pDATA->tail2=TAIL2;
Usart_printf((unsigned char *) pDATA, sizeof(DATA));
break;
default:
start_remote=FALSE;
pACK->header=HEADER_L;
pACK->answer='E';
pACK->valid='R';//ER 表示出错,数据无效
pACK->tail1=TAIL1;
pACK->tail2=TAIL2;
Usart_printf((unsigned char *) pACK, sizeof(ACK));
break;
}
}
}
///////////////////end usart
};
} //end main
////////////////////////////////////////////////////////////////////
/*****************Initialization*******************************/
void Port_Init(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func7=OUT Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=o State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0xF2;
DDRA=0xff;
// Port D initialization
// Func7=OUT Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=o State6=o State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x80;//dac
DDRD=0xff;
// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0xFF;
DDRE=0xFF;
// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;
// Port G initialization
//all out
PORTG=0xfe;
DDRG=0xff;
}
/*****************Init UNused resource****************************************/
void Init_Unused(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
}
/*********************自动调零***************************/
//该函数有待改进...........................................
//考虑输入为负电压时读入值也为零的情况
BOOL AutoZero(void)
{
unsigned char n;
unsigned int min=100,temp,index_min=117;
//Light_LED(BULB_ZEROING);
#asm("cli");
///////9.20 adjust+++++++++++++++++++++++++++++++++
atten=10000;
Range=RANGE5;
Port_Init();
SPIInit(); //for max1282
SetAtten(atten);
delay_ms(50);
//////////++++++++++++++++++++++++++++++++++++++++++++++++++++++
DacOut(index_min);
delay_ms(5);
temp=FilterAver();//Read_Max1282(MAX1282_CHANNEL[0]);
if(temp<min) min=temp;
delay_ms(20);
for(n=156;n>100;n--)
{
DacOut(n);
delay_ms(5);
temp=FilterAver();//Read_Max1282(MAX1282_CHANNEL[0]);
if(temp<min)
{
min=temp;
index_min=n;
}
//if(n==255) break;
}
DacOut(index_min);
//DacOut(117);/////////////////////
delay_ms(2);
gZeroRef=FilterAver();
Mode=WATT;
#asm("sei");
if(min > 5) return FALSE; //严格讲min ==0 才算调零成功
return TRUE;
}
/*********************自动调零***************************/
//该函数有待改进...........................................
//考虑输入为负电压时读入值也为零的情况
BOOL AutoZero2(void)
{
unsigned char n,i;
unsigned int min=100,temp,index_min=117;
dashPos=0;
//Light_LED(BULB_ZEROING);
///////9.20 adjust+++++++++++++++++++++++++++++++++
atten=10000;
Range=RANGE5;
Port_Init();
SPIInit(); //for max1282
SetAtten(atten);
delay_ms(5);
//////////++++++++++++++++++++++++++++++++++++++++++++++++++++++
#asm("sei");
DacOut(index_min);
delay_ms(5);
for(i=0;i<2*MAX_MID_FILTER;i++)
{
temp=Filter();//0~1000
temp=FilterMid(temp);
}
if(temp<min) min=temp;
for(n=156;n>100;n--)
{
DacOut(n);
delay_us(5);
//temp=FilterAver();//Read_Max1282(MAX1282_CHANNEL[0]);
for(i=0;i<MAX_MID_FILTER;i++)
{
temp=Filter();//0~1000
temp=FilterMid(temp);
}
if(temp<min)
{
min=temp;
index_min=n;
}
//if(n==255) break;
}
DacOut(index_min);
//DacOut(117);/////////////////////
delay_ms(2);
//gZeroRef=FilterAver();
for(i=0;i<MAX_MID_FILTER;i++)
{
gZeroRef=Filter();//0~1000
gZeroRef=FilterMid(gZeroRef);
}
Mode=WATT;
//#asm("sei");
if(min > 5) return FALSE; //严格讲min ==0 才算调零成功
return TRUE;
}
/*********************自动调零***************************/
//该函数有待改进...........................................
//考虑输入为负电压时读入值也为零的情况
BOOL AutoZero3(void)
{
atten=10000;
Range=RANGE5;
//Port_Init();
//SPIInit(); //for max1282
SetAtten3(atten);
//delay_ms(5);
//////////++++++++++++++++++++++++++++++++++++++++++++++++++++++
#asm("sei");
/*
DacOut(index_min);
delay_ms(5);
for(i=0;i<2*MAX_MID_FILTER;i++)
{
temp=Filter();//0~1000
temp=FilterMid(temp);
}
if(temp<min) min=temp;*/
/*
for(n=156;n>100;n--)
{
DacOut(n);
delay_us(5);
//temp=FilterAver();//Read_Max1282(MAX1282_CHANNEL[0]);
for(i=0;i<MAX_MID_FILTER;i++)
{
temp=Filter();//0~1000
temp=FilterMid(temp);
}
if(temp<min)
{
min=temp;
index_min=n;
}
}
*/
return TRUE;
}
//*************[ SPI initialization ]**********************/
void SPIInit(void)
{
// SPI Type: Master
// SPI Clock Rate: 3000.000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
// SPI using Port B
PORTB=0x50;
DDRB=0xb7;
SPCR=0x50;
SPSR=0x00;
}
//*****************[ process data read from MAX1282 ]******************************//
//return :result=0~1250
unsigned int Filter(void)
{
static unsigned int Y0=0;
unsigned char i=0,j=0;
unsigned int tmp=0,aver1=0;
unsigned long int result;
unsigned int X0;
for(j=0;j<16;j++)
{
for(i=0;i<16;i++)
{
tmp=Read_Max1282(MAX1282_CHANNEL[0]);
aver1+=tmp;
}
aver1=aver1>>4;
X0=aver1;
Y0=(9*Y0+X0);//Y0=0.9*Y0+0.1*X0
Y0=Y0/10;
//aver2+=aver1;
}
//aver2=aver2>>4;
//+++++++to VOLTAGE VALUE++++++//
//aver2=aver2*625/1024;
//电压2v的满刻度对应着功率值的满刻度 HERE:2V<-->100.0mW
result=(unsigned long int)Y0;
//result=result*625/1024; //得到实际电压值mV
//?????result=result/2; //功率值mW,uW,根据range范围显示不同小数点位置
//上面被注释的两行改用下面的一行
result=result*625;
result=result>>10;//=/1024
return (unsigned int)result;
}
//+++++++++++++++++++++++++++++++++
//连续次超过 则。。。。
unsigned int Filter2(unsigned int val)
{
unsigned char MAX_CNT=25;
static unsigned char cnt=0;
static unsigned long sum;
++cnt;
sum+=val;
if(cnt<MAX_CNT) return val;
if(cnt==MAX_CNT)
{
cnt=0;
sum=0;
return (unsigned int)(sum/MAX_CNT);
}
/*
static unsigned int last_val=0;
static unsigned int over_cnt=0;
unsigned int diff;
if(val>last_val) diff=val-last_val;
else diff=last_val-val;
if(diff>0) over_cnt++;
else over_cnt=0;
if(over_cnt>=10)
{
last_val=val;
over_cnt=0;
}
return last_val;*/
}
//++++++++++++++++++++++++++++++++++++++++++++
//平均值滤波,返回
unsigned int FilterAver(void)
{
unsigned char i=0,j=0;
unsigned int tmp=0,aver1=0,aver2=0;
unsigned long int result;
for(j=0;j<16;j++)
{
for(i=0;i<16;i++)
{
tmp=Read_Max1282(MAX1282_CHANNEL[0]);
aver1+=tmp;
}
aver1=aver1>>4;
aver2+=aver1;
}
aver2=aver2>>4;
//+++++++to VOLTAGE VALUE++++++//
//aver2=aver2*625/1024;
//电压2v的满刻度对应着功率值的满刻度 HERE:2V<-->100.0mW
result=(unsigned long int)aver2;
result=result*625; //得到实际电压值mV
result=result>>10; //功率值mW,uW,根据range范围显示不同小数点位置
return (unsigned int)result;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//中值滤波
unsigned int FilterMid(unsigned int val)
{
//queue[MAX_MID_FILTER] is globle array for mid-value- filtering
//queue[MAX_MID_FILTER] 是已经从小到大排列好的
unsigned char i,j;
if(val>=queue[MAX_MID_FILTER-1])
{
for(i=0;i<MAX_MID_FILTER-1;i++)
queue[i]=queue[i+1];
queue[MAX_MID_FILTER-1]=val;
}
else if(val<=queue[0])
{
for(i=MAX_MID_FILTER-1;i>0;i--)
queue[i]=queue[i-1];
queue[0]=val;
}
else
for(i=0;i<MAX_MID_FILTER;i++)
{
if(val<=queue[i])
{
for(j=0;j<i-1;j++) queue[j]=queue[j+1];
queue[i-1]=val;
break;
}
}
return queue[MAX_MID_FILTER/2];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//中值滤波
unsigned int Filter3(unsigned int val)
{
//queue2[MAX_MID_FILTER] is globle array for mid-value- filtering
//queue2[MAX_MID_FILTER] 是已经从小到大排列好的
unsigned char i,j;
if(val>=queue2[MAX_MID_FILTER2-1])
{
for(i=0;i<MAX_MID_FILTER2-1;i++)
queue2[i]=queue2[i+1];
queue2[MAX_MID_FILTER2-1]=val;
}
else if(val<=queue2[0])
{
for(i=MAX_MID_FILTER2-1;i>0;i--)
queue2[i]=queue2[i-1];
queue2[0]=val;
}
else
for(i=0;i<MAX_MID_FILTER2;i++)
{
if(val<=queue2[i])
{
for(j=0;j<i-1;j++) queue2[j]=queue2[j+1];
queue2[i-1]=val;
break;
}
}
return queue2[MAX_MID_FILTER2/2];
}
//******************[set gain ]**********************/////////////
void SetAtten(unsigned int atten)
{
EN=1;
switch(atten)
{
case 1://range1
A0=0;
A1=0;
A2=0;
break;
case 10://range2
A0=1;
A1=0;
A2=0;
break;
case 100://range3
A0=0;
A1=1;
A2=0;
break;
case 1000://range4
A0=1;
A1=1;
A2=0;
break;
case 10000://range5
A0=0;
A1=0;
A2=1;
break;
default:break;
}
delay_ms(10);//??????????????到底该延时多少时间
}
void SetAtten3(unsigned int atten)
{
EN=1;
switch(atten)
{
case 1://range1
A0=0;
A1=0;
A2=0;
break;
case 10://range2
A0=1;
A1=0;
A2=0;
break;
case 100://range3
A0=0;
A1=1;
A2=0;
break;
case 1000://range4
A0=1;
A1=1;
A2=0;
break;
case 10000://range5
A0=0;
A1=0;
A2=1;
break;
default:break;
}
//delay_ms(10);//??????????????到底该延时多少时间
}
///***************************************************/
void OverRange(void)
{
Light_LED(BULB_OVERRANGE);
LED_dispDash();
}
//*******************************************************//
void UnderRange(void)
{
Light_LED(BULB_UNDERRANGE);
LED_dispDash();
LED_dispDash();
}
/*********************自动量程切换*************************************/
void AutoRange(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -