@Mobilandser

При попытке увеличения частоты срабатывания прерываний появляются глюки. Почему так происходит?

Строю свой -3 фазный частотный преобразователь (я понимаю что их куча можно купить китайский, но хочется свое творение)... написал кажись все как нужно. Но хочется плавный пуск. Поэтому сделал проверку:
while (get_current_frequency() < 65){
delay_ms(100);
autoload_period_timer2();
freq += freq_plus;
period_timer2 = get_period(freq);
}

И в итоге что показывает логический анализатор:
5fde586b675a4292210050.jpeg

И немного дальше:
5fde58b6bba2e491691671.jpeg

void calc_index_phase(uint16_t index){
indexA = index;
if (indexA == 0){
if (revers == 0){
indexB = indexA+2*PERIOD/3;
indexC = indexA+PERIOD/3;
} else{
indexC = indexA+2*PERIOD/3;
indexB = indexA+PERIOD/3;
}
} else{
indexB++;
indexC++;
if (indexB > PERIOD) indexB = 0;
if (indexC > PERIOD) indexC = 0;
}
//Phase A
if (sinPhase[indexA]-PERIOD > 0)
PhaseA(0, sinPhase[indexA]-PERIOD);
if (sinPhase[indexA]-PERIOD < 0)
PhaseA(1, sinPhase[PERIOD-indexA]-PERIOD);
if (sinPhase[indexA]-PERIOD == 0){
PhaseA(0, 0);
PhaseA(1, 0);
}
//Phase B
if (sinPhase[indexB]-PERIOD > 0)
PhaseB(0, sinPhase[indexB]-PERIOD);
if (sinPhase[indexB]-PERIOD < 0)
PhaseB(1, sinPhase[PERIOD-indexB]-PERIOD);
if (sinPhase[indexB]-PERIOD == 0){
PhaseB(0, 0);
PhaseB(1, 0);
}
//Phase C
if (sinPhase[indexC]-PERIOD > 0)
PhaseC(0, sinPhase[indexC]-PERIOD);
if (sinPhase[indexC]-PERIOD < 0)
PhaseC(1, sinPhase[PERIOD-indexC]-PERIOD);
if (sinPhase[indexC]-PERIOD == 0){
PhaseC(0, 0);
PhaseC(1, 0);
}
}

void TIM2_IRQHandler(void){
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
calc_index_phase(index_phase);
index_phase++;
if (index_phase > PERIOD) index_phase = 0;
}
}



Собственно вопрос, почему так происходит? Так как хотел сделать плавный запуск еще и регулируемый (в дальнейшем), то есть имею в виду разгон двигателя (шаг изменения частоты и период разгона), то же самое и для торможения.
Частоту ШИМ выбрал около 3-х кгц, а таймером 2 я уже собственно передвигаюсь указателем по таблице синуса. Соответственно меняя частоту прерывания таймера 2, я смогу изменять частоту синусоиды (ну или пчевдо синусоиды). Но не получается. Уже 3-тий день бьюсь...
  • Вопрос задан
  • 30 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы