Artur P
Guest
Wed May 09, 2007 6:42 pm
Witam wszystkich,
Czy komuś udało się ustalić częstotliwość próbkowania w tym
mikrokontrolerze za pomocą timera TIM0? Ja próbuję, i nie bardzo
mi wychodzi. Korzystam z biblioteki za pomocą której skonfigurowałem
ADC i TIM0 jak poniżej - niestety przerwanie które wskazuje na to że
próbkowanie się zakończyło nie jest generowane. Sam przetwornik
oraz timer (konkretnie przerwanie od OC2) działa.
void adc_init ()
{
ADC_InitTypeDef ADC_InitStructure;
TIM_InitTypeDef tim_params;
EIC_IRQInitTypeDef eic_params;
GPIO_InitTypeDef io_params;
MRCC_PeripheralClockConfig (
MRCC_Peripheral_ADC | MRCC_Peripheral_TIM0, ENABLE
);
//To jest wyraz aktu desperacji
io_params.GPIO_Mode = GPIO_Mode_AF_PP;
io_params.GPIO_Pin = GPIO_Pin_0;
GPIO_Init (GPIO1, &io_params);
ADC_InitStructure.ADC_ConversionMode =
ADC_ConversionMode_OneShot;
ADC_InitStructure.ADC_ExtTrigger = ADC_ExtTrigger_RisingEdge;
ADC_InitStructure.ADC_AutoClockOff = ADC_AutoClockOff_Disable;
//Szybkość próbkowania: 9523.8Hz / 2
ADC_InitStructure.ADC_SamplingPrescaler = 7;
ADC_InitStructure.ADC_ConversionPrescaler = 7;
ADC_InitStructure.ADC_ChannelNumber = 2;
ADC_InitStructure.ADC_FirstChannel = ADC_CHANNEL0;
ADC_Init(&ADC_InitStructure);
ADC_ITConfig(ADC_IT_ECH, ENABLE);
ADC_Cmd(ENABLE);
ADC_StartCalibration(ADC_CalibAverage_Enable);
eic_params.EIC_IRQChannel = ADC_IRQChannel;
eic_params.EIC_IRQChannelPriority = 2;
eic_params.EIC_IRQChannelCmd = ENABLE;
EIC_IRQInit (&eic_params);
tim_params.TIM_Mode = TIM_Mode_OCActive;
tim_params.TIM_Polarity2 = TIM_Polarity2_High;
tim_params.TIM_ClockSource = TIM_ClockSource_Internal;
tim_params.TIM_CounterMode = TIM_CounterMode_Up;
tim_params.TIM_Period = 7;
tim_params.TIM_Prescaler = (PCLK / ((tim_params.TIM_Period + 1)
* Fs)) - 1;
tim_params.TIM_Channel = TIM_Channel_2;
tim_params.TIM_Pulse2 = 4;
TIM_Init (TIM0, &tim_params);
TIM_Cmd (TIM0, ENABLE);
}
// funkcja obsługi przerwania:
void ADC_IRQHandler(void)
{
ADC_ClearITPendingBit(ADC_IT_ECH);
adc_interrupt_routine ();
TIM_ForcedOCConfig (
TIM0, TIM_Channel_2, TIM_ForcedAction_InActive
);
}
--
Pozdrawiam,
Artur Płatek
skrzydlaty
Guest
Thu May 10, 2007 5:26 pm
Co prawda nie uzywalem tego procesora, ale mysle, ze moze byc podobnie
(pracuje akurat z str912).
Przejrzyj dokladnie zrodla biblioteki dostarczanej przez ST (niestety jest
tam troche bledow). W momim przypdaku sytuacja wygladala w ten sposob ze
konfigurujac najpierw wyjscia nastepnie timer i przetwornik, okazywalo sie,
ze timer przestawal generowac przebiegi. Uruchamiajac kazde z osobna, np
tylko timer albo tylko przetwornik wszystko dzialalo. Przyczyna byl blad w
procedurze konfigurujacej wejscie portu jako wejscie przetwornika. Procedura
ta zmieniala dodatkowo bit odpowiedzialny za kolejny pin odlaczajac timer od
wyjscia.
Moze to cie naprowadzi.
Artur P
Guest
Thu May 10, 2007 6:51 pm
skrzydlaty napisał(a):
Quote:
Przejrzyj dokladnie zrodla biblioteki dostarczanej przez ST (niestety jest
tam troche bledow). W momim przypdaku sytuacja wygladala w ten sposob ze
konfigurujac najpierw wyjscia nastepnie timer i przetwornik, okazywalo sie,
ze timer przestawal generowac przebiegi. Uruchamiajac kazde z osobna, np
tylko timer albo tylko przetwornik wszystko dzialalo. Przyczyna byl blad w
procedurze konfigurujacej wejscie portu jako wejscie przetwornika. Procedura
ta zmieniala dodatkowo bit odpowiedzialny za kolejny pin odlaczajac timer od
wyjscia.
Jeśli dobrze Cię zrozumiałem, to sygnał OC2 musi być wyprowadzony
na nogę IO procesorka, tak?
Niestety w procesorze na którym pracuję, nie ma wyjścia TIM0_OC2,
może to jest przyczyną czemu nie chce mi to działać.
Mamy w pracy DevBoard na którym jest MCU w większej obudowie, która
ma wyprowadzony potrzebny sygnał - jutro postaram się sprawdzić.
Dzięki za pomoc.
--
Pozdrawiam,
Artur Płatek
skrzydlaty
Guest
Thu May 10, 2007 7:56 pm
Quote:
Jeśli dobrze Cię zrozumiałem, to sygnał OC2 musi być wyprowadzony
na nogę IO procesorka, tak?
Niestety w procesorze na którym pracuję, nie ma wyjścia TIM0_OC2,
może to jest przyczyną czemu nie chce mi to działać.
Mamy w pracy DevBoard na którym jest MCU w większej obudowie, która
ma wyprowadzony potrzebny sygnał - jutro postaram się sprawdzić.
nie do konca o o mi chodzilo,
sprawdz czy inicjalizujac przetwornik nie przestawiasz ustawien timera i
odwrotnie,
u mnie problem polegal na tym ze wlaczajac jedno przestawialo sie drugie(oba
peryferia na jednym porcie + blad w bibliotece)