/*******************************************************************************
* *
* 中断法读取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[ADC_SAMPLING_BUF_SIZE];
unsigned char ucSamplingCount;
unsigned int SD16IV = 2; // 无意义,主要是方便我自己
signed int iAdcMaxBuf[ADC_DROP_NUM + 1];
signed int iAdcMinBuf[ADC_DROP_NUM + 1];
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[ucSamplingCount]; // 模拟ADC读入数据
if( SD16IV == 2 ) // 只使用了A0通道
{
if( ucSamplingCount == 0 ) // 初始化
{
lSum = 0;
for( i = 0; i < ADC_DROP_NUM; i++) // 可以用代码量换时间
{
iAdcMaxBuf = -32768;
iAdcMinBuf = 32767;
}
}
iAdcMaxBuf[ADC_DROP_NUM] = iResult; //将本次采样塞进去
iAdcMinBuf[ADC_DROP_NUM] = iResult;
lSum = lSum + iResult;
for( i = ADC_DROP_NUM; i > 0; i-- ) // 可以用代码量换时间
{
if( iAdcMaxBuf > iAdcMaxBuf[i-1]) // 排列最大的几个值
{
iTemp = iAdcMaxBuf[i-1];
iAdcMaxBuf[i-1] = iAdcMaxBuf;
iAdcMaxBuf = iTemp;
}
if( iAdcMinBuf < iAdcMinBuf[i-1]) // 排列最小的几个值
{
iTemp = iAdcMinBuf[i-1];
iAdcMinBuf[i-1] = 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);
}
}
}
}转载
|