Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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?

Tak włączone, jest to tak oczywiste że nie wspominałem.

Zmieniłem na TIM_OCMode = TIM_OCMode_Toggle; ale nic nie pomogło.

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...