|
发表于 2015-1-26 11:11:54
|
显示全部楼层
大神~请教你一个关于你的程序校正磁力计的一个小小的疑问.麻烦大神有时间能抽空解答下~O(∩_∩)O~~
在QCopterFC_it.c 127行开始会有一段校正程序,期间会有LED_B作为一个状态指示灯~
疑问一: 为什么会有 八组CASE? 分别测量些什么数据?如何操作~
- switch((u16)(Correction_Time/600)) {
- case 0:
- LED_B = 0;
- MagDataX[0] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[0] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 1:
- LED_B = 1;
- MagDataX[1] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[1] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 2:
- LED_B = 0;
- MagDataX[2] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[2] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 3:
- LED_B = 1;
- MagDataX[3] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[3] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 4:
- LED_B = 0;
- MagDataX[4] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[4] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 5:
- LED_B = 1;
- MagDataX[5] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[5] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 6:
- LED_B = 0;
- MagDataX[6] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[6] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- case 7:
- LED_B = 1;
- MagDataX[7] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[7] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
- default:
- LED_B = 1;
- Correction_Time = 0;
- EllipseFitting(Ellipse, MagDataX, MagDataY, 8);
- Mag.OffsetX = Ellipse[1];
- Mag.OffsetY = Ellipse[2];
- SensorMode = Mode_Algorithm; // 切換至運算模式
- break;
- }
复制代码
疑问二: 比如在 以上问中 CASE 0:中 代码如下:
- case 0:
- LED_B = 0;
- MagDataX[0] = (s16)MoveAve_WMA(Mag.X, MAG_FIFO[0], MagCorrectionAve);
- MagDataY[0] = (s16)MoveAve_WMA(Mag.Y, MAG_FIFO[1], MagCorrectionAve);
- break;
复制代码
对于为何会用 MAG_FIFO[0]还有MAG_FIFO[1]呢?根据MoveAve_WMA函数:代码如下:
- s16 MoveAve_WMA( s16 NewData, s16 *MoveAve_FIFO, u8 SampleNum )
- {
- u8 i = 0;
- s16 AveData = 0;
- u16 SampleSum = 0;
- s32 MoveAve_Sum = 0;
- for(i=0; i<SampleNum-1; i++) // 陣列移動
- MoveAve_FIFO[i] = MoveAve_FIFO[i+1];
- MoveAve_FIFO[SampleNum-1] = NewData; // 加入新數據
-
- for(i=0; i<SampleNum; i++) // 求和 & 加權
- MoveAve_Sum += MoveAve_FIFO[i]*(i+1);
-
- SampleSum = (SampleNum*(SampleNum+1))/2; // 計算加權除數
- AveData = (s16)(MoveAve_Sum/SampleSum); // 計算平均值
- return AveData;
- }
复制代码
可知滑动加权平均算法中数组是从指针头往后的八位..这样子不是导致X,Y中有很大一部分重叠的值吗?重叠位在MAG_FIFO[1]~MAG_FIFO[7]中~
麻烦楼主大神解答下~谢谢 |
|