00001 // This file has been prepared for Doxygen automatic documentation generation. 00022 #include <inavr.h> 00023 #include <ioavr.h> 00024 #include "pid.h" 00025 00029 struct GLOBAL_FLAGS { 00031 unsigned char pidTimer:1; 00032 unsigned char dummy:7; 00033 } gFlags = {0, 0}; 00034 00036 struct PID_DATA pidData; 00037 00040 #pragma vector = TIMER0_OVF_vect 00041 __interrupt void TIMER0_OVF_ISR( void ) 00042 { 00043 static unsigned int i = 0; 00044 if(i < TIME_INTERVAL) 00045 i++; 00046 else{ 00047 gFlags.pidTimer = TRUE; 00048 i = 0; 00049 } 00050 } 00051 00054 void Init(void) 00055 { 00056 Init_PID(K_P * SCALING_FACTOR, K_I * SCALING_FACTOR , K_D * SCALING_FACTOR , &pidData); 00057 00058 // Set up timer, enable timer/counte 0 overflow interrupt 00059 TCCR0A = (1<<CS00); 00060 TIMSK0 = (1<<TOIE0); 00061 TCNT0 = 0; 00062 } 00063 00069 int Get_Reference(void) 00070 { 00071 return 8; 00072 } 00073 00078 int Get_Measurement(void) 00079 { 00080 return 4; 00081 } 00082 00088 void Set_Input(int inputValue) 00089 { 00090 ; 00091 } 00092 00093 00096 void main(void) 00097 { 00098 int referenceValue, measurementValue, inputValue; 00099 Init(); 00100 __enable_interrupt(); 00101 00102 while(1){ 00103 00104 // Run PID calculations once every PID timer timeout 00105 if(gFlags.pidTimer) 00106 { 00107 referenceValue = Get_Reference(); 00108 measurementValue = Get_Measurement(); 00109 00110 inputValue = PID(referenceValue, measurementValue, &pidData); 00111 00112 Set_Input(inputValue); 00113 00114 gFlags.pidTimer = FALSE; 00115 } 00116 } 00117 } 00118