特别排序法:适用于中断读取AD值,并且去掉数个大值和小值,然后求和。
/******************************************************************************** *
* 中断法读取16位差分AD采样值,去除多个大值和小值,并且求和 *
* *
* 仿真软件: IAR Embedded Workbench Evaluation for MSP430 V3.42 *
* 优化前:大约500-400步左右;优化后:大约300-200步(均采用编译器自带的优化功能) *
* *
* 苦力:李勇 QQ:78205173 E-mail:lihuyong#163.com / #gmail.com *
* *
* 希望这个程序不能够帮到你,只有这样,你才有可能不会成为苦力. *
* *
* 你可以自由传播这段代码(在不删除我的联系方式和寻人启事的前提下) *
* *
* 寻人启事 *
* *
* 有谁知道"2001入学的中国政法大学的法律自考生-白雪"的联系方式,请联系我,必谢 *
* *
*******************************************************************************/
#include "stdlib.h"
#define ADC_SAMPLING_BUF_SIZE 40
#define ADC_DROP_NUM 4
signed int iAdcResult;
unsigned char ucSamplingCount;
unsigned int SD16IV = 2; // 无意义,主要是方便我自己
signed int iAdcMaxBuf;
signed int iAdcMinBuf;
volatile signed int iResult;
volatile signed long lSum;
main( void )
{
unsigned char i;
signed int iTemp;
for( i = 0; i < ADC_SAMPLING_BUF_SIZE; i++ )
{
iAdcResult = ( signed int )rand() - 16384;
}
i = ( unsigned char )lSum;
while( 1 )
{
iResult = iAdcResult; // 模拟ADC读入数据
if( SD16IV == 2 ) // 只使用了A0通道
{
if( ucSamplingCount == 0 ) // 初始化
{
lSum = 0;
for( i = 0; i < ADC_DROP_NUM; i++) // 可以用代码量换时间
{
iAdcMaxBuf = -32768;
iAdcMinBuf = 32767;
}
}
iAdcMaxBuf = iResult; //将本次采样塞进去
iAdcMinBuf = iResult;
lSum = lSum + iResult;
for( i = ADC_DROP_NUM; i > 0; i-- ) // 可以用代码量换时间
{
if( iAdcMaxBuf > iAdcMaxBuf) // 排列最大的几个值
{
iTemp = iAdcMaxBuf;
iAdcMaxBuf = iAdcMaxBuf;
iAdcMaxBuf = iTemp;
}
if( iAdcMinBuf < iAdcMinBuf) // 排列最小的几个值
{
iTemp = iAdcMinBuf;
iAdcMinBuf = iAdcMinBuf;
iAdcMinBuf = iTemp;
}
}
ucSamplingCount++;
if( ucSamplingCount == ADC_SAMPLING_BUF_SIZE )
{
ucSamplingCount = 0;
for( i = 0 ; i < ADC_DROP_NUM; i++ )
{
lSum = lSum - iAdcMaxBuf - iAdcMinBuf;
}
// 此行大概450步,建议弄在主程序
lSum = lSum / ( ADC_SAMPLING_BUF_SIZE - ADC_DROP_NUM * 2);
}
}
}
} 主要是自己想弄压力变送器,AD采样率为4096次/秒,打算采集40次,然后丢弃最大的4个和最小的4个,然后求平均值…… 这个收下了,谢谢,白雪是你的啥人子呀~~~帮顶 正愁AD转换的值不准确呢,借鉴。 顶一下 找到人了没,楼主 不错啊!哈哈哈
页:
[1]