Tool/software: Code Composer Studio
Hello.
I need to measure the period of an oscillator (CI555), with a frequency varying from 500kHz to 1kHz, but the code is not calculating the period correctly.
I'm starting with this microcontroller so I'm having some difficulties.
I would like to zero the timer2A counter after it captures 2 positive edges then to calculate the period, but I did not find this option.
I believe that the problem of my code is my programming logic, if anyone can give me a help I thank you very much.
Thank you.
float g_ui32SysClock; volatile double freq = 0, cap = 0; volatile uint32_t edge1, edge2, flag = 0, temp = 0, allCaptured = 0, period = 0;; void main(void) { Config_Clock(); Config_Timer(); while (1) { if(allCaptured){ if (edge2 > edge1) { // Ignore calculation if overflow occured period = edge2 - edge1; // Calculate Period freq = g_ui32SysClock/period; allCaptured = 0; } } } } void Config_Clock(void) { g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); } void Config_Timer(void) { //----------------------Timer2A Mode Capture--------------// SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); // Enable the GPIO port that is used for the input edge counting GPIOPinTypeTimer(GPIO_PORTM_BASE, GPIO_PIN_0); // Configure PM0 as the positive edge capture on Timer 2A GPIOPinConfigure(GPIO_PM0_T2CCP0); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); // For use with edge-time-up mode TimerConfigure(TIMER2_BASE, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP)); TimerControlEvent(TIMER2_BASE, TIMER_A, TIMER_EVENT_POS_EDGE); //TimerLoadSet(TIMER2_BASE, TIMER_A, 0xFFFF); TimerIntClear(TIMER2_BASE, TIMER_CAPA_EVENT); TimerEnable(TIMER2_BASE, TIMER_A); // Enable the timers TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT); IntEnable(INT_TIMER2A); //IntMasterEnable(); } void Interrupt_Timer2A(void) { uint32_t InterruptFlags = TimerIntStatus(TIMER2_BASE, true); if (InterruptFlags & TIMER_CAPA_EVENT) { if (!flag) { // Capture first edge timer value and indicate that the program has captured first on edge1 = TimerValueGet(TIMER2_BASE, TIMER_A); flag = 1; } else if (flag){ // Once falling edge has been captured, store the value of the second rising edge which completes the sample edge2 = TimerValueGet(TIMER2_BASE, TIMER_A); allCaptured = 1; // Indicates that all three edges required for calculations have been capture and is ready to calculate flag = 0; } } TimerIntClear(TIMER2_BASE, TIMER_CAPA_EVENT); // Clear interrupt flag to enable to interrupt to occur once more. }