尊敬的 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;
}
您能不能帮助解释一下
此致