• Nenhum resultado encontrado

IGBT Gate

7.2 Future Work

In the future, some aspects of this work should be developed further, optimizing the control system and increasing its utility:

• Performing measurements of the nuclear magnetization in steady-state regime can test the stability of the field during these regimes. Also, measuring multiple times the nuclear magnetization in a field cycle where the evolution period is constant would check the reproducibility of the transitions.

• The communication between the workstation operator and the digital control system is required for system integration. Both systems could be connected via a serial port, so that the control system would receive the control references corresponding to the frequency desired directly from the NMR console.

• A proper calibration between the digital control reference and the magnetic field strength would also be required for this integration.

• The main advantage of having a digital control system as the relaxometer power supply controller is the fact that is easier to configure and reconfigure through software than with its analogue counterpart. Once this solution is fully optimized in terms of measurements reproducibility, other algorithms can be developed in order to modulate theZeeman field in more complex ways.

• The results prove that, in general terms, the control system designed in this work can be integrated in the relaxometer power supply system. Nevertheless, other options can be evaluated for a digital control implementation. Using a Digital-to-Analog Converter could improve the stability of the signal. On the other hand, other devices could be considered to implement the control system.

Using a Field Programmable Gate Array (FPGA) device, the system sample rate could be higher, improving the control operation.

Bibliography

[1] M. Levitt, Spin Dynamics: Basics of Nuclear Magnetic Resonance. Wiley, 2001. [Online].

Available: http://books.google.pt/books?id= 1wZXxz1TIQC

[2] A. Gradisek, T. Apih, V. Domenici, V. Novotna, and P. J. Sebastiao, “Molecular dynamics in a blue phase liquid crystal: a 1h fast field-cycling nmr relaxometry study,”Soft Matter, vol. 9, pp.

10 746–10 753, 2013. [Online]. Available: http://dx.doi.org/10.1039/C3SM51625C

[3] E. Anoardo, “Application of field-cycling nmr relaxometry to the study of ultrasound-induced effects in the molecular dynamics and order of mesomorphic materials,”C. R. Physique, vol. 11, p. 160, 2010.

[4] D. de Mesquita e Sousa, “Desenvolvimento de um espectr´ometro de ressonˆancia magn´etica nuclear de campo c´ıclico r´apido,” Master’s thesis, Instituto Superior T´ecnico, 2003.

[5] F. Noack, NMR Field-cycling Spectroscopy: Principles and Applications, ser. Progress in nuclear magnetic resonance spectroscopy. Pergamon, 1986.

[6] T. Farrar and E. Becker, Pulse and Fourier transform NMR: introduction to theory and methods.

Academic Press, 1971.

[7] E. A. Rainer Kimmich, “Field-cycling nmr relaxometry,”Prog. Nucl. Magn. Reson. Spectrosc., vol.

Volume 44, p. 257, 2004.

[8] N. Jacobsen,NMR Spectroscopy Explained: Simplified Theory, Applications and Examples for Or- ganic Chemistry and Structural Biology. Wiley, 2007.

[9] J. S. F. NOACK, St. BECKER, “Applications of field-cycling nmr,”Annu. Rep. NMR Spectrosc., vol. 33, pp. 1, 36, 1997.

[10] H. E. B. Alfred G. Redfield, Warner Fite II, “Precision high speed current regulators for occasionally switched inductive loads,”Rev. Sci. Instrum., vol. 39, p. 710, 1968.

[11] Spinmaster FFC - 2000, Fast Field Cycling NMR Relaxometer Reference Manual, STELAR s.r.l., 2001.

[13] D. de Mesquita e Sousa, G. D. Marques, P. J. O. Sebastiao, and J. M. B. Cascais, “Desktop fast-field cycling nuclear magnetic resonance relaxometer,”Solid State Nuclear Magnetic Resonance, vol. 38, pp. 36–43, july 2010.

[14] A. Roque, D. Sousa, E. Margato, and J. Maia, “Current source of a ffc nmr relaxometer linearly controlled,” inPower Electronics and Applications (EPE), 2013 15th European Conference on, Sept 2013, pp. 1–9.

[15] I. Corporation, “Insulated gate bipolar transistor (igbt), ds98996c(ixgh-ixgt16n170) datasheet,” 2006.

[16] D. Sousa, G. D. Marques, P. Sebastiao, and A. Ribeiro, “New isolated gate bipolar transistor two- quadrant chopper power supply for a fast field cycling nuclear magnetic resonance spectrometer,”

Review of Scientific Instruments, vol. 74, no. 10, pp. 4521–4528, Oct 2003.

[17] G. Franklin, J. Powell, and A. Emami-Naeini, Feedback Control of Dynamic Systems. Pearson Education, 2011.

[18] B. Liptak, Instrument Engineers’ Handbook, Fourth Edition, Volume One: Process Measurement and Analysis, ser. Instrument Engineers’ Handbook. Taylor & Francis, 2003. [Online]. Available:

http://books.google.pt/books?id=a05NAvaqfcUC

[19] K. Ogata, Modern Control Engineering, ser. Instrumentation and controls series. Prentice Hall, 2010.

[20] C. Huddleston, Intelligent Sensor Design Using the Microchip dsPIC, ser. Embedded Technology.

Elsevier Science, 2006. [Online]. Available: http://books.google.pt/books?id=YYdZJrU09gIC [21] K. Astr¨om and R. Murray, Feedback Systems: An Introduction for Scientists and Engineers.

Princeton University Press, 2010. [Online]. Available: http://books.google.pt/books?id=

cdG9fNqTDS8C

[22] Microchip, “High-performance, 16-bit digital signal controllers dspic30f3014/4013 data sheet,” 2010.

[23] ——, “High-performance digital signal controllers dspic30f family reference manual,” 2006.

[24] ——, “dspic language tools libraries,” 2004.

[25] ——, “Mplab c30 c compiler user guide,” 2007.

[26] T. Instruments, “Using pwm output as a digital-to-analog converter on a tms320f280x digital signal controller, application report,” 2008.

[27] U. Tietze, C. Schenk, C. Schenk, and E. Schmid, Electronic circuits: design and applications.

Springer-Verlag, 1991.

Source Code A

1 # i n c l u d e " L i b r a r y \ l i b r a r y . h "

3 // C o n f i g u r a t i o n b i t s

5 // C l o c k s w i t c h i n g and f a i l s a f e m o n i t o r d i s a b l e d // I n t e r n a l RC o s c i l l a t o r is the c l o c k s o u r c e ( 7 . 3 7 MHz ) 7 // 16 x P L L e n a b l e d

_ F O S C ( C S W _ F S C M _ O F F & F R C _ P L L 1 6 ) ; 9

// w a t c h d o g t i m e r off 11 _ F W D T ( W D T _ O F F ) ;

13 // D e c l a r i n g PID c o n t r o l l e r g a i n c o e f f i c i e n t s v a r i a b l e s f r a c t i o n a l k p U p ;

15 f r a c t i o n a l k i U p ; f r a c t i o n a l k d U p ; 17

f r a c t i o n a l k p D o w n ; 19 f r a c t i o n a l k i D o w n ; f r a c t i o n a l k d D o w n ; 21

// PID o u t p u t v a l u e r i g h t a f t e r s h u t t i n g off the h i g h v o l t a g e s u p p l y 23 f r a c t i o n a l u F i e l d ;

f r a c t i o n a l d F i e l d ; 25

// D e c l a r i n g PID c o n t r o l l e r g a i n c o e f i c i e n t s E E P R O M a d r e s s e s 27 _ p r o g _ a d d r e s s T e e k p U p _ a d d r e s s ;

_ p r o g _ a d d r e s s T e e k i U p _ a d d r e s s ; 29 _ p r o g _ a d d r e s s T e e k d U p _ a d d r e s s ; 31 _ p r o g _ a d d r e s s T e e k p D o w n _ a d d r e s s ;

_ p r o g _ a d d r e s s T e e k i D o w n _ a d d r e s s ; 33 _ p r o g _ a d d r e s s T e e k d D o w n _ a d d r e s s ; 35 _ p r o g _ a d d r e s s T e e u F i e l d _ a d d r e s s ; _ p r o g _ a d d r e s s T e e d F i e l d _ a d d r e s s ; 37

// D e c l a r i n g PID c o n t r o l l e r g a i n c o e f i c i e n t s E E P R O M v a r i a b l e s 39 int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k p U p ;

int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k i U p ; 41 int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k d U p ; 43 int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k p D o w n ;

int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k i D o w n ; 45 int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k d D o w n ; 47 int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e u F i e l d ; int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e d F i e l d ; 49

// D e c l a r i n g and i n i t i a l i z i n g v a r i a b l e s

51 u n s i g n e d int o p _ m o d e = 2; // D e f i n e s the o p e r a t i o n m o d e : 1 or 2 PID c o n t r o l l e r s 53 // ADC i n t e r r u p t s f r e q u e n c y

// t i m e r 4 f r e q u e n c y in Hz 55 f l o a t c o n v f r e q = 2 5 0 0 0 . ; 57 // O u t p u t pwm f r e q u e n c y

// t i m e r 2 f r e q u e n c y in Hz 59 f l o a t f r e q _ o u t p u t = 2 5 0 0 0 . ;

61 // D e f i n e s the t i m e i n t e r v a l in w h i c h s a t u r a t i o n o c c u r s // t i m e r 5 f r e q u e n c y in Hz

63 f l o a t f r e q _ p u l s e = 2 0 0 . ; // 5 ms 65

67 int m a i n (v o i d) {

69 _ i n i t _ p r o g _ a d d r e s s ( e e k p U p _ a d d r e s s , e e k p U p ) ; /* get a d d r e s s in p r o g r a m s p a c e */

_ i n i t _ p r o g _ a d d r e s s ( e e k i U p _ a d d r e s s , e e k i U p ) ; /* get a d d r e s s in p r o g r a m s p a c e */

71 _ i n i t _ p r o g _ a d d r e s s ( e e k d U p _ a d d r e s s , e e k d U p ) ; /* get a d d r e s s in p r o g r a m s p a c e */

_ i n i t _ p r o g _ a d d r e s s ( e e k p D o w n _ a d d r e s s , e e k p D o w n ) ; /* get a d d r e s s in p r o g r a m s p a c e */

73 _ i n i t _ p r o g _ a d d r e s s ( e e k i D o w n _ a d d r e s s , e e k i D o w n ) ; /* get a d d r e s s in p r o g r a m s p a c e */

_ i n i t _ p r o g _ a d d r e s s ( e e k d D o w n _ a d d r e s s , e e k d D o w n ) ; /* get a d d r e s s in p r o g r a m s p a c e */

75

_ i n i t _ p r o g _ a d d r e s s ( e e u F i e l d _ a d d r e s s , e e u F i e l d ) ; /* get a d d r e s s in p r o g r a m s p a c e */

77 _ i n i t _ p r o g _ a d d r e s s ( e e d F i e l d _ a d d r e s s , e e d F i e l d ) ; /* get a d d r e s s in p r o g r a m s p a c e */

79 d e f i n e _ i n t e r r u p t s _ p r i o r i t y () ;

81 // C o m p u t e the v a l u e of the f i e l d w h i c h w h e n r e a c h e d the h i g h v o l t a g e s u p p l y is t u r n e d off c o m p a r e = (int) ( p e r c e n t *(f l o a t) ( H i g h F i e l d + 3 2 7 6 8 ) ) -32768;

83

// R e a d p a r a m e t e r s f r o m E E P R O M 85 k p U p = r e a d _ e e p r o m ( e e k p U p _ a d d r e s s ) ;

k i U p = r e a d _ e e p r o m ( e e k i U p _ a d d r e s s ) ; 87 k d U p = r e a d _ e e p r o m ( e e k d U p _ a d d r e s s ) ;

k p D o w n = r e a d _ e e p r o m ( e e k p D o w n _ a d d r e s s ) ; 89 k i D o w n = r e a d _ e e p r o m ( e e k i D o w n _ a d d r e s s ) ; k d D o w n = r e a d _ e e p r o m ( e e k d D o w n _ a d d r e s s ) ; 91

u F i e l d = r e a d _ e e p r o m ( e e u F i e l d _ a d d r e s s ) ; 93 d F i e l d = r e a d _ e e p r o m ( e e d F i e l d _ a d d r e s s ) ; 95 // If t h e r e ’ s no v a l u e s s a v e d yet ...

if( k p U p == 0 && k i U p == 0 && k d U p == 0 && k p D o w n == 0 && k i D o w n == 0 && k d D o w n ==0 ) 97 {

k p U p = 2 4 0 0 ;

99 k i U p = 33;

k d U p = 1 0 0 ; 101

k p D o w n = 15;

103 k i D o w n = 10;

k d D o w n = 1 0 0 ; 105

u F i e l d = 2 9 5 0 0 ;

107 d F i e l d = -17308;

109 /* e r a s e an e e p r o m d a t a row */

e r a s e _ e e p r o m _ r o w ( e e k p U p _ a d d r e s s ) ; 111

w r i t e _ e e p r o m ( e e k p U p _ a d d r e s s , k p U p ) ; 113 w r i t e _ e e p r o m ( e e k i U p _ a d d r e s s , k i U p ) ; w r i t e _ e e p r o m ( e e k d U p _ a d d r e s s , k d U p ) ; 115 w r i t e _ e e p r o m ( e e k p D o w n _ a d d r e s s , k p D o w n ) ;

w r i t e _ e e p r o m ( e e k i D o w n _ a d d r e s s , k i D o w n ) ; 117 w r i t e _ e e p r o m ( e e k d D o w n _ a d d r e s s , k d D o w n ) ; w r i t e _ e e p r o m ( e e u F i e l d _ a d d r e s s , u F i e l d ) ; 119 w r i t e _ e e p r o m ( e e d F i e l d _ a d d r e s s , d F i e l d ) ;

} 121

w h i l e(1) 123 {

// C o n f i g u r i n g U A R T 2 r e g i s t e r s 125 c o n f i g u r e _ u a r t 2 () ;

127 // M e n u f u n c t i o n m e n u () ; 129

// D i s a b l e u a r t 2 i n t e r r u p t s and t u r n off the U A R T m o d u l e . 131 I E C 1 b i t s . U 2 T X I E = 0;

I E C 1 b i t s . U 2 R X I E = 0;

133 C l o s e U A R T 2 () ; 135 c o n f i g u r e _ a d c () ; 137 s w i t c h( o p _ m o d e )

{

139 c a s e1:

// PID c o n t r o l l e r I n i t i a l i z a t i o n

141 P I D _ i n i t i a l i z a t i o n (& f o o P I D U p , & a b c C o e f f i c i e n t U p [3] , k C o e f f s U p , kpUp , kiUp , k d U p ) ; y =0;

143 b r e a k;

c a s e2:

145 y =1;

// PID c o n t r o l l e r s I n i t i a l i z a t i o n

147 P I D _ i n i t i a l i z a t i o n (& f o o P I D D o w n , & a b c C o e f f i c i e n t D o w n [3] , k C o e f f s D o w n , kpDown , kiDown , k d D o w n ) ; P I D _ i n i t i a l i z a t i o n (& f o o P I D U p , & a b c C o e f f i c i e n t U p [3] , k C o e f f s U p , kpUp , kiUp , k d U p ) ;

149

// C o n f i g u r a t i o n of the c h a n g e N o t i f i c a t i o n P i n s 151 C N c o n f i g u r a t i o n _ p u l s e s () ;

153 // G e n e r a t i n g p u l s e s f u n c t i o n s o p e n _ t i m e r 3 ( f r e q _ p u l s e ) ; 155 o u t p u t _ c o m p a r e _ s i n g l e _ p u l s e _ l o w () ;

o u t p u t _ c o m p a r e _ s i n g l e _ p u l s e _ h i g h () ;

157 b r e a k;

d e f a u l t:

159 // PID c o n t r o l l e r I n i t i a l i z a t i o n

P I D _ i n i t i a l i z a t i o n (& f o o P I D U p , & a b c C o e f f i c i e n t U p [3] , k C o e f f s U p , kpUp , kiUp , k d U p ) ;

161 y =0;

b r e a k;

163 }

165

// C o n f i g u r e s the t i m e r to l i m i t the t i m e i n t e r v a l t h a t the H i g h V o l t a g e S u p p l y is On 167 o p e n _ t i m e r 5 ( f r e q _ p u l s e ) ; // 5 ms

I E C 1 b i t s . T 5 I E = 1; // E n a b l e t i m e r i n t e r r u p t s

169 // T h i s t i m e r is t u r n e d On w h e n t h e r e ’ s a p u l s e c o m m a n d Low - > H i g h

171 // C o n f i g u r e s the t i m e r t h a t s e t s the f r e q u e n c y at w h i c h the AD s a m p l i n g + c o n v e r s i o n is d o n e o p e n _ t i m e r 4 ( c o n v f r e q ) ;

173 I E C 1 b i t s . T 4 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s // T h i s t i m e r is t u r n e d On w h e n t h e r e ’ s a p u l s e c o m m a n d 175

// C o n f i g u r e s the t i m e r to g e n e r a t e the PWM o u t p u t 177 o p e n _ t i m e r 2 ( f r e q _ o u t p u t ) ;

179 // PWM p u l s e c o n f i g u r a t i o n c o n f i g u r e _ p w m () ; 181

T 2 C O N b i t s . TON = 1; // T u r n T i m e r 2 On

183 s e t _ P W M _ d u t y _ c y c l e ((u n s i g n e d int) ( 0 . 0 0 0 1 * PR2 ) ) ; 185 T 3 C O N b i t s . TON = 1; // T u r n T i m e r 3 On

187 T 4 C O N b i t s . TON = 1; // T u r n T i m e r 4 On 189 if( o p _ m o d e = = 2 )

{

191 // C o n f i g u r e s the I n t e r r u p t to s t o p the c o n t r o l l e r and E n a b l e s the C h a n g e N o t i f i c a t i o n I n t e r r u p t s C N c o n f i g u r a t i o n _ M a s t e r I n t e r r u p t () ;

193 L A T B b i t s . L A T B 6 = 0;

} 195

L A T B b i t s . L A T B 9 = 1;

197 d e l a y _ m s (1) ; L A T B b i t s . L A T B 9 = 0;

199

w h i l e( P O R T C b i t s . R C 1 4 ) ; 201

A D C O N 1 b i t s . S A M P = 0;

203 T 4 C O N b i t s . TON = 0; // T u r n T i m e r 1 Off 205 w h i l e( I F S 0 b i t s . A D I F ! = 0 ) ;

207 C N E N 1 b i t s . C N 6 I E = 0;

C N E N 1 b i t s . C N 7 I E = 0;

209

// y =0;

211 p r i n t f (" \ n \ r S t o p . ") ;

T 3 C O N b i t s . TON = 0; // T u r n T i m e r 3 Off 213 T 2 C O N b i t s . TON = 0; // T u r n T i m e r 2 Off 215 r e s e t _ t i m e r 3 _ r e g i s t e r s () ;

r e s e t _ t i m e r 2 _ r e g i s t e r s () ; 217 r e s e t _ t i m e r 1 _ r e g i s t e r s () ; 219 r e s e t _ O C 1 _ r e g i s t e r s () ;

r e s e t _ O C 3 _ r e g i s t e r s () ; 221

r e s e t _ p w m _ r e g i s t e r s () ; 223

r e t u r n 0;

233 }

235 v o i d d e f i n e _ i n t e r r u p t s _ p r i o r i t y ( v o i d) {

237 // 1 - lowest , 7 - h i g h e s t p r i o r i t y

239 // S e l e c t i n g the i n t e r r u p t p r i o r i t y for T i m e r 4 ( e n a b l e s AD s a m p l i n g ) i n t e r r u p t s I P C 0 b i t s . T 4 I P = 6;

241

I P C 5 b i t s . T 5 I P = 7;

243

// S e l e c t i n g the i n t e r r u p t p r i o r i t y for ADC i n t e r r u p t s 245 I P C 2 b i t s . A D I P = 4;

247 // S e l e c t i n g the i n t e r r u p t p r i o r i t y for CN i n t e r r u p t s I P C 3 b i t s . C N I P = 5;

249

// S e l e c t i n g the i n t e r r u p t p r i o r i t y for U A R T 2 ( R e c e i v e r and T r a n s m i t t e r ) i n t e r r u p t s 251 I P C 6 b i t s . U 2 R X I P = 3;

I P C 6 b i t s . U 2 T X I P = 2;

253 }

Listing A.1: main.c

1 # i n c l u d e < p 3 0 F 4 0 1 3 . h > // d e f i n e s os d s p i c r e g i s t e r s

# i n c l u d e < s t d i o . h > // s t a n d a r t IO l i b r a r y C 3 # i n c l u d e < l i b p i c 3 0 . h > // C30 c o m p i l e r d e f i n i t i o n s

# i n c l u d e < u a r t . h > // U A R T ( s e r i a l p o r t ) f u n c t i o n and u t i l i t i e s l i b r a r y 5 # i n c l u d e < t i m e r . h > // t i m e r l i b r a r y

# i n c l u d e < s t r i n g . h >

7 # i n c l u d e < dsp . h > // d i g i t a l s i g n a l p r o c e s s i n g l i b r a r y

# d e f i n e FCY ((l o n g) 7 3 7 2 ) // i n s t r u c t i o n f r e q u e n c y in kHz 9

// g l o b a l v a r i a b l e s u s e d in s e v e r a l f u n c t i o n s 11

// V a r i a b l e t h a t s e t s PID o p e r a t i o n 13 e x t e r n int y ;

15 e x t e r n c h a r R X b u f f e r [ 8 0 ] ; e x t e r n int s t r _ p o s ; 17

e x t e r n _ p r o g _ a d d r e s s T e e k p U p _ a d d r e s s ; 19 e x t e r n _ p r o g _ a d d r e s s T e e k i U p _ a d d r e s s ; e x t e r n _ p r o g _ a d d r e s s T e e k d U p _ a d d r e s s ; 21

e x t e r n _ p r o g _ a d d r e s s T e e k p D o w n _ a d d r e s s ; 23 e x t e r n _ p r o g _ a d d r e s s T e e k i D o w n _ a d d r e s s ; e x t e r n _ p r o g _ a d d r e s s T e e k d D o w n _ a d d r e s s ; 25

e x t e r n _ p r o g _ a d d r e s s T e e u F i e l d _ a d d r e s s ; 27 e x t e r n _ p r o g _ a d d r e s s T e e d F i e l d _ a d d r e s s ;

29 e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k p U p ; e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k i U p ; 31 e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k d U p ; 33 e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k p D o w n ;

e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k i D o w n ; 35 e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e k d D o w n ; 37 e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e u F i e l d ; e x t e r n int _ _ a t t r i b u t e _ _ (( s p a c e ( e e d a t a ) , a l i g n e d (s i z e o f(int) ) ) ) e e d F i e l d ; 39

e x t e r n u n s i g n e d int o p _ m o d e ; 41

e x t e r n u n s i g n e d int v _ a u x ; 43

e x t e r n t P I D f o o P I D U p ; 45 e x t e r n t P I D f o o P I D D o w n ;

e x t e r n f r a c t i o n a l a b c C o e f f i c i e n t U p [3] _ _ a t t r i b u t e _ _ (( s e c t i o n (" . xbss , bss , x m e m o r y ") ) ) ; 47 e x t e r n f r a c t i o n a l a b c C o e f f i c i e n t D o w n [3] _ _ a t t r i b u t e _ _ (( s e c t i o n (" . xbss , bss , x m e m o r y ") ) ) ;

e x t e r n f r a c t i o n a l c o n t r o l H i s t o r y [3] _ _ a t t r i b u t e _ _ (( s e c t i o n (" . ybss , bss , y m e m o r y ") ) ) ; 49 e x t e r n f r a c t i o n a l k C o e f f s U p [];

e x t e r n f r a c t i o n a l k C o e f f s D o w n [];

51

// PID c o n t r o l l e r g a i n c o e f f i c i e n t s 53 e x t e r n f r a c t i o n a l k p U p ;

e x t e r n f r a c t i o n a l k i U p ; 55 e x t e r n f r a c t i o n a l k d U p ; 57 e x t e r n f r a c t i o n a l k p D o w n ;

e x t e r n f r a c t i o n a l k i D o w n ; 59 e x t e r n f r a c t i o n a l k d D o w n ; 61 e x t e r n f r a c t i o n a l H i g h F i e l d ;

e x t e r n f r a c t i o n a l L o w F i e l d ; 63 e x t e r n f r a c t i o n a l u F i e l d ;

e x t e r n f r a c t i o n a l d F i e l d ; 65 e x t e r n int C o n t r o l E r r o r ; 67 e x t e r n f l o a t p e r c e n t ;

e x t e r n int c o m p a r e ; 69

e x t e r n s i g n e d l o n g int P I D o u t p u t ; 71 e x t e r n u n s i g n e d int P I D o u t p u t M i n ; e x t e r n u n s i g n e d int P I D o u t p u t M a x ; 73

75 // t i m e r 1 f r e q u e n c y in Hz e x t e r n f l o a t c o n v f r e q ; 77

// t i m e r 2 f r e q u e n c y in Hz 79 e x t e r n f l o a t f r e q _ o u t p u t ; 81 // t i m e r 3 f r e q u e n c y in Hz

e x t e r n f l o a t f r e q _ p u l s e ; 83

// r e f e r e n c e s i g n a l d u t y c y c l e 85 e x t e r n f l o a t D _ r e f ; 87

/* U A R T 1 */

89 v o i d c o n f i g u r e _ u a r t 2 (v o i d) ;

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ U 1 R X I n t e r r u p t (v o i d) ; 91 v o i d E r a s e R X b u f f e r () ;

93 /* T i m e r */

v o i d o p e n _ t i m e r 1 (f l o a t c l f r e q ) ; 95 v o i d r e s e t _ t i m e r 1 _ r e g i s t e r s (v o i d) ;

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 1 I n t e r r u p t (v o i d) ; 97 v o i d o p e n _ t i m e r 2 (f l o a t c l f r e q ) ;

v o i d r e s e t _ t i m e r 2 _ r e g i s t e r s (v o i d) ;

99 v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 2 I n t e r r u p t (v o i d) ; v o i d o p e n _ t i m e r 3 (f l o a t c l f r e q ) ;

101 v o i d r e s e t _ t i m e r 3 _ r e g i s t e r s (v o i d) ;

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 3 I n t e r r u p t (v o i d) ; 103 v o i d o p e n _ t i m e r 4 (f l o a t c l f r e q ) ;

v o i d r e s e t _ t i m e r 4 _ r e g i s t e r s (v o i d) ;

105 v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 4 I n t e r r u p t (v o i d) ; v o i d o p e n _ t i m e r 5 (f l o a t c l f r e q ) ;

107 v o i d r e s e t _ t i m e r 5 _ r e g i s t e r s (v o i d) ;

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 5 I n t e r r u p t (v o i d) ; 109

111 /* PWM */

v o i d c o n f i g u r e _ p w m (v o i d) ; 113 v o i d r e s e t _ p w m _ r e g i s t e r s (v o i d) ;

v o i d s e t _ P W M _ d u t y _ c y c l e (s i g n e d l o n g int P I D o u t p u t ) ; 115 v o i d o u t p u t _ c o m p a r e _ s i n g l e _ p u l s e _ l o w (v o i d) ;

v o i d r e s e t _ O C 1 _ r e g i s t e r s (v o i d) ;

117 v o i d o u t p u t _ c o m p a r e _ s i n g l e _ p u l s e _ h i g h (v o i d) ; v o i d r e s e t _ O C 3 _ r e g i s t e r s (v o i d) ;

119 /* ADC */

121 v o i d c o n f i g u r e _ a d c (v o i d) ;

v o i d r e s e t _ a d c _ c o n t r o l _ r e g i s t e r s (v o i d) ;

123 v o i d _ _ a t t r i b u t e _ _ ( ( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ A D C I n t e r r u p t ( v o i d ) ; 125 /* E E P R O M r o u t i n e s */

v o i d w r i t e _ e e p r o m ( _ p r o g _ a d d r e s s T l o c a t i o n , int v a l u e ) ; 127 int r e a d _ e e p r o m ( _ p r o g _ a d d r e s s T l o c a t i o n ) ;

v o i d e r a s e _ e e p r o m _ r o w ( _ p r o g _ a d d r e s s T l o c a t i o n ) ; 129

/* d e l a y _ m s f u n c t i o n */

131 v o i d d e l a y _ m s (u n s i g n e d int d e l a y ) ;// D e l a y in m i l i s e c o n d s 133 /* PID c o n t r o l l e r */

v o i d P I D _ i n i t i a l i z a t i o n ( t P I D * fooPID , f r a c t i o n a l a b c C o e f f i c i e n t [3] , f r a c t i o n a l k C o e f f s [3] , f r a c t i o n a l kp , f r a c t i o n a l ki , f r a c t i o n a l kd ) ; 135 v o i d P I D _ c o n t r o l ( t P I D * fooPID , f r a c t i o n a l r e f e r e n c e , f r a c t i o n a l m e a s u r e d ) ;

137 /* M e n u */

v o i d m e n u (v o i d) ;

139 v o i d p r i n t _ p a r a m e t e r s (v o i d) ; v o i d s a v e _ o u t p u t _ v a l u e (v o i d) ; 141

/* C h a n g e N o t i f i c a t i o n */

143 v o i d C N c o n f i g u r a t i o n _ p u l s e s (v o i d) ; v o i d C N c o n f i g u r a t i o n _ M a s t e r I n t e r r u p t (v o i d) ;

145 v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ ) ) _ C N I n t e r r u p t (v o i d) ; 147 /* m a i n f u n c t i o n */

int m a i n () ;

149 v o i d d e f i n e _ i n t e r r u p t s _ p r i o r i t y ( v o i d) ;

Listing A.2: library.h

# i n c l u d e " l i b r a r y . h "

2

/* V a r i a b l e D e c l a r a t i o n r e q u i r e d for e a c h PID c o n t r o l l e r */

4 /* PID D a t a S t r u c t u r e s D e c l a r a t i o n */

t P I D f o o P I D D o w n ; 6 t P I D f o o P I D U p ;

8 /* The f o o P I D d a t a s t r u c t u r e c o n t a i n s a p o i n t e r to d e r i v e d c o e f f i c i e n t s in X - s p a c e and */

/* p o i n t e r to c o n t r o l e r s t a t e ( h i s t o r y ) s a m p l e s in Y - s p a c e . So d e c l a r e v a r i a b l e s for the */

10 /* d e r i v e d c o e f f i c i e n t s and the c o n t r o l l e r h i s t o r y s a m p l e s */

f r a c t i o n a l a b c C o e f f i c i e n t D o w n [3] _ _ a t t r i b u t e _ _ (( s e c t i o n (" . xbss , bss , x m e m o r y ") ) ) ; 12 f r a c t i o n a l a b c C o e f f i c i e n t U p [3] _ _ a t t r i b u t e _ _ (( s e c t i o n (" . xbss , bss , x m e m o r y ") ) ) ; 14 f r a c t i o n a l c o n t r o l H i s t o r y [3] _ _ a t t r i b u t e _ _ (( s e c t i o n (" . ybss , bss , y m e m o r y ") ) ) ; 16 /* The a b c C o e f f i c i e n t s r e f e r e n c e d by the f o o P I D d a t a s t r u c t u r e */

/* are d e r i v e d f r o m the g a i n c o e f f i c i e n t s , Kp , Ki and Kd */

18 /* Kp , Ki and Kd a r r a y d e c l a r a t i o n */

f r a c t i o n a l k C o e f f s D o w n [] = {0 ,0 ,0};

20 f r a c t i o n a l k C o e f f s U p [] = {0 ,0 ,0};

22

v o i d P I D _ i n i t i a l i z a t i o n ( t P I D * fooPID , f r a c t i o n a l a b c C o e f f i c i e n t [3] , f r a c t i o n a l k C o e f f s [3] , f r a c t i o n a l kp , f r a c t i o n a l ki , f r a c t i o n a l kd ) 24 {

/* I n i t i a l i z e the PID d a t a s t r u c t u r e */

26 fooPID - > a b c C o e f f i c i e n t s = & a b c C o e f f i c i e n t [ 0 ] ; /* Set up p o i n t e r to d e r i v e d c o e f f i c i e n t s */

fooPID - > c o n t r o l H i s t o r y = & c o n t r o l H i s t o r y [ 0 ] ; /* Set up p o i n t e r to c o n t r o l l e r h i s t o r y s a m p l e s */

28 P I D I n i t (&* f o o P I D ) ; /* C l e a r the c o n t r o l e r h i s t o r y and the c o n t r o l l e r o u t p u t */

30 k C o e f f s [0] = kp ; k C o e f f s [1] = ki ; 32 k C o e f f s [2] = kd ;

34 P I D C o e f f C a l c (& k C o e f f s [0] , &* f o o P I D ) ; /* D e r i v e the a , b , & c c o e f f i c i e n t s f r o m the Kp , Ki & Kd */

} 36

v o i d P I D _ c o n t r o l ( t P I D * fooPID , f r a c t i o n a l r e f e r e n c e , f r a c t i o n a l m e a s u r e d ) 38 {

/* Use the PID C o n t r o l l e r */

40 fooPID - > c o n t r o l R e f e r e n c e = r e f e r e n c e ; /* Set the R e f e r e n c e I n p u t for y o u r c o n t r o l l e r */

fooPID - > m e a s u r e d O u t p u t = m e a s u r e d ; /* The m e a s u r e d O u t p u t v a r i a b l e is the p l a n t r e s p o n s e */

42 /* m e a s u r e d f r o m the A / D i n p u t RB7 . */

1 # i n c l u d e " l i b r a r y . h "

3 int y =0;

5 f r a c t i o n a l H i g h F i e l d = 2 7 9 6 8 ; f r a c t i o n a l L o w F i e l d = - 3 2 7 5 2 ; 7 int C o n t r o l E r r o r = 3 2 7 5 2 ;

f l o a t p e r c e n t = 0 . 8 4 ; 9 int c o m p a r e ;

11 // f l o a t P I D o u t p u t _ f l o a t = 0.;

s i g n e d l o n g int P I D o u t p u t = 0;

13 u n s i g n e d int P I D o u t p u t M i n = 0;

u n s i g n e d int P I D o u t p u t M a x = 0;

15

u n s i g n e d int v _ a u x = 1;

17

v o i d c o n f i g u r e _ a d c (v o i d) 19 {

// C o n f i g u r i n g RB0 & RB1 as V r e f a n a l o g i n p u t s 21 T R I S B b i t s . T R I S B 0 =1;

T R I S B b i t s . T R I S B 1 =1;

23

// C o n f i g u r i n g RB7 & RB3 as a n a l o g i n p u t s . 25 T R I S B b i t s . T R I S B 7 =1;

T R I S B b i t s . T R I S B 3 =1;

27

// T u r n i n g on the h i g h v o l t a g e s u p p l y 29 T R I S B b i t s . T R I S B 6 =0;

L A T B b i t s . L A T B 6 = 0;

31

// I n i t i a l i z i n g bit 33 T R I S B b i t s . T R I S B 9 =0;

L A T B b i t s . L A T B 9 = 0;

35

// RE2 as d i g i t a l o u t p u t for m e a s u r i n g p u r p o s e s 37 T R I S B b i t s . T R I S B 1 1 =0;

L A T B b i t s . L A T B 1 1 = 0;

39

// A / D c o n f i g u r a t i o n 41 // ADC C o n t r o l R e g i s t e r s

43 // A D P C F G : A / D P o r t C o n f i g u r a t i o n R e g i s t e r A D P C F G = 0 x F F F F ; // RB0 , RB1 , RB7 & RB3 = a n a l o g

45 // RB4 , RB5 , RB6 = d i g i t a l

A D P C F G b i t s . P C F G 0 = 0;

47 A D P C F G b i t s . P C F G 1 = 0;

A D P C F G b i t s . P C F G 3 = 0;

49 A D P C F G b i t s . P C F G 7 = 0;

51 // A D C S S L : A / D I n p u t S c a n S e l e c t R e g i s t e r A D C S S L = 0 x 0 0 0 0 ;

53

// A D C H S : A / D I n p u t S e l e c t R e g i s t e r

55 A D C H S b i t s . C H 0 S A = 0 b 0 1 1 1 ;// AN7 as C h a n n e l 0 p o s i t i v e i n p u t for MUX A 57 // A D C O N 1 : A / D C o n t r o l R e g i s t e r 1

A D C O N 1 = 0 x 0 0 0 0 ;

59 A D C O N 1 b i t s . A D O N = 0; // A / D c o n v e r t e r is off ;

A D C O N 1 b i t s . A D S I D L = 0; // C o n t i n u e m o d u l e o p e r a t i o n in I d l e m o d e 61 A D C O N 1 b i t s . F O R M = 0 b11 ; // D a t a O u t p u t F o r m a t b i t s - S i g n e d F r a c t i o n a l

A D C O N 1 b i t s . S S R C = 0 b 1 1 1 ; // I n t e r n a l c o u n t e r e n d s s a m p l i n g and s t a r t s c o n v e r s i o n ( a u t o c o n v e r t ) 63 A D C O N 1 b i t s . A S A M = 0; // S a m p l i n g b e g i n s i m m e d i a t e l y a f t e r l a s t c o n v e r s i o n c o m p l e t e s . S A M P bit is a u t o set

A D C O N 1 b i t s . S A M P = 0; // A / D S a m p l e E n a b l e bit 65 A D C O N 1 b i t s . D O N E = 0; // A / D C o n v e r s i o n S t a t u s bit 67 // A D C O N 2 : A / D C o n t r o l R e g i s t e r 2

A D C O N 2 = 0 x 0 0 0 0 ;

69 A D C O N 2 b i t s . V C F G = 0 b 0 1 1 ; // V r e f = E x t e r n a l V r e f pin ; - V r e f = E x t e r n a l V r e f pin

A D C O N 2 b i t s . C S C N A = 0; // S c a n I n p u t S e l e c t i o n s for CH0 + S / H I n p u t for MUX A I n p u t M u l t i p l e x e r S e t t i n g bit 71 A D C O N 2 b i t s . B U F S = 0; // B u f f e r F i l l S t a t u s bit

A D C O N 2 b i t s . S M P I = 0 b 0 0 0 0 ; // I n t e r r u p t s at the c o m p l e t i o n of c o n v e r s i o n for e a c h s a m p l e / c o n v e r t s e q u e n c e 73 A D C O N 2 b i t s . B U F M = 0; // B u f f e r c o n f i g u r e d as one 16 - w o r d b u f f e r A D C B U F ( 1 5 . . . 0 . )

A D C O N 2 b i t s . A L T S = 0; // A l t e r n a t e b e t w e e n MUX A and MUX B i n p u t m u l t i p l e x e r 75

// A D C O N 3 : A / D C o n t r o l R e g i s t e r 3 77 A D C O N 3 = 0 x 0 0 0 0 ;

A D C O N 3 b i t s . S A M C = 1; // Auto - S a m p l e T i m e b i t s - 1 Tad 79 A D C O N 3 b i t s . A D R C = 1; // C l o c k d e r i v e d f r o m s y s t e m c l o c k

A D C O N 3 b i t s . A D C S = 19; // Tad = i n t e r n a l 10 Tcy 81

I F S 0 b i t s . A D I F = 0;

83 I E C 0 b i t s . A D I E =1; // A / D C o n v e r s i o n C o m p l e t e I n t e r r u p t E n a b l e bit 85 A D C O N 1 b i t s . A D O N = 1; // t u r n ADC ON

87 }

89 v o i d r e s e t _ a d c _ c o n t r o l _ r e g i s t e r s (v o i d) {

91 A D C O N 1 b i t s . A D O N = 0;// t u r n ADC OFF 93 A D P C F G = 0 x 0 0 0 0 ;

L A T D b i t s . L A T D 2 = 0;

95 A D C S S L = 0 x 0 0 0 0 ; A D C H S = 0 x 0 0 0 0 ; 97 A D C O N 1 = 0 x 0 0 0 0 ;

A D C O N 2 = 0 x 0 0 0 0 ; 99 A D C O N 3 = 0 x 0 0 0 0 ; I F S 0 b i t s . A D I F = 0;

101 I E C 0 b i t s . A D I E = 0;

103 }

105 v o i d _ _ a t t r i b u t e _ _ ( ( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ A D C I n t e r r u p t ( v o i d ) {

107 // ~26 us

109 I F S 0 b i t s . A D I F = 0;

A D C O N 1 b i t s . S A M P = 0;

111

// A D C B U F 0 - > m e a s u r e d o u t p u t v o l t a g e - > RB7 113

s w i t c h( y ) 115 {

c a s e -1:

117

v _ a u x = 1;

119 if( abs ((int) L o w F i e l d - (int) A D C B U F 0 ) < C o n t r o l E r r o r ) P I D _ c o n t r o l (& f o o P I D D o w n , L o w F i e l d , A D C B U F 0 ) ; // ~24 us 121

/* * * * * * * * * * * * ~ 0 . 6 us * * * * * * * * * * */

123 P I D o u t p u t = _ _ b u i l t i n _ m u l s u ( f o o P I D D o w n . c o n t r o l O u t p u t , P I D o u t p u t M a x ) > > 15;

125 if( P I D o u t p u t < P I D o u t p u t M i n ) P I D o u t p u t = P I D o u t p u t M i n ; 127 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * */

129 s e t _ P W M _ d u t y _ c y c l e ( P I D o u t p u t ) ; 131 L A T B b i t s . L A T B 1 1 = 0;

b r e a k;

133 135

c a s e 1:

137

if( v _ a u x !=0 )

139 {

L A T B b i t s . L A T B 6 = ((int) ( A D C B U F 0 ) < c o m p a r e ) ? 1 : 0;

141 v _ a u x = L A T B b i t s . L A T B 6 ; 143 // P I D I n i t (& f o o P I D U p ) ;

// If t h e r e ’ s a v a l u e s a v e d for the PID o u t p u t

145 if( u F i e l d > 0)

// f o o P I D U p . c o n t r o l O u t p u t = ( int ) ( p e r c e n t * u F i e l d ) ; 147 f o o P I D U p . c o n t r o l O u t p u t = u F i e l d ;

149 } // Set pin RB6 ( H i g h v o l t a g e s u p p l y ) if A D C B U F 0 < H i g h F i e l d 151 P I D _ c o n t r o l (& f o o P I D U p , H i g h F i e l d , A D C B U F 0 ) ;// ~24 us 153 /* * * * * * * * * * * * ~ 0 . 6 us * * * * * * * * * * */

P I D o u t p u t = _ _ b u i l t i n _ m u l s u ( f o o P I D U p . c o n t r o l O u t p u t , P I D o u t p u t M a x ) > > 15;

155

if( P I D o u t p u t < P I D o u t p u t M i n ) 157 P I D o u t p u t = P I D o u t p u t M i n ;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */

159

s e t _ P W M _ d u t y _ c y c l e ( P I D o u t p u t ) ; 161

L A T B b i t s . L A T B 1 1 = 0;

163 b r e a k;

165 d e f a u l t:

y =0;

167

// A D C B U F 0 - > m e a s u r e d o u t p u t v o l t a g e - > RB7 169 P I D _ c o n t r o l (& f o o P I D U p , L o w F i e l d , A D C B U F 0 ) ; // ~24 us

171 P I D o u t p u t = _ _ b u i l t i n _ m u l s u ( f o o P I D U p . c o n t r o l O u t p u t , P I D o u t p u t M a x ) > > 15;

173 /* * * * * * * * * * * * ~ 0 . 6 us * * * * * * * * * * */

if( P I D o u t p u t < P I D o u t p u t M i n ) 175 P I D o u t p u t = P I D o u t p u t M i n ;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * */

177

s e t _ P W M _ d u t y _ c y c l e ( P I D o u t p u t ) ; 179

L A T B b i t s . L A T B 1 1 = 0;

181 b r e a k;

} 183 }

Listing A.4: adc.c

# i n c l u d e " l i b r a r y . h "

2

/* 1 ms d e l a y f u n c t i o n */

4

v o i d d e l a y _ m s (u n s i g n e d int d e l a y )// d e l a y in m i l i s e c o n d s 6 {

u n s i g n e d intc y c l e s ; // n u m b e r of c y c l e s 8 for(; d e l a y ; delay - -)

for( c y c l e s = FCY ; c y c l e s ; cycles - -) ; // ~1 ms c y c l e 10 }

Listing A.5: delay.c

# i n c l u d e " l i b r a r y . h "

2

v o i d C N c o n f i g u r a t i o n _ p u l s e s (v o i d) 4 {

// C o n f i g u r i n g RB2 , RB4 & RB5 as d i g i t a l i n p u t s . 6 T R I S B b i t s . T R I S B 4 =1; // P u l s e input , low to h i g h ( RB4 )

T R I S B b i t s . T R I S B 5 =1; // P u l s e input , low to low ( RB5 ) 8

// E n a b l e i n t e r r u p t s for the s e e l e c t e d CN p i n s 10 C N E N 1 b i t s . C N 6 I E = 1;

C N E N 1 b i t s . C N 7 I E = 1;

12 C N E N 1 b i t s . C N 4 I E = 0;

} 14

v o i d C N c o n f i g u r a t i o n _ M a s t e r I n t e r r u p t (v o i d) 16 {

// R C 1 4 as d i g i t a l i n p u t 18 T R I S C b i t s . T R I S C 1 4 =1;

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ C N I n t e r r u p t (v o i d) 28 {

// C l e a r i n t e r r u p t f l a g

30 I F S 0 b i t s . C N I F = 0;

32 if( P O R T B b i t s . RB4 ==1 && C N E N 1 b i t s . C N 6 I E == 1) // ( i n p u t p u l s e f r o m RD2 / OC3 ) {

34 y = 1;

I E C 1 b i t s . T 4 I E = 1; // E n a b l e t i m e r i n t e r r u p t s 36 f o o P I D U p . c o n t r o l O u t p u t = f o o P I D D o w n . c o n t r o l O u t p u t ;

T 5 C O N b i t s . TON = 1; // T u r n T i m e r 5 On

38 L A T B b i t s . L A T B 6 = 1; // S a t u r a t i o n p u l s e ( t u r n s On the h i g h v o l t a g e s u p p l y ) C N E N 1 b i t s . C N 6 I E = 0;

40 C N E N 1 b i t s . C N 7 I E = 0;

C N E N 1 b i t s . C N 4 I E = 1;

42 // p r i n t f ("\ r \ n O r d e m de s u b i d a !") ; }

44 e l s e if( P O R T B b i t s . RB5 ==1 && C N E N 1 b i t s . C N 7 I E == 1) // ( i n p u t p u l s e f r o m RD0 / OC1 ) {

46 y = -1;

I E C 1 b i t s . T 4 I E = 1; // E n a b l e t i m e r i n t e r r u p t s

48 f o o P I D D o w n . c o n t r o l O u t p u t = ( d F i e l d < f o o P I D U p . c o n t r o l O u t p u t ) ? d F i e l d : f o o P I D U p . c o n t r o l O u t p u t ; 50 C N E N 1 b i t s . C N 6 I E = 1;

C N E N 1 b i t s . C N 7 I E = 0;

52 }

54 e l s e if( P O R T B b i t s . RB2 ==1 && C N E N 1 b i t s . C N 4 I E == 1) // ( i n p u t p u l s e f r o m RD0 / OC1 ) {

56 L A T B b i t s . L A T B 6 = 0; // S a t u r a t i o n p u l s e ( t u r n s Off the h i g h v o l t a g e s u p p l y ) C N E N 1 b i t s . C N 4 I E = 0;

58 C N E N 1 b i t s . C N 6 I E = 0;

C N E N 1 b i t s . C N 7 I E = 1;

60

// If t h e r e ’ s a v a l u e s a v e d for the PID o u t p u t

62 if( u F i e l d > 0)

f o o P I D U p . c o n t r o l O u t p u t = u F i e l d ;

64 }

66 }

Listing A.6: ChangeNotification.c

# i n c l u d e " l i b r a r y . h "

2

4 v o i d m e n u (v o i d) {

6 // M e n u a u x i l i a r y v a r i a b l e s int o p t i o n = -1 , a u x _ l o o p = 1;

8 int aux = -1;

f l o a t a u x _ p = -1. , a u x _ i = -1. , a u x _ d = -1.;

10 f r a c t i o n a l a u x i _ p = -1 , a u x i _ i = -1 , a u x i _ d = -1;

12 w h i l e( a u x _ l o o p ) {

14

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r 16 E r a s e R X b u f f e r () ;

p r i n t _ p a r a m e t e r s () ; 18

p r i n t f (" \ r \ n \ n ") ;

20 p r i n t f (" \ r W h a t do you w a n t to do ? T y p e the o p t i o n n u m b e r and p r e s s e n t e r .\ n ") ; p r i n t f (" \ r0 - S t a r t the PID c o n t r o l l e r p r o g r a m .\ n ") ;

22 p r i n t f (" \ r1 - C h a n g i n g the c o n t r o l l e r p a r a m e t e r s ( R i s e ) .\ n ") ;

p r i n t f (" \ r2 - C h a n g i n g the c o n t r o l l e r p a r a m e t e r s ( F a l l ) ( C o n t r o l l e r for 1 PID m o d e ) .\ n ") ; 24 p r i n t f (" \ r3 - C h a n g i n g M a g n e t i c F i e l d s .\ n ") ;

p r i n t f (" \ r4 - C h a n g i n g the S a m p l i n g f r e q u e n c y .\ n ") ; 26 p r i n t f (" \ r5 - C h a n g i n g the f i e l d c o m m u t a t i o n f r e q u e n c y .\ n ") ;

p r i n t f (" \ r6 - C h a n g i n g the f r e q u e n c y of the o u t p u t s i g n a l ( PWM ) .\ n ") ; 28 p r i n t f (" \ r7 - S a v i n g the C o n t r o l l e r p a r a m e t e r s to the E E P R O M .\ n \ r ") ;

p r i n t f (" \ r8 - C h a n g i n g the o p e r a t i o n m o d e .\ n \ r ") ; 30

w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 32

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

34 {

s s c a n f ( R X b u f f e r , " % d ", & o p t i o n ) ; 36

s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r 38 E r a s e R X b u f f e r () ;

s w i t c h( o p t i o n )

40 {

c a s e0: // S t a r t the PID c o n t r o l l e r p r o g r a m

42 a u x _ l o o p = 0;

p r i n t f (" \ r \ n R u n n i n g . . . \ n \ r ") ;

44 b r e a k;

c a s e1: // C h a n g i n g the c o n t r o l l e r p a r a m e t e r s

46 w h i l e( aux ! = 3 )

{

48 p r i n t f (" \ r \ n R i s e ") ;

p r i n t f (" \ r \ n \ rKp \ t Ki \ t Kd \ n \ r ") ;

50 w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

52 if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d {

54 aux = s s c a n f ( R X b u f f e r ," % d % d % d ", & auxi_p , & auxi_i , & a u x i _ d ) ;

56 if( aux !=3 /* || a u x _ p + a u x _ i + a u x _ d > 0 . 9 9 9 9 9 */|| auxi_p <0 || auxi_i <0 || auxi_d <0) {

58 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

p r i n t f (" \ r N o t e : P a r a m e t e r s v a l u e s m u s t be p o s i t i v e s and s u c h t h a t Kp + Ki + Kd < 3 2 7 6 8 . \ n \ n \ r ") ;

60 }

e l s e

62 {

k p U p = a u x i _ p ;

64 k i U p = a u x i _ i ;

k d U p = a u x i _ d ;

66 p r i n t f (" \ r \ n \ n S u c c e s s ! P a r a m e t e r s v a l u e s c h a n g e d !\ n \ n ") ; c o n t i n u e;

68 }

}

70 s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

E r a s e R X b u f f e r () ;

72 }

b r e a k;

74 c a s e2: // C h a n g i n g the c o n t r o l l e r p a r a m e t e r s w h i l e( aux ! = 3 )

76 {

p r i n t f (" \ r \ n F a l l ") ;

78 p r i n t f (" \ r \ n \ rKp \ t Ki \ t Kd \ n \ r ") ;

w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 80

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

82 {

aux = s s c a n f ( R X b u f f e r ," % d % d % d ", & auxi_p , & auxi_i , & a u x i _ d ) ; 84

if( aux !=3 /* || a u x _ p + a u x _ i + a u x _ d > 0 . 9 9 9 9 9 */|| auxi_p <0 || auxi_i <0 || auxi_d <0)

86 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

88 p r i n t f (" \ r N o t e : P a r a m e t e r s v a l u e s m u s t be p o s i t i v e s and s u c h t h a t Kp + Ki + Kd < 3 2 7 6 8 . \ n \ n \ r ") ; }

90 e l s e

{

92 k p D o w n = a u x i _ p ;

k i D o w n = a u x i _ i ;

94 k d D o w n = a u x i _ d ;

p r i n t f (" \ r \ n \ n S u c c e s s ! P a r a m e t e r s v a l u e s c h a n g e d !\ n \ n ") ;

96 c o n t i n u e;

}

98 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

100 E r a s e R X b u f f e r () ;

}

102 b r e a k;

c a s e3: // C h a n g i n g M a g n e t i c F i e l d V a l u e R e f e r e n c e s

104 w h i l e( aux ! = 1 )

{

106 p r i n t f (" \ r \ n \ r H i g h M a g n e t i c F i e l d [ -2048 , 2 0 4 7 ] ([ -32768 , 3 2 7 5 2 ] ) :\ t ") ; w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

108

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

110 {

aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ; 112

if( aux !=1 /* || a u x _ p < 0. */|| a u x i _ p > 2 0 4 7 )

114 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

116 p r i n t f (" \ r N o t e : H i g h M a g n e t i c F i e l d m u s t be b e t w e e n [ -2048 , 2 0 4 7 ] ") ; }

118 e l s e

{

120 H i g h F i e l d = a u x i _ p * 1 6 ;

c o m p a r e = (int) ( p e r c e n t *(f l o a t) ( H i g h F i e l d + 3 2 7 6 8 ) ) -32768;

122 p r i n t f (" \ r \ n \ n S u c c e s s ! H i g h M a g n e t i c F i e l d c h a n g e d !\ n \ n ") ; c o n t i n u e;

124 }

}

126 s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r E r a s e R X b u f f e r () ;

128 }

s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

130 E r a s e R X b u f f e r () ;

o p t i o n = -1;

132 aux = -1;

a u x i _ p = a u x i _ i = a u x i _ d = -1;

134 w h i l e( aux ! = 1 )

{

136 p r i n t f (" \ r \ n \ r L o w M a g n e t i c F i e l d [ -2048 , 2 0 4 7 ] ([ -32768 , 3 2 7 5 2 ] ) :\ t ") ; w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

138

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

140 {

aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ;

142 L o w F i e l d = a u x i _ p * 1 6 ;

p r i n t f (" \ r \ n \ n S u c c e s s ! Low M a g n e t i c F i e l d c h a n g e d !\ n \ n ") ;

144 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

146 E r a s e R X b u f f e r () ;

}

148 b r e a k;

c a s e4: // C h a n g i n g the S a m p l i n g f r e q u e n c y

150 w h i l e( aux ! = 1 )

{

152 p r i n t f (" \ r \ n \ r S a m p l i n g f r e q u e n c y :\ t ") ; w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 154

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

156 {

aux = s s c a n f ( R X b u f f e r ," % f ", & a u x _ p ) ; 158

if( aux !=1 || a u x _ p < 2. || a u x _ p > 3 0 0 0 0 . )

160 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

162 p r i n t f (" \ r N o t e : AD f r e q u e n c y m u s t be b e t w e e n 2 and 3 0 0 0 0 Hz . ") ; }

164 e l s e

{

166 c o n v f r e q = a u x _ p ;

p r i n t f (" \ r \ n \ n S u c c e s s ! S a m p l i n g f r e q u e n c y c h a n g e d !\ n \ n ") ;

168 c o n t i n u e;

}

170 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

172 E r a s e R X b u f f e r () ;

}

174 b r e a k;

c a s e5: // C h a n g i n g the H i g h V o l t a g e P u l s e d u r a t i o n

176 w h i l e( aux ! = 1 )

{

178 p r i n t f (" \ r \ n \ r P u l s e d u r a t i o n in ms :\ t ") ;

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

188 p r i n t f (" \ r N o t e : P u l s e d u r a t i o n s h o u l d be b e t w e e n 0 and 8 ms . ") ; }

190 e l s e

{

192 f r e q _ p u l s e = 1/( a u x _ p * 0 . 0 0 1 ) ;

p r i n t f (" \ r \ n \ n S u c c e s s ! S w i t c h i n g f r e q u e n c y c h a n g e d !\ n \ n ") ;

194 c o n t i n u e;

}

196 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

198 E r a s e R X b u f f e r () ;

}

200 b r e a k;

c a s e6: // C h a n g i n g the f r e q u e n c y of the o u t p u t s i g n a l ( PWM )

202 w h i l e( aux ! = 1 )

{

204 p r i n t f (" \ r \ n \ r O u t p u t S i g n a l f r e q u e n c y :\ t ") ; w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 206

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

208 {

aux = s s c a n f ( R X b u f f e r ," % f ", & a u x _ p ) ; 210

if( aux !=1 || a u x _ p < 8 0 0 0 . )

212 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

214 p r i n t f (" \ r N o t e : O u t p u t S i g n a l f r e q u e n c y m u s t be o v e r 8 0 0 0 Hz . ") ; }

216 e l s e

{

218 f r e q _ o u t p u t = a u x _ p ;

p r i n t f (" \ r \ n \ n S u c c e s s ! O u t p u t S i g n a l f r e q u e n c y c h a n g e d !\ n \ n ") ;

220 c o n t i n u e;

}

222 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

224 E r a s e R X b u f f e r () ;

}

226 b r e a k;

c a s e7: // S a v i n g the C o n t r o l l e r p a r a m e t e r s to the E E P R O M

228 e r a s e _ e e p r o m _ r o w ( e e k p U p _ a d d r e s s ) ; /* e r a s e an e e p r o m d a t a row */

230 w r i t e _ e e p r o m ( e e k p U p _ a d d r e s s , k p U p ) ; w r i t e _ e e p r o m ( e e k i U p _ a d d r e s s , k i U p ) ; 232 w r i t e _ e e p r o m ( e e k d U p _ a d d r e s s , k d U p ) ;

w r i t e _ e e p r o m ( e e k p D o w n _ a d d r e s s , k p D o w n ) ; 234 w r i t e _ e e p r o m ( e e k i D o w n _ a d d r e s s , k i D o w n ) ; w r i t e _ e e p r o m ( e e k d D o w n _ a d d r e s s , k d D o w n ) ; 236 w r i t e _ e e p r o m ( e e u F i e l d _ a d d r e s s , u F i e l d ) ; w r i t e _ e e p r o m ( e e d F i e l d _ a d d r e s s , d F i e l d ) ;

238 p r i n t f (" \ r \ n \ r S u c c e s s ! C o n t r o l l e r p a r a m e t e r s s a v e d . ") ;

s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

240 E r a s e R X b u f f e r () ;

b r e a k;

242 c a s e8: // C h a n g i n g the o p e r a t i o n m o d e w h i l e( aux ! = 1 )

244 {

p r i n t f (" \ r \ n \ r O p e r a t i o n M o d e :\ n ") ; 246 p r i n t f (" \ r1 - One PID c o n t r o l l e r \ n ") ;

p r i n t f (" \ r2 - Two PID c o n t r o l l e r s \ n \ r ") ; 248 w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

250 if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d {

252 aux = s s c a n f ( R X b u f f e r ," % f ", & a u x _ p ) ;

254 if( aux !=1 || a u x _ p <1 || a u x _ p >2)

{

256 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

p r i n t f (" \ r N o t e : C h o o s e 1 or 2 PID c o n t r o l l e r s . ") ;

258 }

e l s e

260 {

o p _ m o d e = a u x _ p ;

262 p r i n t f (" \ r \ n \ n S u c c e s s ! % d PID o p e r a t i o n m o d e \ n \ n ", o p _ m o d e ) ; c o n t i n u e;

264 }

}

266 s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r E r a s e R X b u f f e r () ;

268 }

c a s e9:

270 w h i l e( aux ! = 1 )

{

272 p r i n t f (" \ r \ n \ r P e r c e n t a g e m :\ t ") ;

w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 274

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

276 {

aux = s s c a n f ( R X b u f f e r ," % f ", & a u x _ p ) ; 278

if( aux !=1 || aux >1 || aux <0)

280 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

282 p r i n t f (" \ r N o t e : V a l u e m u s t be b e t w e e n 0 and 1. ") ; }

284 e l s e

{

286 p e r c e n t = a u x _ p ;

c o m p a r e = (int) ( p e r c e n t *(f l o a t) ( H i g h F i e l d + 3 2 7 6 8 ) ) -32768;

288 p r i n t f (" \ r \ n \ n S u c c e s s ! P e r c e n t a g e m : % f \ n \ n ", p e r c e n t ) ; c o n t i n u e;

290 }

}

292 s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r E r a s e R X b u f f e r () ;

294 }

b r e a k;

296 c a s e10:

w h i l e( aux ! = 1 )

298 {

p r i n t f (" \ r \ n \ r u F i e l d :\ t ") ;

300 w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

302 if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

{

304 aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ;

306 if( aux !=1 || auxi_p < 2 0 0 0 0 )

{

308 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; }

310 e l s e

{

312 u F i e l d = a u x i _ p ;

p r i n t f (" \ r \ n \ n S u c c e s s ! u F i e l d : % d \ n \ n ", u F i e l d ) ;

314 c o n t i n u e;

}

316 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

318 E r a s e R X b u f f e r () ;

}

320 b r e a k;

c a s e11:

322 w h i l e( aux ! = 1 )

{

324 p r i n t f (" \ r \ n \ r d F i e l d :\ t ") ;

w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 326

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

328 {

aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ; 330

if( aux ! = 1 )

332 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ;

334 }

e l s e

336 {

d F i e l d = a u x i _ p ;

338 p r i n t f (" \ r \ n \ n S u c c e s s ! d F i e l d : % d \ n \ n ", d F i e l d ) ; c o n t i n u e;

340 }

}

342 s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r E r a s e R X b u f f e r () ;

344 }

b r e a k;

346 c a s e 12:

w h i l e( aux ! = 1 )

348 {

p r i n t f (" \ r \ n \ r C o n t r o l E r r o r :\ t ") ;

350 w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

352 if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d {

354 aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ;

356 if( aux ! = 1 )

{

358 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; }

360 e l s e

{

362 C o n t r o l E r r o r = a u x i _ p ;

p r i n t f (" \ r \ n \ n S u c c e s s ! C o n t r o l E r r o r : % d \ n \ n ", C o n t r o l E r r o r ) ;

364 c o n t i n u e;

}

366 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r

368 E r a s e R X b u f f e r () ;

}

370 b r e a k;

d e f a u l t:

372 p r i n t f (" \ r E R R O R : c o m m a n d not f o u n d \ n \ r ") ; b r e a k;

374 }

s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r 376 E r a s e R X b u f f e r () ;

o p t i o n = -1;

378 aux = -1;

a u x _ p = a u x _ i = a u x _ d = -1;

380 a u x i _ p = a u x i _ i = a u x i _ d = -1;

}

382 }

s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r 384 E r a s e R X b u f f e r () ;

} 386

v o i d s a v e _ o u t p u t _ v a l u e (v o i d) 388 {

int aux = -1;

390 int a u x i _ p = -1;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

392

w h i l e( aux ! = 1 ) 394 {

p r i n t f (" \ r \ n \ n S a v e new O u t p u t v a l u e s ? ") ; 396 p r i n t f (" 1 - YES , 0 - NO ") ;

w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 398

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

400 {

aux = s s c a n f ( R X b u f f e r , " % d ", & a u x i _ p ) ; 402

if( aux ! = 1 )

404 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; }

406 s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r E r a s e R X b u f f e r () ;

408 }

410 if( a u x i _ p = = 1 )

p r i n t f (" \ r \ n P r e s s 0 to c o n t i n u e .\ r \ n ") ; 420 w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g

422 if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d {

424 aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ;

426 if( aux ! = 1 )

{

428 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; p r i n t f (" \ r N o t e : 1 - YES , 0 - NO ") ;

430 }

e l s e

432 {

if( a u x i _ p = = 1 )

434 u F i e l d = f o o P I D U p . c o n t r o l O u t p u t ; e l s e if( a u x i _ p = = 0 )

436 p r i n t f (" \ r \ n O u t p u t v a l u e not s a v e d . . . \ n \ n ") ; e l s e

438 {

aux =1;

440 p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; p r i n t f (" \ r N o t e : 1 - YES , 0 - NO ") ; 442

}

444 }

446 p r i n t f (" \ r \ n \ n C u r r e n t v a l u e s a v e d - u F i e l d :\ t % d ", u F i e l d ) ;

448 }

s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r 450 E r a s e R X b u f f e r () ;

} 452

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

454

aux = -1;

456 a u x i _ p = -1;

458 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

460

w h i l e( aux ! = 1 )

462 {

p r i n t f (" \ r \ n \ n P I D O u t p u t v a l u e : % d ", f o o P I D D o w n . c o n t r o l O u t p u t ) ; 464 p r i n t f (" \ r \ n \ n C u r r e n t v a l u e s a v e d : % d ", d F i e l d ) ;

p r i n t f (" \ r \ n \ n P r e s s 1 to c h a n g e the o u t p u t v a l u e s a v e d . ") ; 466 p r i n t f (" \ r \ n P r e s s 0 to c o n t i n u e .\ r \ n ") ;

w h i l e ( R X b u f f e r [ str_pos - 1 ] ! = 0 x0D ) ;// do n o t h i n g 468

if ( R X b u f f e r [ str_pos - 1 ] = = 0 x0D )// d e t e c t e d p o s s i b l e c o m m a n d

470 {

aux = s s c a n f ( R X b u f f e r ," % d ", & a u x i _ p ) ; 472

if( aux ! = 1 )

474 {

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; 476 p r i n t f (" \ r N o t e : 1 - YES , 0 - NO ") ;

}

478 e l s e

{

480 if( a u x i _ p = = 1 )

d F i e l d = f o o P I D D o w n . c o n t r o l O u t p u t ;

482 e l s e if( a u x i _ p = = 0 )

p r i n t f (" \ r \ n O u t p u t v a l u e not s a v e d . . . \ n \ n ") ;

484 e l s e

{

486 aux =1;

p r i n t f (" \ r \ n E r r o r !\ n \ n ") ; 488 p r i n t f (" \ r N o t e : 1 - YES , 0 - NO ") ;

490 }

} 492

p r i n t f (" \ r \ n \ n C u r r e n t v a l u e s a v e d - d F i e l d :\ t % d ", d F i e l d ) ; 494

}

496 s t r _ p o s = 0;// r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r E r a s e R X b u f f e r () ;

498 }

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

500

p r i n t f (" \ r \ n \ n W r i t i n g to the E E P R O M . . . . ") ; 502 /* e r a s e an e e p r o m d a t a row */

e r a s e _ e e p r o m _ r o w ( e e k p U p _ a d d r e s s ) ; 504

w r i t e _ e e p r o m ( e e k p U p _ a d d r e s s , k p U p ) ; 506 w r i t e _ e e p r o m ( e e k i U p _ a d d r e s s , k i U p ) ; w r i t e _ e e p r o m ( e e k d U p _ a d d r e s s , k d U p ) ; 508 w r i t e _ e e p r o m ( e e k p D o w n _ a d d r e s s , k p D o w n ) ;

w r i t e _ e e p r o m ( e e k i D o w n _ a d d r e s s , k i D o w n ) ; 510 w r i t e _ e e p r o m ( e e k d D o w n _ a d d r e s s , k d D o w n ) ; w r i t e _ e e p r o m ( e e u F i e l d _ a d d r e s s , u F i e l d ) ; 512 w r i t e _ e e p r o m ( e e d F i e l d _ a d d r e s s , d F i e l d ) ;

}

514 e l s e

p r i n t f (" \ r \ n V a l u e s not s a v e d ... ") ; 516 }

518 v o i d p r i n t _ p a r a m e t e r s (v o i d) {

520 p r i n t f (" \ n \ n \ n \ r P I D c o n t r o l l e r p r o g r a m ") ;

p r i n t f (" \ r \ n - - - -\ n ") ; 522 p r i n t f (" \ r \ n - - - -\ n ") ;

s w i t c h ( o p _ m o d e ) 524 {

c a s e 1:

526 p r i n t f (" \ r \ n \ tKp \ t Ki \ t Kd \ n ") ;

p r i n t f (" \ r \ t % d \ t % d \ t % d \ n ", kpDown , kiDown , k d D o w n ) ;

528 b r e a k;

c a s e 2:

530 p r i n t f (" \ r \ n R i s e ") ;

p r i n t f (" \ r \ n \ tKp \ t Ki \ t Kd \ n ") ;

532 p r i n t f (" \ r \ t % d \ t % d \ t % d \ n ", kpUp , kiUp , k d U p ) ; p r i n t f (" \ r \ n F a l l ") ;

534 p r i n t f (" \ r \ n \ tKp \ t Ki \ t Kd \ n ") ;

p r i n t f (" \ r \ t % d \ t % d \ t % d \ n ", kpDown , kiDown , k d D o w n ) ;

536 b r e a k;

d e f a u l t:

538 p r i n t f (" \ r D e f a u l t M o d e : 1 PID \ n \ n ") ; p r i n t f (" \ r \ n \ tKp \ t Ki \ t Kd \ n ") ;

540 p r i n t f (" \ r \ t % d \ t % d \ t % d \ n ", kpDown , kiDown , k d D o w n ) ; b r e a k;

542 }

544 p r i n t f (" \ r \ n \ t H i g h M a g n e t i c F i e l d [ -2048 , 2 0 4 7 ] ([ -32768 , 3 2 7 5 2 ] ) \ n ") ; p r i n t f (" \ r \ t % d \ t (% d ) \ n ", H i g h F i e l d /16 , H i g h F i e l d ) ;

546 p r i n t f (" \ r \ n \ t L o w M a g n e t i c F i e l d [ -2048 , 2 0 4 7 ] ([ -32768 , 3 2 7 5 2 ] ) \ n ") ; p r i n t f (" \ r \ t % d \ t (% d ) \ n ", L o w F i e l d /16 , L o w F i e l d ) ;

548 p r i n t f (" \ r \ n \ t C o m p a r a d o r :\ n ") ; p r i n t f (" \ r \ t % d \ n ", c o m p a r e ) ; 550 p r i n t f (" \ r \ n \ t P e r c e n t a g e m :\ n ") ;

p r i n t f (" \ r \ t % f \ n ", p e r c e n t ) ; 552 p r i n t f (" \ r \ n \ t S a m p l i n g f r e q u e n c y \ n ") ;

p r i n t f (" \ r \ t % 5 . 2 f \ n ", c o n v f r e q ) ;

554 p r i n t f (" \ r \ n \ t H i g h V o l t a g e p u l s e d u r a t i o n \ n ") ; p r i n t f (" \ r \ t % 1 . 1 f ms \ n ", 1 0 0 0 / f r e q _ p u l s e ) ; 556 p r i n t f (" \ r \ n \ t O u t p u t s i g n a l f r e q u e n c y \ n ") ;

p r i n t f (" \ r \ t % 5 . 2 f \ n ", f r e q _ o u t p u t ) ;

558 p r i n t f (" \ r \ n \ n O p e r a t i o n m o d e : \ t % d PID \ n \ n ", o p _ m o d e ) ; p r i n t f (" \ r \ n \ n C u r r e n t v a l u e s s a v e d : ") ;

560 p r i n t f (" \ r \ n u F i e l d : % d ", u F i e l d ) ; p r i n t f (" \ r \ n d F i e l d : % d ", d F i e l d ) ; 562

p r i n t f (" \ r \ n - - - -\ n ") ; 564 p r i n t f (" \ r \ n - - - -\ n ") ;

}

Listing A.7: menu.c

# i n c l u d e " l i b r a r y . h "

2

v o i d c o n f i g u r e _ p w m (v o i d) 4 {

O C 3 C O N = 0 x 0 0 0 0 ; // T u r n off C o m p a r e 2 M o d u l e

6 O C 3 C O N b i t s . OCM = 0 b 1 1 0 ; // PWM m o d e of o p e r a t i o n , F a u l t pin d i s a b l e d O C 3 C O N b i t s . O C T S E L = 0; // T i m e r 2 is the c l o c k s o u r c e for c o m p a r e

8 O C 3 R S = 0;

O C 3 R = 0;

10 }

12 v o i d r e s e t _ p w m _ r e g i s t e r s (v o i d) {

14 O C 3 C O N = 0 x 0 0 0 0 ; // T u r n off C o m p a r e 2 M o d u l e O C 3 R S = 0;

16 }

18 v o i d s e t _ P W M _ d u t y _ c y c l e (s i g n e d l o n g int P I D o u t p u t ) {

20 O C 3 R S = P I D o u t p u t ; // p r i n t f ("% d \ r \ n " , O C 2 R S ) ; 22 }

24 /* G e n e r a t i n g p u l s e s f u n c t i o n s */

v o i d o u t p u t _ c o m p a r e _ s i n g l e _ p u l s e _ h i g h (v o i d) 26 {

O C 1 C O N = 0 x 0 0 0 0 ; // T u r n off C o m p a r e 1 M o d u l e

28 O C 1 C O N b i t s . OCM = 0 b 1 0 1 ; // G e n e r a t e c o n t i n u o u s o u t p u t p u l s e s on OC1 pin ( OC1 - > RB5 ) O C 1 C O N b i t s . O C T S E L = 1; // T i m e r 3 is the c l o c k s o u r c e for c o m p a r e

30 O C 1 R = (u n s i g n e d int) PR3 *3/4 -2;

O C 1 R S = (u n s i g n e d int) PR3 * 3 / 4 + 2 ; 32 }

34 v o i d r e s e t _ O C 1 _ r e g i s t e r s (v o i d) {

36 O C 1 C O N = 0 x 0 0 0 0 ; // T u r n off C o m p a r e 1 M o d u l e O C 1 R S = 0;

38 }

40 v o i d o u t p u t _ c o m p a r e _ s i n g l e _ p u l s e _ l o w (v o i d) {

42 O C 4 C O N = 0 x 0 0 0 0 ; // T u r n off C o m p a r e 3 M o d u l e

O C 4 C O N b i t s . OCM = 0 b 1 0 1 ; // G e n e r a t e c o n t i n u o u s o u t p u t p u l s e s on OC3 pin ( OC4 - > RB4 ) 44 O C 4 C O N b i t s . O C T S E L = 1; // T i m e r 3 is the c l o c k s o u r c e for c o m p a r e

O C 4 R = (u n s i g n e d int) PR3 /4 -2;

46 O C 4 R S = (u n s i g n e d int) PR3 / 4 + 2 ; }

48

v o i d r e s e t _ O C 3 _ r e g i s t e r s (v o i d) 50 {

O C 4 C O N = 0 x 0 0 0 0 ; // T u r n off C o m p a r e 3 M o d u l e

52 O C 4 R S = 0;

}

Listing A.8: pwm.c

# i n c l u d e " l i b r a r y . h "

2 int a u x i l i a r =0;

// t i m e r 1 s e t s the f r e q u e n c y at w h i c h the AD s a m p l i n g + c o n v e r s i o n is d o n e 4 v o i d o p e n _ t i m e r 1 (f l o a t c l f r e q )

{ 6

f l o a t p r e s c a l e r = 1.;

8

T M R 1 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r 10 T 1 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

12 T 1 C O N b i t s . TCS = 0; // T i m e r C l o c k S o u r c e : I n t e r n a l C l o c k ( F o s c /4)

}

22 e l s e if( clfreq >2 && clfreq < 4 5 0 ) {

24 T 1 C O N b i t s . T C K P S = 0 b11 ; // C l o c k P r e s c a l e 1 : 2 5 6 p r e s c a l e r = 1 . / 2 5 6 . ;

26 }

PR1 = (u n s i g n e d int) ( 2 9 4 9 1 2 0 0 . / c l f r e q * p r e s c a l e r - 1) ; 28 // F o s c * PLL /4 = 2 9 4 9 1 2 0 0

30 I F S 0 b i t s . T 1 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 32 }

34 v o i d r e s e t _ t i m e r 1 _ r e g i s t e r s (v o i d) {

36 T M R 1 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r T 1 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

38 PR1 = 0;

I F S 0 b i t s . T 1 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 40 I E C 0 b i t s . T 1 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

} 42

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 1 I n t e r r u p t (v o i d) 44 {

I F S 0 b i t s . T 1 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 46 }

48

// t i m e r 2 u s e d to c r e a t e the c l o c k t h a t m a k e s the o u t p u t PWM s i g n a l 50 v o i d o p e n _ t i m e r 2 (f l o a t c l f r e q )

{ 52

f l o a t p r e s c a l e r = 1.;

54

T M R 2 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r 56 T 2 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

58 T 2 C O N b i t s . TCS = 0; // T i m e r C l o c k S o u r c e : I n t e r n a l C l o c k ( F o s c /4) T 2 C O N b i t s . T32 = 0; // 16 - bit T i m e r M o d e

60 T 2 C O N b i t s . T G A T E = 0;// T i m e r G a t e d A c c u m u l a t i o n M o d e T 2 C O N b i t s . T S I D L = 0;// C o n t i n u e T i m e r O p e r a t i o n in I d l e M o d e 62 T 2 C O N b i t s . TON = 0;

64 if( clfreq > 4 5 0 && c l f r e q < 1 4 7 4 5 6 0 0 ) {

66 T 2 C O N b i t s . T C K P S = 0 b00 ; // C l o c k P r e s c a l e 1:1 p r e s c a l e r = 1.;

68 }

e l s e if( clfreq >2 && clfreq < 4 5 0 ) 70 {

T 2 C O N b i t s . T C K P S = 0 b11 ; // C l o c k P r e s c a l e 1 : 2 5 6 72 p r e s c a l e r = 1 . / 2 5 6 . ;

} 74

PR2 = (u n s i g n e d int) ( 2 9 4 9 1 2 0 0 . / c l f r e q * p r e s c a l e r - 1) ; 76 // F o s c * PLL /4 = 2 9 4 9 1 2 0 0

78 P I D o u t p u t M i n = 1;

P I D o u t p u t M a x = (u n s i g n e d int) PR2 * 0 . 8 5 ; 80

I F S 0 b i t s . T 2 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 82 I E C 0 b i t s . T 2 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

84 }

86 v o i d r e s e t _ t i m e r 2 _ r e g i s t e r s (v o i d) {

88 T M R 2 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r T 2 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

90 PR2 = 0;

I F S 0 b i t s . T 2 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 92 I E C 0 b i t s . T 2 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

} 94

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 2 I n t e r r u p t (v o i d) 96 {

I F S 0 b i t s . T 2 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 98 }

100

// t i m e r 3 u s e d to c r e a t e the c l o c k t h a t m a k e s the r e f e r e n c e PWM s i g n a l 102 v o i d o p e n _ t i m e r 3 (f l o a t c l f r e q )

{ 104

f l o a t p r e s c a l e r = 1.;

106

T M R 3 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r 108 T 3 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

110 T 3 C O N b i t s . TCS = 0; // T i m e r C l o c k S o u r c e : I n t e r n a l C l o c k ( F o s c /4) T 3 C O N b i t s . T G A T E = 0;// T i m e r G a t e d A c c u m u l a t i o n M o d e

112 T 3 C O N b i t s . T S I D L = 0;// C o n t i n u e T i m e r O p e r a t i o n in I d l e M o d e T 3 C O N b i t s . TON = 0;

114

if( clfreq > 4 5 0 && c l f r e q < 1 4 7 4 5 6 0 0 ) 116 {

T 3 C O N b i t s . T C K P S = 0 b00 ; // C l o c k P r e s c a l e 1:1

118 p r e s c a l e r = 1.;

}

120 e l s e if( clfreq >2 && clfreq < 4 5 0 ) {

122 T 3 C O N b i t s . T C K P S = 0 b11 ; // C l o c k P r e s c a l e 1 : 2 5 6 p r e s c a l e r = 1 . / 2 5 6 . ;

124 }

PR3 = (u n s i g n e d int) ( 2 9 4 9 1 2 0 0 . / c l f r e q * p r e s c a l e r - 1) ; 126 // F o s c * PLL /4 = 2 9 4 9 1 2 0 0

128 // I P C 1 b i t s . T 2 I P =

I F S 0 b i t s . T 3 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 130 I E C 0 b i t s . T 3 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

132 }

134 v o i d r e s e t _ t i m e r 3 _ r e g i s t e r s (v o i d) {

136 T M R 3 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r

T 3 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

138 PR3 = 0;

I F S 0 b i t s . T 3 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 140 I E C 0 b i t s . T 3 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

} 142

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 3 I n t e r r u p t (v o i d) 144 {

I F S 0 b i t s . T 3 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 146 }

148 // t i m e r 4

v o i d o p e n _ t i m e r 4 (f l o a t c l f r e q ) 150 {

f l o a t p r e s c a l e r = 1.;

152

T M R 4 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r 154 T 4 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

156 T 4 C O N b i t s . TCS = 0; // T i m e r C l o c k S o u r c e : I n t e r n a l C l o c k ( F o s c /4) T 4 C O N b i t s . T G A T E = 0;// T i m e r G a t e d A c c u m u l a t i o n M o d e d i s a b l e d 158 T 4 C O N b i t s . T S I D L = 0;// C o n t i n u e T i m e r O p e r a t i o n in I d l e M o d e

T 4 C O N b i t s . TON = 0;

160

if( clfreq > 4 5 0 && c l f r e q < 1 4 7 4 5 6 0 0 ) 162 {

T 4 C O N b i t s . T C K P S = 0 b00 ; // C l o c k P r e s c a l e 1:1

164 p r e s c a l e r = 1.;

}

166 e l s e if( clfreq >2 && clfreq < 4 5 0 ) {

168 T 4 C O N b i t s . T C K P S = 0 b11 ; // C l o c k P r e s c a l e 1 : 2 5 6 p r e s c a l e r = 1 . / 2 5 6 . ;

170 }

PR4 = (u n s i g n e d int) ( 2 9 4 9 1 2 0 0 . / c l f r e q * p r e s c a l e r - 1) ; 172 // F o s c * PLL /4 = 2 9 4 9 1 2 0 0

174 // I P C 1 b i t s . T 2 I P =

I F S 1 b i t s . T 4 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 176 I E C 1 b i t s . T 4 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

178 }

180 v o i d r e s e t _ t i m e r 4 _ r e g i s t e r s (v o i d) {

182 T M R 4 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r T 4 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

184 PR4 = 0;

I F S 1 b i t s . T 4 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 186 I E C 1 b i t s . T 4 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

} 188

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 4 I n t e r r u p t (v o i d) 190 {

I F S 1 b i t s . T 4 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 192 L A T B b i t s . L A T B 1 1 = 1;

A D C O N 1 b i t s . S A M P = 1; // A / D S a m p l e E n a b l e bit 194 }

196 // t i m e r 5 u s e d to l i m i t the t i m e t h a t the H i g h V o l t a g e S o u r c e is On v o i d o p e n _ t i m e r 5 (f l o a t c l f r e q )

198 {

200 f l o a t p r e s c a l e r = 1.;

202 T M R 5 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r T 5 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r 204

T 5 C O N b i t s . TCS = 0; // T i m e r C l o c k S o u r c e : I n t e r n a l C l o c k ( F o s c /4) 206 T 5 C O N b i t s . T G A T E = 0;// T i m e r G a t e d A c c u m u l a t i o n M o d e

T 5 C O N b i t s . T S I D L = 0;// C o n t i n u e T i m e r O p e r a t i o n in I d l e M o d e 208 T 5 C O N b i t s . TON = 0;

210 if( clfreq > 4 5 0 && c l f r e q < 1 4 7 4 5 6 0 0 ) {

212 T 5 C O N b i t s . T C K P S = 0 b00 ; // C l o c k P r e s c a l e 1:1 p r e s c a l e r = 1.;

214 }

e l s e if( clfreq >2 && clfreq < 4 5 0 ) 216 {

T 5 C O N b i t s . T C K P S = 0 b11 ; // C l o c k P r e s c a l e 1 : 2 5 6 218 p r e s c a l e r = 1 . / 2 5 6 . ;

}

220 PR5 = (u n s i g n e d int) ( 2 9 4 9 1 2 0 0 . / c l f r e q * p r e s c a l e r - 1) ; // F o s c * PLL /4 = 2 9 4 9 1 2 0 0

222

I F S 1 b i t s . T 5 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 224 I E C 1 b i t s . T 5 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

226 }

228 v o i d r e s e t _ t i m e r 5 _ r e g i s t e r s (v o i d) {

230 T M R 5 = 0; // c l e a r the t i m e r c o u n t r e g i s t e r T 5 C O N =0 x 0 0 0 0 ; // r e s e t the t i m e r c o n t r o l r e g i s t e r

232 PR5 = 0;

I F S 1 b i t s . T 5 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 234 I E C 1 b i t s . T 5 I E = 0; // D i s a b l e t i m e r i n t e r r u p t s

} 236

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ T 5 I n t e r r u p t (v o i d) 238 {

I F S 1 b i t s . T 5 I F = 0; // C l e a r the i n t e r r u p t f l a g s t a t u s bit 240 L A T B b i t s . L A T B 6 = 0; // C l e a r the v _ a u x bit

C N E N 1 b i t s . C N 7 I E = 1;// E n a b l e High - > Low 242 C N E N 1 b i t s . C N 4 I E = 0;// D i s a b l e CN c o m p a r i s o n

v _ a u x = 0;

244 p r i n t f (" _ / ") ;

# i n c l u d e " l i b r a r y . h "

2

// the f u n c t i o n s w h i c h a c t u a l l y t o u c h the E E P R O M 4 v o i d e r a s e _ e e p r o m _ r o w ( _ p r o g _ a d d r e s s T l o c a t i o n )

{

6 _ e r a s e _ e e d a t a ( l o c a t i o n , _ E E _ R O W ) ; }

8 v o i d w r i t e _ e e p r o m ( _ p r o g _ a d d r e s s T l o c a t i o n , int v a l u e ) {

10 _ w a i t _ e e d a t a () ;

_ w r i t e _ e e d a t a _ w o r d ( l o c a t i o n , v a l u e ) ; 12 _ w a i t _ e e d a t a () ;

} 14

int r e a d _ e e p r o m ( _ p r o g _ a d d r e s s T l o c a t i o n ) 16 {

int t e m p ;

18 _ m e m c p y _ p 2 d 1 6 (& temp , l o c a t i o n ,s i z e o f(int) ) ; r e t u r n t e m p ;

20 }

Listing A.10: eeprom.c

# i n c l u d e " l i b r a r y . h "

2

c h a r R X b u f f e r [ 8 0 ] ;

4 // b u f f e r u s e d to s t o r e c h a r a c t e r s f r o m s e r i a l p o r t 6 int s t r _ p o s = 0;

// p o s i t i o n in the R X b u f f e r 8

v o i d c o n f i g u r e _ u a r t 2 (v o i d) ;

10 v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ U 2 R X I n t e r r u p t (v o i d) ; 12 v o i d c o n f i g u r e _ u a r t 2 (v o i d)

{

14 u n s i g n e d intU M O D E v a l u e , U 2 S T A v a l u e ; // a u x i l i a r y U A R T c o n f i g v a r i a b l e s 16 U M O D E v a l u e = U A R T _ E N & U A R T _ I D L E _ C O N & U A R T _ N O _ P A R _ 8 B I T ;

// a c t i v a t e s the u a r t in c o n t i n u o s m o d e ( no s l e e p ) and 8 bit no p a r i t y m o d e 18

U 2 S T A v a l u e = U A R T _ I N T _ T X & U A R T _ T X _ E N A B L E & U A R T _ I N T _ R X _ C H A R & U A R T _ T X _ P I N _ N O R M A L ; 20 // a c t i v a t e s i n t e r r u p t of pin Tx + e n a b l e s Tx + e n a b l e Rx i n t e r r u p t for e v e r y c h a r 22 O p e n U A R T 2 ( U M O D E v a l u e , U 2 S T A v a l u e , 15) ;

// c o n f i g u r e s and a c t i v a t e s U A R T 2 at 1 1 5 0 0 0 bps 24

U 2 S T A b i t s . U R X I S E L = 1;

26

_ U 2 R X I E = 1;

28 // 0 - I n t e r r u p t i o n off , 1 - I n t e r r u p t i o n on 30 U 2 M O D E b i t s . L P B A C K = 0;

// d i s a b l e s h a r d w a r e l o o p b a c k on U A R T 2 . E n a b l e o n l y for t e s t s 32

_ _ C 3 0 _ U A R T = 2;

34 // d e f i n e U A R T 2 as p r e d e f i n e d for use w i t h s t d i o library , p r i n t f etc }

36

v o i d _ _ a t t r i b u t e _ _ (( _ _ i n t e r r u p t _ _ , a u t o _ p s v ) ) _ U 2 R X I n t e r r u p t (v o i d) 38 {

I F S 1 b i t s . U 2 R X I F = 0; // r e s e t s and r e e n a b l e s the Rx2 i n t e r r u p t f l a g 40

// R e a d the r e c e i v e b u f f e r u n t i l at l e a s t one or m o r e c h a r a c t e r can be r e a d 42 w h i l e( U 2 S T A b i t s . U R X D A )

{

44 R X b u f f e r [ s t r _ p o s ] = U 2 R X R E G ; // s t o r e s the l a s t r e c e i v e d c h a r in the b u f f e r s t r _ p o s ++; // i n c r e m e n t s the p o s i t i o n in the b u f f e r to s t o r e the n e x t c h a r

46 if( s t r _ p o s >= 80) { s t r _ p o s = 0;}// if the l a s t p o s i t i o n is r e a c h e d t h e n r e t u r n to i n i t i a l p o s i t i o n }

48 }

50 /* E r a s e s the b u f f e r */

v o i d E r a s e R X b u f f e r () 52 {

int i ;

54 s t r _ p o s = 0; // r e t u r n s the p o i n t e r to p o s i t i o n z e r o in the c i r c u l a r b u f f e r for( i =0; i < 8 0 ; i ++) { R X b u f f e r [ i ] =’ \0 ’;} // e r a s e s the b u f f e r

56 }

Listing A.11: uart.c

Analog Control Measurements B

Figure B.1: First measurement of T1 of 5CB liquid crystal at 25.4C withf0 = 300 kHz.

Figure B.2: Second measurement of T1of 5CB liquid crystal at 25.8C withf0 = 300kHz.

Figure B.3: First measurement of T1 of 5CB liquid crystal at 24.2C withf0 = 1MHz.

Documentos relacionados