Здравствуйте, разрабатываю систему управления асинхронным двигателем на AT90PWM3, посмотрел апноут 494, отсюда: http://www.gaw.ru/html.cgi/txt/app/micr ... AVR494.htm , но немогу разобраться в исходниках, а в частности вот в этом месте:
while(1)
{
if (Flag_IT_timer0) /* 1 mS */
{
ADC_start_conv();
Flag_IT_timer0 = 0;
// generates speed reference steps in the software
Softcounter += 1 ;
if (Softcounter == 2500) {
Omega_ref = -320 ;
} //-128; }
if (Softcounter == 5000)
{
Omega_ref= -160 ;
}
if (Softcounter == 7500)
{
Omega_ref= 160 ;
}
if (Softcounter == 10000)
{
Omega_ref= 320 ;
Softcounter = 0 ;
}
}
if (Flag_IT_ADC)
{
// get the measured speed from the ADC
Omega_meas = read_acquisition();
// compute the stator frequency (PI controller)
// Command = mc_control_speed_16b(Omega_ref,Omega_meas);
Command = Omega_ref ; // for use in open loop
// direction management : extract sign and absolute value
if (Command > (S16)(0) ) {
direction = 0 ;
OmegaTe = Command;
}
else {
direction = 1 ;
OmegaTe = (~Command) + 1;
}
//direction = 0 ;
if ( OmegaTe > K_scal )
{
// ------------------------ V/f law --------------------------
amplitude = controlVF(OmegaTe);
Немогу понять: ведь прерывание срабатывает, каждую 1миллисекунду, и если так, то Omega_ref, будет равнятся одному из 4-х значений, которые генерятся, каждые 2,5 секунды...., и зачем тогда Omega_ref использовать при вычислении амплитуды, ведь для ее получения нам необходимо частоту вращения умножить на некую константку????
while(1)
{
if (Flag_IT_timer0) /* 1 mS */
{
ADC_start_conv();
Flag_IT_timer0 = 0;
// generates speed reference steps in the software
Softcounter += 1 ;
if (Softcounter == 2500) {
Omega_ref = -320 ;
} //-128; }
if (Softcounter == 5000)
{
Omega_ref= -160 ;
}
if (Softcounter == 7500)
{
Omega_ref= 160 ;
}
if (Softcounter == 10000)
{
Omega_ref= 320 ;
Softcounter = 0 ;
}
}
if (Flag_IT_ADC)
{
// get the measured speed from the ADC
Omega_meas = read_acquisition();
// compute the stator frequency (PI controller)
// Command = mc_control_speed_16b(Omega_ref,Omega_meas);
Command = Omega_ref ; // for use in open loop
// direction management : extract sign and absolute value
if (Command > (S16)(0) ) {
direction = 0 ;
OmegaTe = Command;
}
else {
direction = 1 ;
OmegaTe = (~Command) + 1;
}
//direction = 0 ;
if ( OmegaTe > K_scal )
{
// ------------------------ V/f law --------------------------
amplitude = controlVF(OmegaTe);
Немогу понять: ведь прерывание срабатывает, каждую 1миллисекунду, и если так, то Omega_ref, будет равнятся одному из 4-х значений, которые генерятся, каждые 2,5 секунды...., и зачем тогда Omega_ref использовать при вычислении амплитуды, ведь для ее получения нам необходимо частоту вращения умножить на некую константку????
