- /**********************************************************************
- * � 2005 Microchip Technology Inc.
- *
- * FileName: main.c
- * Dependencies: Header (.h) files if applicable, see below
- * Processor: dsPIC30Fxxxx
- * Compiler: MPLAB� C30 v3.00 or higher
- * IDE: MPLAB� IDE v7.52 or later
- * Dev. Board Used: dsPICDEM 1.1 Development Board
- * Hardware Dependencies: None
- *
- * SOFTWARE LICENSE AGREEMENT:
- * Microchip Technology Incorporated ("Microchip") retains all ownership and
- * intellectual property rights in the code accompanying this message and in all
- * derivatives hereto. You may use this code, and any derivatives created by
- * any person or entity by or on your behalf, exclusively with Microchip,s
- * proprietary products. Your acceptance and/or use of this code constitutes
- * agreement to the terms and conditions of this notice.
- *
- * CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS". NO
- * WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
- * TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP,S
- * PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
- *
- * YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER
- * IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY),
- * STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL,
- * PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF
- * ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN
- * ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
- * ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO
- * THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO
- * HAVE THIS CODE DEVELOPED.
- *
- * You agree that you are solely responsible for testing the code and
- * determining its suitability. Microchip has no obligation to modify, test,
- * certify, or support the code.
- *
- * REVISION HISTORY:
- *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * Author Date Comments on this revision
- *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * HV/SB 11/15/05 First release of source file
- *
- *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * ADDITIONAL NOTES:
- *
- *
- **********************************************************************/
- #include <dsp.h>
- /*
- Variable Declaration required for each PID controller in your application
- */
- /* Declare a PID Data Structure named, fooPID */
- tPID fooPID;
- /* The fooPID data structure contains a pointer to derived coefficients in X-space and */
- /* pointer to controler state (history) samples in Y-space. So declare variables for the */
- /* derived coefficients and the controller history samples */
- fractional abcCoefficient[3] __attribute__ ((section (".xbss, bss, xmemory")));
- fractional controlHistory[3] __attribute__ ((section (".ybss, bss, ymemory")));
- /* The abcCoefficients referenced by the fooPID data structure */
- /* are derived from the gain coefficients, Kp, Ki and Kd */
- /* So, declare Kp, Ki and Kd in an array */
- fractional kCoeffs[] = {0,0,0};
- /*
- Main function demonstrating the use of PID(), PIDInit() and PIDCoeffCalc()
- functions from DSP library in MPLAB C30 v3.00 and higher
- */
- int main (void)
- {
- /*
- Step 1: Initialize the PID data structure, fooPID
- */
- fooPID.abcCoefficients = &abcCoefficient[0]; /*Set up pointer to derived coefficients */
- fooPID.controlHistory = &controlHistory[0]; /*Set up pointer to controller history samples */
- PIDInit(&fooPID); /*Clear the controler history and the controller output */
- kCoeffs[0] = Q15(0.7);
- kCoeffs[1] = Q15(0.2);
- kCoeffs[2] = Q15(0.07);
- PIDCoeffCalc(&kCoeffs[0], &fooPID); /*Derive the a,b, & c coefficients from the Kp, Ki & Kd */
- /*
- Step 2: Use the PID Controller
- */
- fooPID.controlReference = Q15(0.74) ; /*Set the Reference Input for your controller */
- fooPID.measuredOutput = Q15(0.453) ; /*Typically the measuredOutput variable is a plant response*/
- /*measured from an A/D input or a sensor. */
- /*In this example we manually set it to some value for */
- /*demonstration but the user should note that this value will */
- /*keep changing in a real application*/
- while (1) /*We use a while(1) loop here for demonstration purposes.*/
- { /*Typically, the PID calculation may be triggered off a timer*/
- /*or A/D interrupt */
- PID(&fooPID); /*Call the PID controller using the new measured input */
- /*The user may place a breakpoint on "PID(&fooPID)", halt the debugger,*/
- /*tweak the measuredOutput variable within the watch window */
- /*and then run the debugger again */
- }
- }