<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=3205&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-05-30T10:33:13+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=3205&amp;mode</id>
<entry>
<author><name><![CDATA[rafkins22]]></name></author>
<updated>2013-05-30T10:33:13+01:00</updated>
<published>2013-05-30T10:33:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=38034#p38034</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=38034#p38034"/>
<title type="html"><![CDATA[Re: STM32VL Discovery -  PWM CApture]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=38034#p38034"><![CDATA[
Aby sprawdzić czy działa odczyt wartości PWM, zamierzam podłączyć wyjście PC8 (dioda) do PA8 (TIM1_CH1). Wyjście PWM mam ustawione poprawnie co widzę po jasności diody. Natomiast w ogólnie nie wchodzi w obsługę przerwania, ponieważ zapalam tam diode. <br />Może zacznę od początku na spokojnie. Tak wygląda konfiguracja TIM3-generowanie PWM oraz TIM1-odczyt PWM.<br /><br />[syntax=c]void TIM3_config(void)<br />{<br />RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);<br /><br />/* Parametry pracy licznika */<br />TIM_TimeBaseStructure.TIM_Period = OKRES; // wartosc do jakiej liczy Timer<br />TIM_TimeBaseStructure.TIM_Prescaler = 0; // wartosc prescalera<br />TIM_TimeBaseStructure.TIM_ClockDivision = 0; // brak dzielenia częstotliwosci zegara<br />TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //licznik w góre<br />TIM_TimeBaseInit(TIM3, &amp;TIM_TimeBaseStructure);<br /><br />/* Konfiguracja kanałów licznika PWM1 - Kanał 3 */<br />TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // wybór trybu PWM<br />TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // Stan aktywny wysoki<br />TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // Aktywacja wyjscia<br />TIM_OCInitStructure.TIM_Pulse = 100; // czas trawania stanu aktywnego, czyli długosci impulsu / współczynnik wypełnienia 10%<br />TIM_OC3Init(TIM3, &amp;TIM_OCInitStructure);<br /><br />TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);<br />TIM_ARRPreloadConfig(TIM3, ENABLE);<br /><br />/* Uruchomienie TIM3 */<br />TIM_Cmd(TIM3, ENABLE);<br /><br />}<br /><br />//Konfiguracja licznika Tim1<br />void TIM1_config(void){<br /><br />RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);<br /><br />// Ustawienia ukladu podstawy czasu<br />TIM_TimeBaseStructure.TIM_Prescaler = 0;<br />TIM_TimeBaseStructure.TIM_Period = OKRES;<br />TIM_TimeBaseStructure.TIM_ClockDivision = 0;<br />TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br />TIM_TimeBaseInit(TIM1, &amp;TIM_TimeBaseStructure);<br /><br />// konfiguracja kanalu IC1 do pomiaru PWM, IC2 skonfigurowany bedzie automatycznie PA8<br />TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;               //wybor pierwszego konfigurowanego kanalu<br />TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //dzielnik sygnalu wejsciowego<br />TIM_ICInitStructure.TIM_ICFilter = 0;                                  //dlugosc filtra sygnalu wejsciowego<br />TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;    //aktywne zbocze sygnalu wejsciowego<br />TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//wybor polaczen miedzy wejsciami licznika, a kanalami IC<br />TIM_PWMIConfig(TIM1, &amp;TIM_ICInitStructure);<br /><br />TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);                            //Wybor zrodla wyzwalania dla TIM1<br />TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);                      //Wybranie trybu pracy slave-reset<br />TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);   //Wlaczenie trybu slave-reset<br /><br />/* Uruchomienie TIM1 */<br />TIM_Cmd(TIM1, ENABLE);<br /><br />//wlaczenie przrwania od CC1 dla TIM1<br />TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);<br />}[/syntax]<br /><br />1)Przeczytałem, że kanał 2 w przypadku ustawienia kanału 1 ustawia się automatycznie, tzn. przyjmuje zbocze opadające. Przykład konfiguracji jest z książki Paprockiego. <br /><br />2)Ponadto u Ciebie nie było konfiguracji podstawy czasy timera. Nie bardzo wiem na jakiej zasadzie wpisać parametry podstawy czasu dla TIM1, i czy w ogóle trzeba je umieszczać?<br /><br />3) Wejście PA8 (TIM1_CH1) ustawiłem pływające. Tak też było w książce.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=488">rafkins22</a> — 30 maja 2013, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-05-28T09:14:24+01:00</updated>
<published>2013-05-28T09:14:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37884#p37884</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37884#p37884"/>
<title type="html"><![CDATA[Re: STM32 Discovery]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37884#p37884"><![CDATA[
jakoś mi umknęło pewnie dlatego że piszesz w innym temacie , jest dział i warto założyć nowy temat z nowym pytaniem bo tak sie miesza wszystko.<br /><br />[syntax=c]void TIM5_IRQHandler(void){<br />  TIM_ClearITPendingBit(TIM5, TIM_IT_Update);<br /> <br />  /* &#93;0%, 100%&#91; duty cycle */<br />  if(TIM_GetFlagStatus(TIM5, TIM_IT_CC1) == SET &amp;&amp; TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == SET)<br />  {<br />    /* Tu możesz sobie obliczyć i zapisać cykl i czestotliwość */<br />  }<br />  else /* 0% lub 100% wypełnienia */<br />  {<br />    /* Licznik przepełnienia będzie wychwytywał okres <br />     * tzn jeśli sygnał ma 0 lub 100% wypełnienia <br />     * Skonfigurowany został zakres czestotliwości i uzyskasz<br />     * signał na GPIO_ReadInputDataBit<br />     */<br />  }<br />  TIM_ClearFlag(TIM5, TIM_IT_CC1);<br />  TIM_ClearFlag(TIM5, TIM_IT_CC2);<br />}[/syntax]<br /><br />Np tak można to zrealizować ...  oczywiście to tylko podpowiedź .. ale teraz dasz sobie radę<br /><br />ja np tak realizowałbym odczyt dla 4 kanałów PWM z jednego Timera a dane o szerokości impulsu sa przechowywane w ccr[]:<br /><br />[syntax=c]static TIM_ICInitTypeDef TIM_CH1_ICInitStructure;<br /><br />#define GPIO_AF_TIM2 GPIO_AF_2<br /><br />void ConfigPwmIn() {<br /> GPIO_InitTypeDef GPIO_InitStructure;<br /> TIM_ICInitTypeDef TIM_ICInitStructure;<br /> NVIC_InitTypeDef NVIC_InitStructure;<br /><br /> TIM_DeInit(TIM2 );<br /><br /> /* Właczenie zegara TIM2 */<br /> RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);<br /><br /> /* Właczenie zegara GPIOC  */<br /> RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);<br /><br /> /* Konfiguracja pinów TIM2 GPIO : CH1=PD3, C2=PD4, CH3=PD7, CH4=PD6 */<br /> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7 | GPIO_Pin_6;<br /> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;<br /> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br /> GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;<br /> GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;<br /> GPIO_Init(GPIOD, &amp;GPIO_InitStructure);<br /><br /> /* Połaczenie pinów do TIM3 AF2 */<br /> GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_TIM2 );<br /> GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_TIM2 );<br /> GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_TIM2 );<br /> GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_TIM2 );<br /><br /> NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;<br /> NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;<br /> NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br /> NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br /> NVIC_Init(&amp;NVIC_InitStructure);<br /><br /> /* Właczenie przechwytywania*/<br /> TIM_CH1_ICInitStructure.TIM_Channel = TIM_Channel_1;<br /> TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;<br /> TIM_CH1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;<br /> TIM_CH1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;<br /> TIM_CH1_ICInitStructure.TIM_ICFilter = 0;<br /> TIM_ICInit(TIM2, &amp;TIM_ICInitStructure);<br /> TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;<br /> TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;<br /> TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;<br /> TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;<br /> TIM_ICInitStructure.TIM_ICFilter = 0;<br /> TIM_ICInit(TIM2, &amp;TIM_ICInitStructure);<br /> TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;<br /> TIM_ICInit(TIM2, &amp;TIM_ICInitStructure);<br /> TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;<br /> TIM_ICInit(TIM2, &amp;TIM_ICInitStructure);<br /><br /> /* Właczenie TIM2 */<br /> TIM_Cmd(TIM2, ENABLE);<br /><br /> /* Właczenie przerwania CC1-4 */<br /> TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);<br /><br /> /* Czyszczenie flagi CC1 */<br /> TIM_ClearFlag(TIM2, TIM_FLAG_CC1 | TIM_FLAG_CC2 | TIM_FLAG_CC3 | TIM_FLAG_CC4 );<br />}<br /><br />static volatile uint32_t ccr&#91;4&#93;;<br />static volatile char pulseState = 0;<br /><br />void TIM2_IRQHandler() {<br /> if (TIM2 -&gt;SR &amp; TIM_IT_CC1 ) {<br />  TIM2 -&gt;SR &amp;= (~TIM_IT_CC1 );<br /><br />  if (pulseState == 0) {<br />   TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;<br /><br />   //Za każdym razem otrzymujemy zbocze narastające na CH1, <br />  //możemy wyzerować licznik. Wszystkie kanały sa wyrównane<br />   //w Fazie, więc mozemy  to wykorzystać jako odniesienie.<br />   TIM_SetCounter(TIM2, 0);<br />  } else {<br />   TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;<br /><br />   // Pobieramy wartośc przy zboczu opadajacym<br />   ccr&#91;0&#93; = TIM_GetCapture1(TIM2 );<br />  }<br />  pulseState = !pulseState;<br /><br />  // Odwrócenie polaryzacji.<br />  TIM_ICInit(TIM2, &amp;TIM_CH1_ICInitStructure);<br /> }<br /><br /> if (TIM2 -&gt;SR &amp; TIM_IT_CC2 ) {<br />  TIM2 -&gt;SR &amp;= (~TIM_IT_CC2 );<br />  ccr&#91;1&#93; = TIM_GetCapture2(TIM2 );<br /> }<br /> if (TIM2 -&gt;SR &amp; TIM_IT_CC3 ) {<br />  TIM2 -&gt;SR &amp;= (~TIM_IT_CC3 );<br />  ccr&#91;2&#93; = TIM_GetCapture3(TIM2 );<br /> }<br /> if (TIM2 -&gt;SR &amp; TIM_IT_CC4 ) {<br />  TIM2 -&gt;SR &amp;= (~TIM_IT_CC4 );<br />  ccr&#91;3&#93; = TIM_GetCapture4(TIM2 );<br /> }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 28 maja 2013, o 09:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafkins22]]></name></author>
<updated>2013-05-28T07:58:36+01:00</updated>
<published>2013-05-28T07:58:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37882#p37882</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37882#p37882"/>
<title type="html"><![CDATA[Re: STM32 Discovery]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37882#p37882"><![CDATA[
Nikt nie pomoże w tej sprawie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=488">rafkins22</a> — 28 maja 2013, o 07:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafkins22]]></name></author>
<updated>2013-05-26T11:27:58+01:00</updated>
<published>2013-05-26T11:27:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37714#p37714</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37714#p37714"/>
<title type="html"><![CDATA[STM32VL Discovery -  PWM CApture]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3205&amp;p=37714#p37714"><![CDATA[
Witam. Bawię się teraz PWM na STM32vldiscovery i ustawiłem sobie PWM output, obserwując rozjaśnianie diody przy wciskaniu przycisku. Docelowo chcę podłączyć wentylator PC. Obecnie staram się skonfigurować PWM input, aby odczytywać współczynnik wypełnienia. Czy poprawnie konfiguruję to wejście:<br /><br />[syntax=c]#include &quot;stm32f10x.h&quot;<br />#include &quot;STM32vldiscovery.h&quot;<br />#include &quot;SunLCD.h&quot;<br /><br />#define OKRES 999<br />/* f=24MHz/(OKRES-1)= 24kHz - czestotliwosc generowanego przebiegu PWM*/<br /><br />GPIO_InitTypeDef GPIO_InitStructure;<br />TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;<br />TIM_OCInitTypeDef TIM_OCInitStructure;<br />TIM_ICInitTypeDef TIM_ICInitStructure;<br /><br />//DEKLARACJA ZMIENNYCH<br />uint16_t PrescalerValue;<br />uint16_t wypelnienie;<br />uint8_t flaga;<br />static __IO uint32_t TimingDelay;<br />__IO uint16_t IC1=0;<br />__IO uint16_t wsp_wyp=0;<br />__IO uint16_t czestotliwosc=0;<br /><br /><br />//DEKLARACJA FUNKCJI<br />void GPIO_config(void);    // Ustawienia Pinów<br />void RCC_config(void);     // Ustawienie Taktowania<br />void NVIC_Config(void);    // Ustawienie kontrolera przerwań<br />void TIM3_config(void);    // Ustawienie Timer3<br />void TIM1_config(void);    // Ustawienie Timer1<br /><br />uint8_t klawisz_wcisniety(void);  // Funkcja zapobiegająca drganiu styków<br />void FAN_start(void);             // kick start wentylatora<br />void TimingDelay_Decrement(void);<br />void Delay(__IO uint32_t nTime);<br /><br /><br />/** Pętla główna ------------------------------------------*/<br />int main(void)<br />{<br />/* Ustawiamy GPIO */<br />GPIO_config();<br /><br />/* Ustawiamy RCC */<br />RCC_config();<br /><br />/* Ustawiamy NVIC */<br />NVIC_Config();<br /><br />/* Ustawiamy Timer3 - output PWM */<br />TIM3_config();<br /><br />/* Ustawiamy Timer1 - input PWM*/<br />TIM1_config();<br /><br />SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // Taktowanie SysTick sygnałem zegara systemowego f=24MHz<br />if (SysTick_Config(SystemCoreClock / 1000))  while (1); // przerwanie co 1ms, f= 24MHz / 1000, czyli liczy od 24000<br /><br />// Konfiguracja wyswietlacza<br />GPIO_LCD_Init();<br />Delay(500);<br />LCD_Init();<br />LCD_Clear();<br />Wyslij_na_LCD(&quot;PWM:&quot;);<br />LCD_locate(0,1);<br />Wyslij_na_LCD(&quot;0%&quot;);<br /><br /><br />while (1)<br />{<br />TIM_OCInitStructure.TIM_Pulse = wypelnienie;<br />TIM_OC3Init(TIM3, &amp;TIM_OCInitStructure);<br />TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);<br />TIM_ARRPreloadConfig(TIM3, ENABLE);<br /><br />if(klawisz_wcisniety()){<br /><br />Delay(50);<br />FAN_start();<br />LCD_Clear();<br />Wyslij_na_LCD(&quot;PWM:&quot;);<br /><br />    wypelnienie=wypelnienie+20;<br />    if(wypelnienie/10&gt;100)wypelnienie=0;<br /><br />    LCD_locate(5,1);<br />    lcd_liczba(wsp_wyp);<br /><br />    LCD_locate(0,1);<br />    lcd_liczba(wypelnienie/10);<br />    Wyslij_na_LCD(&quot;%&quot;);<br />}<br />}<br />}<br /><br /><br />uint8_t klawisz_wcisniety(void)<br />{<br />if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))// klawisz wciśnięty ?<br />{<br />Delay(20);// czas drgań styków<br />if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br />//Konfiguracja licznika Tim3.<br />void TIM3_config(void)<br />{<br />/* wyliczenie wartosci prescalera */<br />PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;<br />/* Uzywamy 24000000 Mhz dla System Clock!! */<br /><br />RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);<br /><br />/* Parametry pracy licznika */<br />TIM_TimeBaseStructure.TIM_Period = OKRES; // wartosc do jakiej liczy Timer<br />TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // wartosc prescalera<br />TIM_TimeBaseStructure.TIM_ClockDivision = 0; // brak dzielenia częstotliwosci zegara<br />TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //licznik w góre<br />TIM_TimeBaseInit(TIM3, &amp;TIM_TimeBaseStructure);<br /><br />/* Konfiguracja kanałów licznika PWM1 - Kanał 3 */<br />TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // wybór trybu PWM<br />TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // Stan aktywny wysoki<br />TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // Aktywacja wyjscia<br />TIM_OCInitStructure.TIM_Pulse = 500; // czas trawania stanu aktywnego, czyli długosci impulsu / współczynnik wypełnienia 10%<br />TIM_OC3Init(TIM3, &amp;TIM_OCInitStructure);<br /><br />TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);<br />TIM_ARRPreloadConfig(TIM3, ENABLE);<br /><br />/* Uruchomienie TIM3 */<br />TIM_Cmd(TIM3, ENABLE);<br /><br />}<br /><br />void TIM1_config(void){<br /><br />RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);<br /><br />// Ustawienia ukladu podstawy czasu<br />TIM_TimeBaseStructure.TIM_Prescaler = 8-1;  //prescaler=8<br />TIM_TimeBaseStructure.TIM_Period = 65535ul;<br />TIM_TimeBaseStructure.TIM_ClockDivision = 0;<br />TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br />TIM_TimeBaseInit(TIM1, &amp;TIM_TimeBaseStructure);<br /><br />// konfiguracja kanalu IC1 do pomiaru PWM, IC2 skonfigurowany bedzie automatycznie PA8<br />TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;               //wybor pierwszego konfigurowanego kanalu<br />TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;          //dzielnik sygnalu wejsciowego<br />TIM_ICInitStructure.TIM_ICFilter = 0;                          //dlugosc filtra sygnalu wejsciowego<br />TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;    //aktywne zbocze sygnalu wejsciowego<br />TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//wybor polaczen miedzy wejsciami licznika, a kanalami IC<br />TIM_PWMIConfig(TIM1, &amp;TIM_ICInitStructure);<br /><br />TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);                   //Wybor zrodla wyzwalania dla TIM1<br />TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);                //Wybranie trybu pracy slave-reset<br />TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);   //Wlaczenie trybu slave-reset<br /><br />/* Uruchomienie TIM1 */<br />TIM_Cmd(TIM1, ENABLE);<br /><br />//wlaczenie przrwania od CC1 dla TIM1<br />TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);<br />}<br /><br />//Konfiguracja GPIO<br />void GPIO_config(void){<br /><br />/* GPIOA i GPIOB remapowanie */<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |<br />RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO, ENABLE);<br /><br />/* remapowany TIM3 kanały 3 i 4 */<br />GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;<br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_Init(GPIOC, &amp;GPIO_InitStructure);<br /><br />/* musimy remapować piny PC8,PC9 na timer3 kanały 3 i 4 */<br />GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);<br /><br />/* joystick */<br />GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;<br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />/* wyjscie kanału 1 timera TIM3 - PA8 */<br />GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;<br />GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />}<br /><br />//Konfiguracja zegara HSE<br />void RCC_config(void){<br /><br />RCC_DeInit(); // domyslne ustawienie rejestrów RCC<br /><br />ErrorStatus HSEStartUpStatus;<br /><br />RCC_HSEConfig(RCC_HSE_ON); // Wlącz HSE( high speed external) - 8MHz<br /><br />// Oczekwianie na gotowosc HSE<br />while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);<br /><br />// Czekaj, az HSE sie uruchomi<br />HSEStartUpStatus = RCC_WaitForHSEStartUp();<br /><br />if(HSEStartUpStatus == SUCCESS){<br /><br /><br />FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Wlaczenie bufora dla pamięci FLASH<br />FLASH_SetLatency(FLASH_Latency_0); // Brak opóźnienia dostępu do pamięci &lt;=24 MHz = Maksymalna f komunikacji z pamięcią FLESH<br /><br />// HCLK=SYSCLK, czyli syganł zegarowy rdzenia = sygnał zegarowy SYSCLK<br />RCC_HCLKConfig(RCC_SYSCLK_Div1);<br /><br />// Magistrala APB1 (PCLK1) - 24MHz - max<br />RCC_PCLK1Config(RCC_HCLK_Div1);<br /><br />// Magistrala APB2 (PCLK2) - 24MHz - max<br />RCC_PCLK2Config(RCC_HCLK_Div1);<br /><br />// Ustawienie dzielnika HSE. Dzielnik równy 1<br />RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);<br /><br />// Ustawienie powielacza PLL  (8MHz/1)*3=24MHz<br />RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_3);<br /><br />RCC_PLLCmd(ENABLE); // Włącz PLL<br /><br />while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET); // Czekaj az PLL sie uruchomi<br /><br />RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // PLL JEST ŹRÓDŁEM SYGNAŁU ZEGAROWEGO<br /><br />while (RCC_GetSYSCLKSource() != 0x08); // Czekaj az PLL będzie sygnałem zegarowym<br />}<br /><br />}<br /><br />//Konfigurowanie kontrolera przerwan NVIC<br />void NVIC_Config(void) {<br /><br />  NVIC_InitTypeDef NVIC_InitStructure;<br /><br />#ifdef  VECT_TAB_RAM<br />  // Jezeli tablica wektorow w RAM, to ustaw jej adres na 0x20000000<br />  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);<br />#else  // VECT_TAB_FLASH<br />  // W przeciwnym wypadku ustaw na 0x08000000<br />  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);<br />#endif<br /><br />  //Wybor modelu grupowania przerwan<br />  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);<br /><br />  // konfiguracja przerwania od CC TIM1<br />  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;<br />  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;<br />  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;<br />  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />  NVIC_Init(&amp;NVIC_InitStructure);<br />}<br /><br />void Delay(__IO uint32_t nTime){<br />  TimingDelay = nTime;<br />  while(TimingDelay != 0);<br />}<br /><br />void TimingDelay_Decrement(void){<br />  if (TimingDelay != 0x00)<br />  {<br />    TimingDelay--;<br />  }}<br /><br />void FAN_start(void){<br />if(flaga==0 || (flaga==1 &amp;&amp; wypelnienie==0)){<br />wypelnienie=280;<br />Delay(1500);<br />flaga=1;<br />}<br />}<br /><br />void TIM_CC_IRQHandler(void){<br /><br />TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);<br /><br />IC1=TIM_GetCapture1(TIM1);<br /><br />if(IC1 !=0){<br /><br />wsp_wyp=(TIM_GetCapture2(TIM1)*100)/IC1;<br />czestotliwosc= 24000000/IC1;<br />}<br />else {<br />wsp_wyp=0;<br />czestotliwosc=0;<br />}<br />}[/syntax]<br /><br /><span style="color: #FF0000"><strong>Wydzieliłem z tasiemca -- SunRiver</strong></span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=488">rafkins22</a> — 26 maja 2013, o 11:27</p><hr />
]]></content>
</entry>
</feed>