This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EVM430-F6736:能量计中的频率计算

Guru**** 2606375 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/652948/evm430-f6736-frequency-calculation-in-energy-meter

器件型号:EVM430-F6736

大家好、

我无法理解    slaa517e 中参考代码中"emeter-background.c"文件中下面代码背后的数学原理

/*基于内插过零的市电频率测量程序,
以获得市电频率阶跃变化的快速更新速率*/
/*通过连续近似值对过零点进行内插 *
z = V_sample - phase -> metal量 度。last_V_sample;
X = 0;
y = 0;
对于(k = 0;k < 8;k++)
{
Y <<<= 1;
z >>= 1;
x += z;
如果(x > V_sample)
x -= z;
其他
y |= 1;
}
//由于检测到尖峰,现在我们需要允许跳过的样本*/
Z = y;
while (phase -> metal量 度量.sine_last > 1)
{
z += y;
phase -> metal量 度.sine_last-;
}
/* z 现在是零之间采样间隔的小数
交叉和当前样本、以样本的1/256为单位*/
/*轻阻尼的滤波器现在应该足以消除噪声并获得
频率的稳定值*/
phase -> metal量 度.main_period +=(int32_t)(phase -> metal量 度.cycle_sample_count - z)<< 12)-(phase -> metal量 度量.main_period >> 4);
/*使用样本的残留分次开始下一个循环*/
phase -> metal量 度.cycle_sample_count = z; 

如果有人能对此提供一些见解、那将会有所帮助。

谢谢、此致

Shahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Shahul、

    请耐心等待、因为我们的计量专家将需要从假日季返回、然后才能充分解决此问题。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Shahul、

    根据您的采样频率、您的输入频率将等于一定数量的整数样本加上一些小数样本。 在这里、过采样率(OSR)为256、这意味着每个采样之间有256个调制器时钟周期(将每个周期视为采样的1/256)。

    现在、输入正弦信号的过零可能不会被样本捕获。 因此、为了估算过零发生的位置(用于计算频率)、使用之前的(负)样本和接下来的(正)样本进行插值、精度为1/256样本。 这种方法可以更准确地计算输入信号的频率。

    这有道理吗?

    此致、

    James

    MSP 客户应用
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 James、

    感谢 James 的回复并理解了这一概念。 我不明白这个内插部分是如何工作的。

    z = V_sample - phase -> metality.last_V_sample;
    x = 0;
    y = 0;
    for (k = 0;k < 8;k++)
    {
    Y <<<= 1;
    z >>= 1;
    x += z;
    如果(x > V_sample)
    x -= z;
    其他
    y |= 1;
    } 

    如果您能对此加以启发、那将会非常棒。

    谢谢、此致

    Shahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shahul、

    很遗憾、我没有编写此代码、无法联系作者。 但是、我花了一些时间将该代码放入 MATLAB 中、以便更好地理解它。 根据作者在上述代码中的评论、下面的链接以及我的 MATLAB 测试、它基本上是逐次逼近(考虑 SAR ADC 的工作方式)和线性插值的组合。

    上面的代码片段估计了负向正过零和正(整数)采样之间的分数采样(以样本1/256为单位)。 因此、可以通过将输入信号每个周期的整个样本和小数样本相加来计算输入信号的周期(频率)。 在这里、结果为"y"、但稍后会设置为"z"。 使用 MATLAB 脚本、我绘制了八个近似值中的每一个、如图所示、估计过零(256 - y)越接近每个近似值。 我为负样本选择了-30的振幅、为正样本选择了200的振幅、但可以在脚本中更改这些振幅。

    MATLAB 脚本

    %内部管理
    关闭所有
    CLC
    
    %定义负采样和正采样的振幅(可更改)
    LAST_V_sample =-30;过零前的负采样百分比
    V_sample = 200; 过零后的正采样百分比
    
    用于绘制样本的数组
    xArray =[0、256];
    yArray =[LAST_V_sample、V_SAMPLE];
    
    %连续逼近/插值代码
    x = uint8 (0);
    y = uint8 (0);
    z = uint8 (V_sample - LAST_V_sample);
    
    for k = 0:1:7
    y = bitsll (y、1); %位左移1 (结果乘以2)
    z = bitsrl (z、1); %位右移1 (输入除以2)
    x = x + z;
    如果 x > uint8 (V_sample)
    x = x - z;
    其他
    y = BITOR (y、1); %如果未达到限制、则设置一个位
    结束
    图
    图(xArray、yArray);
    电网打开
    xticks ([0 256-double (y) 256])
    xticklabels ({'0'、256-y、'256'})
    结束 


    e2e.ti.com/.../approximation_5F00_and_5F00_interpolation_5F00_script.m

    图(y 轴:样本振幅、x 轴:样本之间的时间、以1/256为增量)

    此致、

    James

    MSP 客户应用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 James、

    感谢您的输入、从解释中听起来不错。

    谢谢、此致

    Shahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shahul、

    我已经附加了几张幻灯片、解释了如何在2个连续样本之间使用内插来找到每个电压正弦波的周期。

    在本示例中、使用一个正弦的周期计算频率。 但是、在代码中、频率每秒计算一次、计算周期为平均值。

    希望这对您有所帮助!

    此致、

    埃里克