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.
感谢大佬们的解答
在官方给的那个英文文件了看了半天也没看懂SpeedScaler和BaseRpm的作用,以及他们是怎么计算出来的
球大佬们教教我
我们可以先看例程里面是如何计算转速的,再反过来看看这个参数是如何变成这个值的。
这个是关于速度的相关参数初始化:
// Initialize the SPEED_PR module
speed1.InputSelect = 0;
speed1.BaseRpm = 120*(BASE_FREQ/POLES);
speed1.SpeedScaler = (Uint32)(ISR_FREQUENCY/(1*BASE_FREQ*0.001));
这个是中断里面对转速计算的调用,即每转一圈,记录下当前的VitrualTimer的计数值
if ((pwm1.CmtnPointer==5)&&(PreviousState==4)&&(hall1.CmtnTrigHall==0x7FFF))
{
speed1.TimeStamp = VirtualTimer;
SPEED_PR_MACRO(speed1);
}
而计数器是在中断函数里面进行累加的,计数器的计数累加的频率是中断的频率
// ------------------------------------------------------------------------------
// Increase virtual timer and force 15 bit wrap around
// ------------------------------------------------------------------------------
VirtualTimer++;
VirtualTimer &= 0x00007FFF;
那么我们正常计算转速是这样的:
转速频率 = 中断频率/两次VitrualTimer计数值之差, 即Fisr/Δt , Fisr 为中断频率(ISR_FREQUENCY/0.001), Δt为两次vitual timer 计数值之差
如果换算成RPM,
转速RPM = Fisr *60*2/(Δt*P), P为电机极数
其中BaseRPM的定义为120*(BASE_FREQ/POLES);
那么转速RPM = Fisr *60*2/(Δt*P) = (Fisr * BaseRPM)/(BASE_FREQ*Δt) = BaseRPM * SpeedScaler /Δt
这也是SPEED_PR_MACRO(speed1) 去计算的:
v.EventPeriod = v.NewTimeStamp - v.OldTimeStamp; \
\
if (v.EventPeriod < 0) \
v.EventPeriod += 32767; /* 0x7FFF = 32767*/ \
} \
\
v.Speed = _IQdiv(v.SpeedScaler,v.EventPeriod); \
\
v.SpeedRpm = _IQmpy(v.BaseRpm,v.Speed);
转速频率 = 1/(T*K*n*Δt)
同理换算成转速 = 60*2/(T*K*n*Δt*P)