Witam,
Mam do mikrokontrolera podłączony układ, który w wielkim uproszczeniu dostaje sygnał PWM z uC i zwraca go z pewnym przesunięciem fazy z powrotem . Chciałbym mierzyć to przesunięcie fazowe. W tym celu podaje do tego układu sygnał o częstotliwości 40 kHz z PWM, a sygnał wyjściowy układu dołączam do wejścia CAPTURE 0.0. W trakcie działania programu TIMER0 jest cały czas aktywny i zlicza. Aby zmierzyć przesunięcie badam ilość zliczeń TIMERA 0 pomiędzy zboczem opadającym sygnału PWM (generowanie przerwania przy zrównaniu PWMMR2 z counterem - zapis aktualnego stanu TIMER0 w timerval1), a zboczem opadającym sygnału wchodzącego do CAPTURE 0.0 (generowanie przerwania przy zboczu opadającym i zapis aktualnego stanu TIMER0 w timerval2). Następnie obliczam wartość ticksnumber = timerval2 - timerval1 , która to wartość powinna dać mi ilość zliczeń timera między zboczami obu sygnałów. I chce sobie ją wypisać printf (przez UART). Oczywiście tak się nie dzieje.
Szanowni koledzy już drugi dzień z tym walczę i nie wiem w czym problem. Próbowałem już masy rozwiązań, które utwierdziły mnie w przekonaniu, że nie rozumiem jakiejś podstawowej rzeczy. Poniżej podaje najważniejszy kod (komentarze po angielsku):
przykładowe wyjście UART
Zdaję sobie sprawę że void Anemometer_ISR1() i void Anemometer_ISR2() mogą być zupełnie źle, ale nie wypracowałem nic bliskiego rozwiązaniu problemu więc podaje najlogiczniejsze dla mnie rozwiązanie.
Mam do mikrokontrolera podłączony układ, który w wielkim uproszczeniu dostaje sygnał PWM z uC i zwraca go z pewnym przesunięciem fazy z powrotem . Chciałbym mierzyć to przesunięcie fazowe. W tym celu podaje do tego układu sygnał o częstotliwości 40 kHz z PWM, a sygnał wyjściowy układu dołączam do wejścia CAPTURE 0.0. W trakcie działania programu TIMER0 jest cały czas aktywny i zlicza. Aby zmierzyć przesunięcie badam ilość zliczeń TIMERA 0 pomiędzy zboczem opadającym sygnału PWM (generowanie przerwania przy zrównaniu PWMMR2 z counterem - zapis aktualnego stanu TIMER0 w timerval1), a zboczem opadającym sygnału wchodzącego do CAPTURE 0.0 (generowanie przerwania przy zboczu opadającym i zapis aktualnego stanu TIMER0 w timerval2). Następnie obliczam wartość ticksnumber = timerval2 - timerval1 , która to wartość powinna dać mi ilość zliczeń timera między zboczami obu sygnałów. I chce sobie ją wypisać printf (przez UART). Oczywiście tak się nie dzieje.
Szanowni koledzy już drugi dzień z tym walczę i nie wiem w czym problem. Próbowałem już masy rozwiązań, które utwierdziły mnie w przekonaniu, że nie rozumiem jakiejś podstawowej rzeczy. Poniżej podaje najważniejszy kod (komentarze po angielsku):
Code:
void main(void)
{
init_PLL();
GPIO_Initialize();
ctl_global_interrupts_enable();
UARTInitialize(115200);
TIMER0_InitTimer();
init_PWM(40000);
while (1)
{
}
}
void TIMER0_InitTimer()
{
T0TCR = 0x02; //disable and reset timer0 counter
T0TCR = 0x00; //reset to low
T0IR = 0xff; //clear interrupts
T0TC = 0;
PINSEL0 |= 0x20; //set pin 0.2 as CAP0.0
T0CCR = 0x06; // capture on CAP 0.0 falling edge and generate interrupt
ctl_set_isr(4, 0, CTL_ISR_TRIGGER_NEGATIVE_EDGE,Anemometer_ISR2, 0); // interrupt enable for TIMER0
ctl_unmask_isr(4);
T0TCR = 0x01; //enable timer0 counter
}
void init_PWM (unsigned long frequency)
{
PINSEL0 |= 0x00008000; /* Enable P0.7 as PWM2 output */
PWMPR = 0x00000000; /* Load prescaler */
PWMPCR = 0x00000400; /* PWM channel 2 single edge control, output enabled */
PWMMCR = (1 << 6); /* On MR2 match with timer reset the counter */
PWMMR0 = (liblpc2000_get_pclk(liblpc2000_get_cclk(OSCILLATOR_CLOCK_FREQUENCY))/ frequency);
PWMMR2 = (liblpc2000_get_pclk(liblpc2000_get_cclk(OSCILLATOR_CLOCK_FREQUENCY))/ (2*frequency));
PWMLER = 0xF; /* enable shadow latch for match 1 - 3 */
PWMTCR = 0x00000002; /* Reset counter and prescaler */
PWMTCR = 0x00000009; /* enable counter and PWM, release counter from reset */
ctl_set_isr(8, 0, CTL_ISR_TRIGGER_NEGATIVE_EDGE, Anemometer_ISR1, 0); // interrupt enable for PWM
ctl_unmask_isr(8);
}
void Anemometer_ISR1() //falling edge of PWM signal
{
timerval1 = T0TC; //save current TIMER0 value
PWMIR = 0xff; //clear PWM interrupts
}
void Anemometer_ISR2() //falling edge on Capture 0.0
{
timerval2 = T0CR0; //save current TIMER0 value
ctl_global_interrupts_disable(); //disable interrupts to compute ticksnumber and invoke printf function
ticksnumber = timerval2 - timerval1;
printf("%ld\n", ticksnumber);
T0IR = 0xff; //clear timer interrupts
ctl_global_interrupts_enable(); //enable interrupts
}
przykładowe wyjście UART
Quote:
280022120
280078134
280134145
280191020
280247034
280303654
280359667
280416458
Zdaję sobie sprawę że void Anemometer_ISR1() i void Anemometer_ISR2() mogą być zupełnie źle, ale nie wypracowałem nic bliskiego rozwiązaniu problemu więc podaje najlogiczniejsze dla mnie rozwiązanie.