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.
尊敬的 TI:
我将介绍 slaa577提供的固件、
并尝试理解以下代码行、
在函数 ISR (SD24B、ADC_INTERRUPT)中
您能在下面帮助理解一下
if (abs (V_sample - phase -> metality.last_V_sample)<= phase -> metality.sine_last* MAX_per_sample_volte_slew)
{
/*这看起来不像尖峰-执行电源周期检测、和
估算精确的市电周期*/
如果(V_sample < 0)
{
/*记录信号的符号*/
phase -> status &=~V_POS;
}
其他
{
if (!(PHASE_>STATUS & V_POS))
{
#IF 定义(MAIN_FREQUENCY 支持)
/*对样本计数应用限制、以避免尖峰或电源线逐渐耗尽干扰
频率读数太大*/
/*主电源应小于40Hz 或大于70Hz,以使此测试失败! *
if (256*SAMPS_PER_10_seconds/700<= PHASE_>metality.cley_sample_count && PHASE_metality.cley.cley_sample_count <= 256*SAMPS_PER_10_seconds/400)
{
/*基于内插过零的市电频率测量程序,
以获得市电频率阶跃变化的快速更新速率*/
/*通过连续近似值对过零点进行内插 *
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;
}
其他
{
phase -> metal量 度.cycle_sample_count = 0;
}
我需要知道频率是如何在该例程中计算的、特别是下面这些代码行所做的工作
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;
}
您能不能帮助解释一下
此致
您好、lakh、
这部分代码正尝试确定过零的确切时间。 通过获取两个样本值、我们知道两个样本之间的某个点发生了过零。 但是、我们不知道两个样本之间的确切时间。
此代码尝试以8位分辨率确定最后两个样本之间间隔的哪一部分应分配给上一个周期与下一个周期。
最后、y 存储一个8位值。 值0xFF 意味着整个采样间隔应分配给下一次频率计算。 y 中的值0x00意味着整个采样间隔应应用于当前频率计算。
这是通过从开始计算存储在 z 中的两个连续采样值之间的差值来完成的。 然后一半的差(z>>>1与 z/2 )用于确定 y 的最高有效位是1还是0。 下一个周期是采样值之间差异的四分之一、用于确定 y 的下一位、依此类推。
此致、
Muhammad