Skocz do zawartości

Wyjście OC1 w STM32 - jak włączyć


slawek7

Pomocna odpowiedź

Cześć.

Próbuje opanować liczniki w STM32, a przede wszystkim bardziej zaawansowany TIM1.

O ile zwykłe przerwania od przepełnienia są dość proste o tyle utknąłem na generowaniu przebiegów na wyjściach OCx od porównania oraz PWM.

Na początku powiem, że używam na razie krytykowanej biblioteki od STM ze względu że jest prostsza w obsłudze niż zabawa z rejestrami.

W wracając.. Chcę uzyć wyjścia OC1 do generowania przebiegu w przypadku porównania.

Mam taki fragment inicjujący:

void NVIC_Config(void) {

    NVIC_InitTypeDef NVIC_InitStructure;
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 

 	//przerwanie UP (przepelnienie) timera1
   NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 	NVIC_Init(&NVIC_InitStructure);

 	//przerwanie CC (porownanie) timera1
 	NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 	NVIC_Init(&NVIC_InitStructure);
}
void TIM_Config(void) {
 //Konfiguracja timerow
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;

 //Konfiguracja licznika 1
//Ustawienia taktowania i trybu pracy licznika 1
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;                //taktowanie licznka fclk = 72MHz/7200 = 10kHz
TIM_TimeBaseStructure.TIM_Period = 20000;                    //okres przepelnien licznika = 20000 taktow = 2 sekundy
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //dzielnik zegara dla ukladu generacji dead-time i filtra
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;               //licznik powtorzen
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //tryb pracy licznika

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);              //Inicjalizacja licznika

//Konfiguracja kanalu 1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;          //tryb pracy kanalu
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//wlaczenie generowania sygnalu na wyjsciu licznika
TIM_OCInitStructure.TIM_Pulse =5000;                         //5000 taktow = 0.5s od restartu licznika
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //polaryzacja wyjscia
TIM_OC1Init(TIM1, &TIM_OCInitStructure);                     //Inicjalizacja kanalu 1 licznika TIM1

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);           //zapis ustawien, wylaczenie buforowania  - ewentualne zmiany konfiguracji uwzgledniane sa od razu  
                                                              //gdy preload jest wlaczony - zmiany wchodza w zycie dopiero przy nastepnym update

	// Wlaczenie przerwan od licznikow
 TIM_ITConfig(TIM1, TIM_IT_Update , ENABLE);  //wlaczenie przerwania od przepelnienia
 TIM_ITConfig(TIM1, TIM_IT_CC1 , ENABLE);     //wlaczenie przerwanie od porownania w kanale 1
// Wlaczenie timerow
 TIM_Cmd(TIM1, ENABLE);

}

Dla TIM1_CH1 ustawiam wyjście alternatywne typu AF_PP i nie wiem dlaczego ale na wyjściu nic się nie dzieje. Przewiania są zgłaszane ale brak jest reakcji na PA8. Może ja źle rozumuje działanie wyjścia OC1?

Tak samo czym to się rożni od PWM? Skoro okres jest stały, a reagowanie następuje z chwilą porównania to przypomina to dokładnie PWM? A jednak rozróżniki te tryby?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.