今天用stm8s105(其他类型的mcu没试过),编译器用IAR for stm8. 取ADC的转换值,中值滤波(连续读取6次ADC转换值,然后按大小排序,去掉最大的,去掉最小的,去中间值的算术平均值),代码如下:
unsigned char i,j;
unsigned int temp,F_result;
unsigned int Table[6];
unsigned long buf;
unsigned char AD_channel_result[5];
unsigned int result;
for(i=0;i<6;i++) Table[i]=*(table+i);
//测试中值滤波算法是否正确
// Table[0]=15; Table[1]=0;Table[2]=4; Table[3]=3;Table[4]=20; Table[5]=2;
//Table[0]=1; Table[1]=50000;Table[2]=50000; Table[3]=20000;Table[4]=40000; Table[5]=65000;
//Table[0]=1; Table[1]=535;Table[2]=5000; Table[3]=20000;Table[4]=40000; Table[5]=65000;
//Table[0]=1; Table[1]=536;Table[2]=5000; Table[3]=20000;Table[4]=40000; Table[5]=65000;
for(i=0;i<6;i++)
{
for(j=i;j<6;j++)
{
if(Table[i]>=Table[j])
{
temp=Table[i];
Table[i]=Table[j];
Table[j]=temp;
}
}
}
//去掉最大最小值
//for(i=0;i<6;i++) buf=buf+Table[i];
// buf =buf>>2;
F_result=(Table[1]+Table[2]+Table[3]+Table[4])/4;//和超过65535溢出
//F_result=((32768+32769+32780+32781)/4);
//F_result=((Table[1]+Table[2])>>1);
//F_result=(Table[1]+Table[2]+Table[3]+Table[4])/4;
#if 1
Uart_Send_String("开始\r\n");
for(i=0;i<6;i++)
{
//result=Table[i];
result=F_result;
//result=buf;
//result=60000*4/4;
AD_channel_result[0] = result/10000+0x30; //ASCII编码 0x30对应的是数字 0
AD_channel_result[1] = (result%10000)/1000+0x30; //ASCII编码 0x30对应的是数字 0
AD_channel_result[2] = (result%1000)/100+0x30;
AD_channel_result[3] = (result%100)/10+0x30;
AD_channel_result[4] = result%10+0x30;
Uart_Send_Data(AD_channel_result[0]);
Uart_Send_Data(AD_channel_result[1]);
Uart_Send_Data(AD_channel_result[2]);
Uart_Send_Data(AD_channel_result[3]);
Uart_Send_Data(AD_channel_result[4]);
Uart_Send_String("\r\n");
}
Uart_Send_String("结束\r\n");
#endif
return F_result;
代码如上,(Table[1]+Table[2]+Table[3]+Table[4]之和大于65535就开始出错,我测试过和等于65536,开始出错,感觉好像是计算值溢出,但我并不知道怎么处理。如果 F_result=((32768+32769+32780+32781)/4);串口发送的计算结果并不会错,应该是IAR编译前已经计算好了的缘故吧。请懂的朋友指点指点,计算机水平太差,自己找不到解决办法,度娘过来没结果,希望能在伟大的二姨上找到答案,感谢感谢!
|