问傻孩子,关于《深入浅出avr单片机》书中ad的滑动窗口均值滤波法
问题如下:假设上述程序第一次运行,s_wADCBuffer数组中只有s_wADCBuffer有数值,其他都为0(或者s_wADCBuffer数组中至少有一个为0),那么计算总和后,再右移ADC_BUFF_SIZE_BIT_COUNT位之后,结果不是就不对了吗?
下面为源程序:
//全局变量声明
unsigned int g_wADValue; //用于保存结果的变量
void Insert_ADC_Isr_Code(unsigned int ADCValue)
{
static unsigned int s_wADCBuffer;
static unsigned char s_cBufferCounter = 0;
unsigned long s_dTotal; //注意这里,不再需要静态类型了
unsigned char n = 0;
//将A/D采样值加入到数组中
s_wADCBuffer = ADCValue;
//计算总和
s_dTotal = 0;
for (n = 0;n < ADC_BUFF_SIZE;n++)
{
s_dTotal += s_wADCBuffer;
}
//计算平均值,并输出到一个固定的变量中
g_wADValue = (unsigned long)s_dTotal >>ADC_BUFF_SIZE_BIT_COUNT;
s_cBufferCounter++;
//判断队列指针是否达到边界
if (s_cBufferCounter == ADC_BUFF_SIZE)
{
//队列指针到达边界,清零
s_cBufferCounter = 0;
}
} //End Of Insert_ADC_Isr_Code 前面几次数据都是无效的 回复【1楼】Gorgon Meducer 傻孩子
前面几次数据都是无效的
-----------------------------------------------------------------------
可是你的程序中并没有体现出来吧? 不好意思哈……不过我当时认为这是显而易见的……下次我加一个旁批。谢谢您的反馈。 回复【3楼】Gorgon Meducer 傻孩子
不好意思哈……不过我当时认为这是显而易见的……下次我加一个旁批。谢谢您的反馈。
-----------------------------------------------------------------------
不好意思,我脑子愚笨,我不明白你说的“前面几次数据都是无效的 ”,到底你的程序是如何实现“前面几次数据都是无效的 ”?能给我讲解一下吗? 所谓前几次数据无效意思就是,你直接丢弃前几次数据就可以了。 回复【5楼】Gorgon Meducer 傻孩子
所谓前几次数据无效意思就是,你直接丢弃前几次数据就可以了。
-----------------------------------------------------------------------
哦,那就是这个缓冲区不存满的话,算出来的数据无效,那最好还是加一个存满标志,当存满时才允许读数据,不知道我的理解对不对? 呵呵,别太较真,实际使用的时候往往不在乎前面的几个数据。 回复【7楼】Gorgon Meducer 傻孩子
呵呵,别太较真,实际使用的时候往往不在乎前面的几个数据。
-----------------------------------------------------------------------
哦,呵呵,领悟了! 滑动窗口均值滤波法要求被采集对象变化不是很快;若主程序中还有其他任务需要占用较多的时间,则用查询方式并不适合,会出现“反应迟钝”现象,而中断方式相对来说要好些~~^_^ to 【9楼】 Notting_Hill 半壶水
您说的对的,不过这个帖子没有讨论使用查询还是中断,而且原书的例子用的就是中断。
——特此吐槽 mark 做下笔记!
页:
[1]