css_cmake_test/f2833x/examples/eqep_freqcal/Example_2833xEqep_freqcal.c

231 lines
7.1 KiB
C

//###########################################################################
//
// FILE: Example_2833xEqep_freqcal.c
//
// TITLE: eQEP, Frequency measurement Example
//
//! \addtogroup f2833x_example_list
//! <h1>eQEP, Frequency measurement (eqep_freqcal)</h1>
//!
//! This test will calculate the frequency and period of an input signal
//! using eQEP module.
//!
//! EPWM1A is configured to generate a frequency of 5 kHz.
//! \sa section on Frequency Calculation for more details on the frequency
//! calculation performed in this example.
//!
//! In addition to the main example file, the following files must be included
//! in this project:
//! - \b Example_freqcal.c , includes all eQEP functions
//! - \b Example_EPwmSetup.c , sets up EPWM1A for use with this example
//! - \b Example_freqcal.h , includes initialization values for frequency
//! structure.
//!
//! The configuration for this example is as follows
//! - Maximum frequency is configured to 10KHz (BaseFreq)
//! - Minimum frequency is assumed at 50Hz for capture pre-scalar selection
//!
//! \b SPEED_FR: High Frequency Measurement is obtained by counting the
//! external input pulses for 10ms (unit timer set to 100Hz).
//! \f[ SPEED\_FR = \frac{Count\ Delta}{10ms} \f]
//!
//! \b SPEED_PR: Low Frequency Measurement is obtained by measuring time
//! period of input edges.
//! Time measurement is averaged over 64edges for better results and
//! capture unit performs the time measurement using pre-scaled SYSCLK
//!
//! Note that pre-scaler for capture unit clock is selected such that
//! capture timer does not overflow at the required minimum frequency
//! This example runs forever until the user stops it.
//!
//! \b External \b Connections \n
//! - Connect GPIO20/EQEP1A to GPIO0/EPWM1A
//!
//! \b Watch \b Variables \n
//! - \b freq.freqhz_fr , Frequency measurement using position counter/unit
//! time out
//! - \b freq.freqhz_pr , Frequency measurement using capture unit
//
//###########################################################################
// $TI Release: $
// $Release Date: $
// $Copyright:
// Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################
//
// Included Files
//
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "Example_freqcal.h" // Example specific include file
//
// Function Prototypes
//
void EPwmSetup(void);
__interrupt void prdTick(void);
//
// Globals
//
FREQCAL freq=FREQCAL_DEFAULTS;
//
// Main
//
void main(void)
{
//
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
//
InitSysCtrl();
//
// Step 2. Initialize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
//
// InitGpio(); // Skipped for this example
//
// Only init the GPIO for EQep1 and EPwm1 in this case
// This function is found in DSP2833x_EQep.c
//
InitEQep1Gpio();
InitEPwm1Gpio();
//
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
//
DINT;
//
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
//
InitPieCtrl();
//
// Disable CPU interrupts and clear all CPU interrupt flags
//
IER = 0x0000;
IFR = 0x0000;
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
//
InitPieVectTable();
//
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT= &prdTick;
EDIS; // This is needed to disable write to EALLOW protected registers
//
// Step 4. Initialize all the Device Peripherals:
//
//
// Example specific ePWM setup. This function is found in
// Example_EPwmSetup.c
//
EPwmSetup();
//
// Step 5. User specific code, enable interrupts:
//
//
// Enable CPU INT1 which is connected to CPU-Timer 0:
//
IER |= M_INT3;
//
// Enable TINT0 in the PIE: Group 3 interrupt 1
//
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//
// Enable global Interrupts and higher priority real-time debug events
//
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
//
// Initializes eQEP for frequency calculation in FREQCAL_Init(void)function
// in Example_EPwmSetup.c
//
freq.init(&freq);
for(;;)
{
}
}
//
// prdTick - Interrupts once per ePWM period
//
__interrupt void
prdTick(void)
{
//
// Checks for event and calculates frequency in FREQCAL_Calc(FREQCAL *p)
// function in Example_EPwmSetup.c
//
freq.calc(&freq);
//
// Acknowledge this interrupt to receive more interrupts from group 1
//
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
EPwm1Regs.ETCLR.bit.INT=1;
}
//
// End of File
//