📄 sd16-adc.c
字号:
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
unsigned int data_Nf=0;
unsigned int data_Ng=0;
result_Nf_1 = result_Nf; //保留前次采集数据
result_Ng_1 = result_Ng;
if(flag == 0x03) //信号输入校准
{
result_Ng = SD16MEM0; // 读取数据
result_Ng_buf = result_Ng;
}
else if(flag == 0x06) //校零校满状态
{
result_Nf = SD16MEM0; // 读取数据
result_Nf_buf = result_Nf;
}
else //其它状态:远程,就地等
{
switch (SD16IV)
{
case 2: // SD16MEM Overflow
break;
case 4: // SD16MEM0 IFG
{
Input_Channel++;
if(Input_Channel > 2)
{
Input_Channel = 1;
}
switch(Input_Channel)
{
case 1:
{
result_Nf = SD16MEM0; // 读取数据
result_Nf_buf = result_Nf;
SD16INCTL0 = SD16INTDLY_0+SD16INCH_1; //转换为差分通道A1
SD16AE = SD16AE1;
}
break;
case 2:
{
result_Ng = SD16MEM0; // 读取数据
result_Ng_buf = result_Ng;
SD16INCTL0 = SD16INTDLY_0; // 转换为差分通道A0
SD16AE = SD16AE0;
}
break;
default:
{
result_Nf = SD16MEM0;
result_Nf_buf = result_Nf;
SD16INCTL0 = SD16INTDLY_0; // 转换为差分通道A0
SD16AE = SD16AE0;
}
}
}
break;
}
}
data_Nf = abs(result_Nf-result_Nf_1);
data_Ng = abs(result_Ng-result_Ng_1);
if(data_Nf<20) //采集数据值在正常波动范围内是数据不变化
{
result_Nf = result_Nf_1; //采用原来的数值
}
if(data_Ng<20)
{
result_Ng = result_Ng_1;
}
result_Nf = 0.25*result_Nf_1 + 0.75*result_Nf; //阀位反馈采集量
result_Ng = 0.25*result_Ng_1 + 0.75*result_Ng; //阀位给定采集量 递推滤波
result_Ng = result_Ng>(Ng_max)?Ng_max:result_Ng; //限值 <Ng_max
if(result_Ng >= (Ng_max-100))
result_Ng = Ng_max;
result_Ng = result_Ng>(Ng_min)?result_Ng:Ng_min; //限值 >Ng_min
if(result_Ng <= (Ng_min+100))
result_Ng = Ng_min;
result_Nf = result_Nf>(Nf_max)?Nf_max:result_Nf; //限值 <Nf_max
if(result_Nf >= (Nf_max-100))
result_Nf = Nf_max;
result_Nf = result_Nf>(Nf_min)?result_Nf:Nf_min; //限值 >Nf_min
if(result_Nf <= (Nf_min+100))
result_Nf = Nf_min;
/**/
if(flag == 6) //校零校满状态时反馈最大值/最小值可调
{
if((result_Nf_buf<(Nf_min-100))&&(result_Nf_buf>0))
{
result_Nf = result_Nf_buf;
Nf_min = result_Nf;
}
else if((result_Nf_buf>(Nf_max+100))&&(result_Nf_buf<32760))
{
result_Nf = result_Nf_buf;
Nf_max = result_Nf;
}
}
if(flag == 3) //输入信号校准状态时给定最大值/最小值可调
{
if((result_Ng_buf<(Ng_min-100))&&(result_Ng_buf>0))
{
result_Ng = result_Ng_buf;
Ng_min = result_Ng;
}
else if((result_Ng_buf>(Ng_max+100))&&(result_Ng_buf<32760))
{
result_Ng = result_Ng_buf;
Ng_max = result_Ng;
}
}
Nf_1 = Nf;
Nf = (unsigned int)(((float)(result_Nf - Nf_min)/(float)(Nf_max - Nf_min))*10000);//得到阀位反馈万分比
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -