| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203 | 
							- /*
 
-     this program use old code used in another experiment
 
-     
 
-     "int" is used for the ADC and DAC data although it should be unsigned, 
 
-     it should be not a problem at all as this data are limited to 12bits...
 
- */
 
- #include <aduc7020.h>
 
- unsigned int uiPLLTST = 0;
 
- volatile unsigned int ucTest = 0;
 
- void delay (int length)
 
- {
 
- 	while (length >=0)
 
-     	length--;
 
- }
 
- // conversion of the read value into it corresponding 12bits integer
 
- int ADCtoDAT(unsigned long ADC)
 
- {
 
- 	return (ADC&0xFFF0000)>>16;
 
- }
 
- unsigned long DATtoADC(int DAT)
 
- {
 
- 	unsigned long ADC;
 
- 	ADC=DAT;
 
- 	return ADC<<16;
 
- }
 
- int Read_Digital(int n)
 
- {	
 
-     return ((GP0DAT&0x000000FF)>>n)&0x1;
 
- }
 
- void Write_Digital(int n, int state)
 
- {	
 
-     if(state==1)
 
- 	  GP1DAT=(0x00000001<<(n+16))|GP1DAT;
 
- 	else 
 
- 		GP1DAT=~((0x00000001<<(n+16))|(~GP1DAT));
 
- }
 
- void ADCpoweron(int time)
 
- {
 
- 	ADCCON = 0x620;	 			// power-on the ADC
 
- 	while (time >=0)	  		// wait for ADC to be fully powered on
 
-     time--;
 
- }
 
- // use DAC0
 
- // it operates a finite number of iteration
 
- // -> to adapte in the while loop
 
- void Lock_min_fringe(int*pV, int step, int N_delay)
 
- {
 
- 	int flag, cnt;
 
- 	unsigned long temp1,temp2;
 
- //    unsigned long V_th; // threshold
 
- 	unsigned long V;
 
- 		
 
- 	flag = 1;
 
- //    V_th=DATtoADC(threshold);
 
- 	V = *pV;//DATtoADC(2000);
 
- 	temp1 = ADCDAT;
 
- 	cnt = 0;
 
- 	
 
- 	while(cnt<100){
 
- 		//if(Read_Digital(6)==0||temp1<V_th)	break;
 
- 		//hold();
 
- 		//Write_Digital(0,1);
 
- 		V = V+flag*step;
 
- 		if(V>4096) // in case it is out of range restarting fro, the middle should converge
 
-             V = 2048;
 
- 		//V = Bound_cir(V);
 
- 		DAC0DAT = DATtoADC(V);
 
- 		delay(N_delay);	    // if the system do not respond immediately
 
- 		temp2 = ADCDAT;
 
- 		if(temp2>temp1){    // to invert in order to lock the maximum
 
- 			flag = -1*flag;	
 
- 		}	
 
- 		temp1 = temp2;
 
- 		cnt++;
 
- 	}
 
- 	//Write_Digital(0,0);
 
- 	*pV = V;
 
- }
 
- void Lock_power(int*pV, int step, int N_delay)
 
- {
 
- 	int cnt,g;
 
- 	unsigned long temp;
 
- //    unsigned long V_th; // threshold
 
- 	unsigned long V,V0;
 
- 		
 
- 	g = 1;
 
- //    V_th=DATtoADC(threshold);
 
- 	V = *pV;//DATtoADC(2000);
 
- 	temp = ADCtoDAT(ADCDAT);
 
- 	cnt = 0;
 
- 	// we first check the targeted power on ADC1
 
- 	ADCCP = 0x01;
 
- 	V0 = ADCtoDAT(ADCDAT);
 
- 	// now we only read the PD on ADC0
 
- 	ADCCP = 0x00;
 
- 	
 
- 	while(cnt<100){
 
- 		//if(Read_Digital(6)==0||temp1<V_th)	break;
 
- 		//hold();
 
- 		//Write_Digital(0,1);
 
- 		temp = ADCtoDAT(ADCDAT);
 
- 		V = V-(temp-V0)*g;
 
- 		//if(V>4096) // in case it is out of range restarting fro, the middle should converge
 
-         //    V = 2048;
 
- 		//V = Bound_cir(V);
 
- 		DAC1DAT = DATtoADC(V);
 
- 		delay(N_delay);	    // if the system do not respond immediately
 
- 		cnt++;
 
- 	}
 
- 	//Write_Digital(0,0);
 
- 	*pV = V;
 
- }
 
- void test_blink(void)
 
- {
 
- 	short V = -1;
 
- 	
 
- 	DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	
 
- 	 // configures GPIO to flash LED P4.2
 
- 	GP4DAT = 0x04000000;			// P4.2 configured as an output. LED is turned on	
 
- 	GP0CON = 0x00000000;	    // setting IO
 
- 	GP0DAT = 0x00000000;        // group P0.x as input
 
- 	DAC1DAT = DATtoADC(V); // output voltage on DAC0
 
- 	//GP4DAT ^= 0x00040000;		// Complement P4.2
 
- 	while (1){
 
- 		V = -V;
 
- 		if(V>4096)
 
- 			V = 0;
 
- 		DAC1DAT = DATtoADC(V); // output voltage on DAC0
 
- 	
 
- 		if (Read_Digital(0)==1)
 
- 			GP4DAT ^= 0x00040000;		// Complement P4.2
 
- 		delay(500000);
 
- 	}				
 
- }
 
- void test_blink2(void)
 
- {
 
- 	short V = -1;
 
- 	short state = 1;
 
- 	
 
- 	DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	
 
- 	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	
 
- 	 // configures GPIO to flash LED P4.2
 
- 	
 
- 	//GP0CON = 0x00000000;	    // setting IO
 
- 	//GP0DAT = 0x04000000;			// P4.2 configured as an output. LED is turned on	
 
- 	//GP0DAT = 0x00000000;        // group P0.x as input
 
- 	DAC1DAT = DATtoADC(V); // output voltage on DAC0
 
- 	//GP4DAT ^= 0x00040000;		// Complement P4.2
 
- 	while (1){
 
- 		V = -V;
 
- 		state=-state;
 
- 		if(V>4096)
 
- 			V = 0;
 
- 		DAC1DAT = DATtoADC(V); // output voltage on DAC0
 
- 	
 
- 		//if (Read_Digital(0)==1)
 
- 		//	GP4DAT ^= 0x00040000;		// Complement P4.2
 
- 		if(state>0)
 
- 			Write_Digital(4, 1);
 
- 		else
 
- 			Write_Digital(4, 0);
 
- 		//delay(500000);
 
- 	}
 
- 				
 
- }
 
- void test_clock(void)
 
- {
 
- 	//short V = -1;
 
- 	short state = 1;
 
- 	
 
- 	//DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	
 
- 	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	
 
- 	 // configures GPIO to flash LED P4.2
 
- 	
 
- 	//GP0CON = 0x00000000;	    // setting IO
 
- 	//GP0DAT = 0x04000000;			// P4.2 configured as an output. LED is turned on	
 
- 	//GP0DAT = 0x00000000;        // group P0.x as input
 
- 	//DAC1DAT = DATtoADC(V); // output voltage on DAC0
 
- 	//GP4DAT ^= 0x00040000;		// Complement P4.2
 
- 	while (1){
 
- 		//V = -V;
 
- 		state=-state;
 
- 		//if(V>4096)
 
- 		//	V = 0;
 
- 		//DAC1DAT = DATtoADC(V); // output voltage on DAC0
 
- 	
 
- 		//if (Read_Digital(0)==1)
 
- 		//	GP4DAT ^= 0x00040000;		// Complement P4.2
 
- 		if(state>0)
 
- 			Write_Digital(4, 1);
 
- 		else
 
- 			Write_Digital(4, 0);
 
- 		//delay(500000);
 
- 	}
 
- 				
 
- }
 
- void test_clock2(void)
 
- {
 
- 	short state = 1;
 
- 	int bit =0x00000001<<(20);
 
- 	
 
- 	POWKEY1 = 0x01;
 
- 	POWCON = 0x00;		   				// 41.78MHz
 
- 	POWKEY2 = 0xF4;
 
-    	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	
 
- 	
 
- 	while (1){
 
- 		GP1DAT^=bit;
 
- 	}
 
- 				
 
- }
 
- void ramp(void)
 
- {
 
- 	int Vout=0;
 
- 	int step=0;
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	//DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x00;	   // conversion on ADC0
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	while(1){
 
- 		if(Vout>=4095)
 
- 			step=-1;
 
- 		if(Vout<=0)
 
- 			step=1;
 
- 		Vout=Vout+step;
 
- 		DAC2DAT = DATtoADC(Vout); // output voltage on DAC2
 
- 	}
 
- }
 
- void init_digital(void)
 
- {
 
-     GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	GP0CON = 0x00000000;	// IO initialization
 
- 	GP0DAT = 0x00000000;	// set P0.n as digital input
 
- }
 
- #define SWEEP_IN 0
 
- #define CLOCK_IN 4
 
- #define SWEEP_OUT 0
 
- void synchronizer(void)
 
- {
 
- 	
 
- 	short new_sweep_in=0 ;
 
- 	short new_clock_in=0 ;
 
- 	short last_sweep_in=0;
 
- 	short last_clock_in=0;
 
- 	short armed = 0;
 
- 	init_digital();
 
- //	DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	while (1){
 
-         new_sweep_in  = Read_Digital(SWEEP_IN);
 
-         new_clock_in  = Read_Digital(CLOCK_IN);
 
- 		if(new_sweep_in==1 && last_sweep_in==0) // edge detection
 
- 			armed = 1;
 
-         if(new_clock_in==1 && last_clock_in==0 // edge detection
 
-            && armed==1)                       // + case for fireing output
 
-         {
 
-             Write_Digital(SWEEP_OUT,1);
 
-             armed = 0;
 
-         }
 
-         if(new_clock_in==0 && last_clock_in==1) // edge detection
 
-             Write_Digital(SWEEP_OUT,0);
 
- 		last_sweep_in = new_sweep_in;  // memory of the previous state
 
-         last_clock_in = new_clock_in;  // memory of the previous state
 
- 	}
 
- }
 
- void synchronizer2(void)
 
- {
 
- 	
 
- 	short new_sweep_in=0 ;
 
- 	short new_clock_in=0 ;
 
- 	short last_sweep_in=0;
 
- 	short last_clock_in=0;
 
- //	short armed = 0;
 
- 	init_digital();
 
- //	DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	while (1){
 
-         new_sweep_in  = Read_Digital(SWEEP_IN);
 
-         
 
- 		if(new_sweep_in==1 && last_sweep_in==0) // edge detection
 
- 		{	
 
- 			while(1){
 
- 				new_clock_in  = Read_Digital(CLOCK_IN);
 
- 	        	if(new_clock_in==1 && last_clock_in==0){ // edge detection
 
- 	            	Write_Digital(SWEEP_OUT,1);
 
- 					break;
 
- 				}
 
- 				last_clock_in = new_clock_in;  // memory of the previous state
 
- 	        }
 
- 			while(1){
 
-         		new_clock_in  = Read_Digital(CLOCK_IN);
 
- 	        	if(new_clock_in==0 && last_clock_in==1){ // edge detection
 
-             		Write_Digital(SWEEP_OUT,0);
 
- 					break;
 
- 				}
 
- 				last_clock_in = new_clock_in;  // memory of the previous state
 
- 	        }
 
- 		}
 
- 		last_sweep_in = new_sweep_in;  // memory of the previous state
 
-         
 
- 	}
 
- }
 
- // Bound the output value of DAC
 
- // when V reaches the limit of DAC range, it will be shifted to the center
 
- /*unsigned long Bound(unsigned long V)
 
- {
 
-     if (V > 0xFCE0000 || V < 0x320000)
 
- 		return 0x8000000;
 
- 	else
 
- 		return V;
 
- } */
 
- int Bound(int V)
 
- {
 
-     if (V > 4000)
 
- 		return 500;
 
- 	else if(V < 100)
 
- 		return 3500;
 
- 	else
 
- 		return V;
 
- }
 
- #define SH_in     0	  //  high-> lock, low -> hold
 
- #define LH_mode	  3    // high-> lock on max, low -> lock on min
 
- #define SH_disab  7   // disable the sampler & holder function
 
- // for the high mode the SH input has no effect
 
- // 
 
- void lock_EOM(void)
 
- {
 
- 	// define variables
 
- 	int N_step, N_delay, flag, N, sum, k;
 
- 	int Vout, Vin1, Vin2;
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC0CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x00;	   // conversion on ADC0
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	// locking parameters initialization
 
- 	N_step = 10;   //  step size
 
- 	N_delay = 100; // wait for certain time
 
- 	flag = 1;      // indicator for searching direction
 
- 	N = 1000;      // number for averaging measurement
 
- 	Vin1 = 0;      // initialize the voltage of first step
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		///Sweep();
 
- 		// switch between sweep mode and locking mode;
 
- 		// note that the sweep mode is just for the convenience of the experiment,
 
- 		// for locking the phase, it is not necessary.
 
- 		///Write_Digital(0,1); // Output a high level digital output on pin P1.0 for indicating the locking mode.
 
- 		if(Read_Digital(SH_disab)==1 || Read_Digital(SH_in)==1){
 
- 			Vout = Vout + flag * N_step; // calculate the voltage for next step
 
- 			Vout = Bound(Vout); // limit the range of V
 
- 			DAC0DAT = DATtoADC(Vout); // output voltage on DAC0
 
- 			delay(N_delay); //wait for a certain time for the response of PZT
 
-         	// input average over N samples in order to filter out highest frequencies noise
 
- 			sum = 0; // initialization
 
- 			for(k = 1; k <= N; k++){
 
- 				while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 				sum += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			}
 
- 			Vin2 = sum/N;	// calculate average value for the voltage of second step
 
- 			if(Vin2 < Vin1 && Read_Digital(LH_mode)==1) flag = -1 * flag; // change maximum searching direction if V2 < V1
 
- 			else if(Vin2 > Vin1 && Read_Digital(LH_mode)==0) flag = -1 * flag; // change minimum searching direction if V2 > V1
 
- 			Vin1 = Vin2; // update the voltage of first step
 
- 		}
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void lock_EOM2(void)
 
- {
 
- 	// define variables
 
- 	int N_step, N_delay, flag0,flag1, N, sum, k;
 
- 	int Vout0, Vin0a, Vin0b;
 
- 	int Vout1, Vin1a, Vin1b;
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC0CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x00;	   // conversion on ADC0
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	// locking parameters initialization
 
- 	N_step = 20;   //  step size
 
- 	N_delay = 10; // wait for certain time
 
- 	flag0 = 1;      // indicator for searching direction
 
- 	flag1 = 1;      // indicator for searching direction
 
- 	N = 200;      // number for averaging measurement
 
- 	Vin0a = 0;      // initialize the voltage of first step
 
- 	Vin1a = 0;      // initialize the voltage of first step
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		///Sweep();
 
- 		// switch between sweep mode and locking mode;
 
- 		// note that the sweep mode is just for the convenience of the experiment,
 
- 		// for locking the phase, it is not necessary.
 
- 		///Write_Digital(0,1); // Output a high level digital output on pin P1.0 for indicating the locking mode.
 
- 		if(Read_Digital(SH_disab)==1 || Read_Digital(SH_in)==1){
 
- 			Vout0 = Vout0 + flag0 * N_step; // calculate the voltage for next step
 
- 			Vout0 = Bound(Vout0); // limit the range of V
 
- 			DAC0DAT = DATtoADC(Vout0); // output voltage on DAC0
 
- 			
 
- 			Vout1 = Vout1 + flag1 * N_step; // calculate the voltage for next step
 
- 			Vout1 = Bound(Vout1); // limit the range of V
 
- 			DAC1DAT = DATtoADC(Vout1); // output voltage on DAC0
 
- 			
 
- 			
 
- 			delay(N_delay); //wait for a certain time for the response of PZT
 
-         	// input average over N samples in order to filter out highest frequencies noise
 
- 			sum = 0; // initialization
 
- 			ADCCP = 0x00;	   // conversion on ADC0
 
- 	
 
- 			for(k = 1; k <= N; k++){
 
- 				while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 				sum += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			}
 
- 			Vin0b = sum/N;	// calculate average value for the voltage of second step
 
- 			if(Vin0b < Vin0a && Read_Digital(LH_mode)==1) flag0 = -1 * flag0; // change maximum searching direction if V2 < V1
 
- 			else if(Vin0b > Vin0a && Read_Digital(LH_mode)==0) flag0 = -1 * flag0; // change minimum searching direction if V2 > V1
 
- 			Vin0a = Vin0b; // update the voltage of first step
 
- 			
 
- 			// input average over N samples in order to filter out highest frequencies noise
 
- 			sum = 0; // initialization
 
- 			ADCCP = 0x01;	   // conversion on ADC1			
 
- 			for(k = 1; k <= N; k++){
 
- 				while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 				sum += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			}
 
- 			Vin1b = sum/N;	// calculate average value for the voltage of second step
 
- 			if(Vin1b < Vin1a && Read_Digital(LH_mode)==1) flag1 = -1 * flag1; // change maximum searching direction if V2 < V1
 
- 			else if(Vin1b > Vin1a && Read_Digital(LH_mode)==0) flag1 = -1 * flag1; // change minimum searching direction if V2 > V1
 
- 			Vin1a = Vin1b; // update the voltage of first step
 
- 		}
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void Copy(void)
 
- {
 
- 	// define variables
 
- 	int Vout, Vin;
 
- 	
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	//DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC4
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 		Vin = ADCtoDAT(ADCDAT); // read voltage from ADC4
 
- 		Vout = Vin;
 
- 		DAC2DAT = DATtoADC(Vout); // output voltage on DAC2
 
- 			
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void Copy_S_and_H(void)
 
- {
 
- 	// define variables
 
- 	int Vout, Vin;
 
- 	
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	//DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC4
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		if(Read_Digital(6)==1){
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			Vin = ADCtoDAT(ADCDAT); // read voltage from ADC4
 
- 			Vout = Vin;
 
- 			DAC2DAT = DATtoADC(Vout); // output voltage on DAC2
 
- 		}	
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void Copy_S_and_Hcnt(void)
 
- {
 
- 	// define variables
 
- 	int Vout, Vin, k, sum, Ncount;
 
- 	k=0;
 
- 	sum =0;
 
- 	Ncount=100;
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	//DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC4
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		if(Read_Digital(6)==1){
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			Vin = ADCtoDAT(ADCDAT); // read voltage from ADC4
 
- 			sum+=Vin;
 
- 			k++;
 
- 		}
 
- 		
 
- 		if(k>=Ncount){
 
- 			k=0;
 
- 			Vout = sum/Ncount;
 
- 			DAC2DAT = DATtoADC(Vout); // output voltage on DAC2
 
- 			sum=0;
 
- 		}	
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void ramp_with_TTLin(void)
 
- {
 
- 	int Vout=0;
 
- 	int step=0;
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	//DAC1CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x00;	   // conversion on ADC0
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	while(1){
 
- 		if(Vout>=4095)
 
- 			step=-1;
 
- 		if(Vout<=0)
 
- 			step=1;
 
- 		Vout=Vout+step;
 
- 		if(Read_Digital(3)==1){
 
- 			DAC2DAT = DATtoADC(Vout); // output voltage on DAC0
 
- 		}
 
- 	}
 
- }
 
- #define SH_in0     0	  //  high-> lock, low -> hold
 
- #define SH_in1     1	  //  high-> lock, low -> hold
 
- #define SH_disab  7   // disable the sampler & holder function
 
- void lock_StabPulse(void)
 
- {
 
- 	// define variables
 
- 	int N_step, N_delay, cnt0,cnt1, N, sum0, sum1;
 
- 	int Vout0, Vin0;
 
- 	int Vout1, Vin1;
 
- 	int Vset0, Vset1;
 
- 	int Vmean;
 
- 	int MeasureTTLin = 6;
 
- 	int ModeTTLin = 3;
 
- 	int bit =0x00000001<<(20);
 
- 	
 
- 	/*POWKEY1 = 0x01;
 
- 	POWCON = 0x00;		   				// 41.78MHz
 
- 	POWKEY2 = 0xF4;
 
- 	 */
 
- 	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	//DAC0CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC0
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	// locking parameters initialization
 
- 	N_step = 5;   //  step size
 
- 	N_delay = 10; // wait for certain time
 
- 	cnt0 = 0;      // indicator for searching direction
 
- 	cnt1 = 0;      // indicator for searching direction
 
- 	N = 100;      // number for averaging measurement
 
- 	Vin0 = 0;      // initialize the voltage of first step
 
- 	Vin1 = 0;      // initialize the voltage of first step
 
- 	Vmean = 2000;
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		///Write_Digital(0,1); // Output a high level digital output on pin P1.0 for indicating the locking mode.
 
- 		//GP1DAT^=bit;
 
- 	
 
- 		// for each loop we check if there is something to measure
 
- 		if(Read_Digital(MeasureTTLin)==1){
 
- 				
 
- 			ADCCP = 0x03;	   // conversion on ADC0
 
- 	
 
- 			if (cnt0==0)
 
- 				sum0 = 0; // initialization	of the measurement
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			sum0 += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			cnt0++;
 
- 			if(cnt0>=N)
 
- 				Vin0 = sum0/N;	// calculate average value
 
- 		}
 
- 		//the same for the other chanel
 
- 		/*if(Read_Digital(SH_in1)==1){
 
- 			ADCCP = 0x01;	   // conversion on ADC1			
 
- 			if (cnt1==0)
 
- 				sum1 = 0; // initialization	of the measurement
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			sum1 += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			cnt1++;
 
- 			if(cnt1==N)
 
- 				Vin1 = sum1/N;	// calculate average value
 
- 		}*/
 
- 		// if we are in the learning mode
 
- 		// we set the outputs to the average voltage
 
- 		// and save the current input level as the set point of the next locking enable
 
- 		if(Read_Digital(ModeTTLin)==0){
 
- 			if(cnt0>=N)
 
- 				Vset0 = Vin0;
 
- 			//if(cnt1>=N)
 
- 			//	Vset1 = Vin1;
 
- 			Vout0 = Vmean;
 
- 			//Vout1 = Vmean;
 
- 		} 
 
- 		// if we are in the locking mode and each time we have a complete measurement
 
- 		if(Read_Digital(ModeTTLin)==1 && cnt0>=N){
 
- 			if(Vset0<Vin0)
 
- 				Vout0 = Vout0 - N_step; // calculate the voltage for next step
 
- 			if(Vset0>Vin0)
 
- 				Vout0 = Vout0 + N_step; // calculate the voltage for next step
 
- 		}
 
- 		//the same for the second chanel
 
- 		/*if(Read_Digital(SH_disab)==0 && cnt1==N){
 
- 			if(Vset1<Vin1)
 
- 				Vout1 = Vout1 + N_step; // calculate the voltage for next step
 
- 			if(Vset1>Vin1)
 
- 				Vout1 = Vout1 - N_step; // calculate the voltage for next step
 
- 		} */
 
- 		if(cnt0>=N)
 
- 			cnt0=0;
 
- 		//those line could also be inserted in the if conditions and thus not set every loops
 
- 		DAC2DAT = DATtoADC(Vout0); // output voltage on DAC0
 
- 		//DAC1DAT = DATtoADC(Vout1); // output voltage on DAC1
 
- 						
 
- 		//delay(N_delay); //wait for a certain time.. maybe not nessecary
 
- 		
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void lock_StabPulse3(void)
 
- {
 
- 	// define variables
 
- 	int N_step, N_delay, cnt0,cnt1, N, sum0;
 
- 	int Vout0, Vin0;
 
- 	int Vout1, Vin1;
 
- 	int Vset0, Vset1;
 
- 	int Vmean;
 
- 	int MeasureTTLin = 6;
 
- 	int ModeTTLin = 3;
 
- 	int bit =0x00000001<<(19);
 
- 	
 
- 	POWKEY1 = 0x01;
 
- 	POWCON = 0x00;		   				// 41.78MHz
 
- 	POWKEY2 = 0xF4;
 
- 	 
 
- 	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	//DAC0CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC0
 
- 	ADCCON = 0x3E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	// locking parameters initialization
 
- 	N_step = 5;   //  step size
 
- 	N_delay = 10; // wait for certain time
 
- 	cnt0 = 0;      // indicator for searching direction
 
- 	cnt1 = 0;      // indicator for searching direction
 
- 	N = 100;      // number for averaging measurement
 
- 	Vin0 = 0;      // initialize the voltage of first step
 
- 	Vin1 = 0;      // initialize the voltage of first step
 
- 	Vmean = 2000;
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		///Write_Digital(0,1); // Output a high level digital output on pin P1.0 for indicating the locking mode.
 
- 		GP1DAT^=bit;
 
- 	
 
- 		// for each loop we check if there is something to measure
 
- 		if((((GP0DAT&0x000000FF)>>6)&0x1)==1){
 
- 				
 
- 			//ADCCP = 0x03;	   // conversion on ADC0
 
- 	
 
- 			if (cnt0==0)
 
- 				sum0 = 0; // initialization	of the measurement
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			sum0 += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			cnt0++;
 
- 			if(cnt0>=N)
 
- 				Vin0 = sum0/N;	// calculate average value
 
- 		}
 
- 	
 
- 		// if we are in the learning mode
 
- 		// we set the outputs to the average voltage
 
- 		// and save the current input level as the set point of the next locking enable
 
- 		if((((GP0DAT&0x000000FF)>>3)&0x1)==0){
 
- 			if(cnt0>=N){
 
- 				Vset0 = Vin0;
 
- 				cnt0=0;
 
- 			}
 
- 			Vout0 = Vmean;
 
- 		} 
 
- 		// if we are in the locking mode and each time we have a complete measurement
 
- 		/*if((((GP0DAT&0x000000FF)>>3)&0x1)==1 && cnt0>=N){
 
- 			cnt0=0;
 
- 			if(Vset0<Vin0)
 
- 				Vout0 = Vout0 - N_step; // calculate the voltage for next step
 
- 			if(Vset0>Vin0)
 
- 				Vout0 = Vout0 + N_step; // calculate the voltage for next step
 
- 		}*/
 
- 		if((((GP0DAT&0x000000FF)>>3)&0x1)==1 && cnt0>=N){
 
- 			cnt0=0;
 
- 			Vout0 = Vout0 + (Vset0-Vin0)/2;
 
- 		}
 
- 		//those line could also be inserted in the if conditions and thus not set every loops
 
- 		DAC2DAT = DATtoADC(Vout0); // output voltage on DAC0
 
- 		
 
- 	}
 
- }
 
- void lock_StabPulse4(void)
 
- {
 
- 	// define variables
 
- 	int N_step, N_delay, cnt0,cnt1, N, sum0, sum1;
 
- 	int Vout0, Vin0;
 
- 	unsigned long int Vout1, Vin1;
 
- 	int Vset0, Vset1;
 
- 	int Vmean;
 
- 	int MeasureTTLin = 6;
 
- 	int ModeTTLin = 3;
 
- 	int bit =0x00000001<<(19);
 
- 	int step_max = 100;
 
- 	int step;
 
- 	
 
- 	POWKEY1 = 0x01;
 
- 	POWCON = 0x00;		   				// 41.78MHz
 
- 	POWKEY2 = 0xF4;
 
- 	 
 
- 	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	//DAC0CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC0
 
- 	ADCCON = 0x3E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	// locking parameters initialization
 
- 	N_step = 5;   //  step size
 
- 	N_delay = 10; // wait for certain time
 
- 	cnt0 = 0;      // indicator for searching direction
 
- 	cnt1 = 0;      // indicator for searching direction
 
- 	N = 50;      // number for averaging measurement
 
- 	Vin0 = 0;      // initialize the voltage of first step
 
- 	Vin1 = 0;      // initialize the voltage of first step
 
- 	Vmean = 2000;
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		///Write_Digital(0,1); // Output a high level digital output on pin P1.0 for indicating the locking mode.
 
- 		//GP1DAT^=bit;
 
- 	
 
- 		// for each loop we check if there is something to measure
 
- 		if((((GP0DAT&0x000000FF)>>6)&0x1)==1){
 
- 				
 
- 			//ADCCP = 0x03;	   // conversion on ADC0
 
- 	
 
- 			if (cnt0==0)
 
- 				sum0 = 0; // initialization	of the measurement
 
- 			
 
- 			GP1DAT^=bit;
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			GP1DAT^=bit;
 
- 			if((((GP0DAT&0x000000FF)>>6)&0x1)==1){
 
- 				sum0 += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 				cnt0++;
 
- 			}
 
- 			if(cnt0>=N)
 
- 				Vin0 = sum0/N;	// calculate average value
 
- 		}
 
- 		else if((((GP0DAT&0x000000FF)>>3)&0x1)==1){
 
- 			if(cnt0>=N){
 
- 				cnt0=0;
 
- 				step = (Vset0-Vin0)/4;
 
- 				if (step>step_max)
 
- 					step = step_max;
 
- 				else if (step<-step_max)
 
- 					step = -step_max;
 
- 				Vout0 = Vout0 + step;
 
- 			}
 
- 		}
 
- 		// if we are in the learning mode
 
- 		// we set the outputs to the average voltage
 
- 		// and save the current input level as the set point of the next locking enable
 
- 		else{
 
- 			if(cnt0>=N){
 
- 				Vset0 = Vin0;
 
- 				cnt0=0;
 
- 			}
 
- 			Vout0 = Vmean;
 
- 		}
 
- 		//those line could also be inserted in the if conditions and thus not set every loops
 
- 		DAC2DAT = DATtoADC(Vout0); // output voltage on DAC0
 
- 		
 
- 	}
 
- }
 
-  void lock_StabPulse2(void)
 
- {
 
- 	// define variables
 
- 	int N_step, N_delay, cnt0,cnt1, N, sum0, sum1;
 
- 	int Vout0, Vin0;
 
- 	int Vout1, Vin1;
 
- 	int Vset0, Vset1;
 
- 	int Vmean;
 
- 	int MeasureTTLin = 6;
 
- 	int ModeTTLin = 3;
 
- 	int bit =0x00000001<<(20);
 
- 	
 
- 	POWKEY1 = 0x01;
 
- 	POWCON = 0x00;		   				// 41.78MHz
 
- 	POWKEY2 = 0xF4;
 
- 	
 
- 	GP1CON = 0x00000000;    // IO initialization
 
- 	GP1DAT = 0xFF000000;	// set P1.n as digital output
 
- 	// ADC&DAC setting
 
- 	ADCpoweron(20000); // power on ADC
 
- 	REFCON = 0x01;	   // internal 2.5V reference
 
- 	//DAC0CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	DAC2CON = 0x12;	   // AGND-ARef range 0x12 2.5V
 
- 	ADCCP = 0x03;	   // conversion on ADC0
 
- 	ADCCON = 0x6E4;    // continuous conversion
 
- 	// IO setting
 
- 	init_digital();
 
- 	// locking parameters initialization
 
- 	N_step = 5;   //  step size
 
- 	N_delay = 10; // wait for certain time
 
- 	cnt0 = 0;      // indicator for searching direction
 
- 	cnt1 = 0;      // indicator for searching direction
 
- 	N = 100;      // number for averaging measurement
 
- 	Vin0 = 0;      // initialize the voltage of first step
 
- 	Vin1 = 0;      // initialize the voltage of first step
 
- 	Vmean = 2000;
 
- 	// main loop for the locking
 
- 	while(1){
 
- 		
 
- 		///Write_Digital(0,1); // Output a high level digital output on pin P1.0 for indicating the locking mode.
 
- 		GP1DAT^=bit;
 
- 	
 
- 		// for each loop we check if there is something to measure
 
- 		if(((GP0DAT&0x000000FF)>>6)&0x1==1){
 
- 				
 
- 			ADCCP = 0x03;	   // conversion on ADC0
 
- 	
 
- 			if (cnt0==0)
 
- 				sum0 = 0; // initialization	of the measurement
 
- 			while(!ADCSTA){}	// wait for the end of ADC conversion
 
- 			sum0 += ADCtoDAT(ADCDAT); // read voltage from ADC0
 
- 			cnt0++;
 
- 			if(cnt0>=N)
 
- 				Vin0 = sum0/N;	// calculate average value
 
- 		}		
 
- 		// if we are in the learning mode
 
- 		// we set the outputs to the average voltage
 
- 		// and save the current input level as the set point of the next locking enable
 
- 		if(((GP0DAT&0x000000FF)>>3)&0x1==0){
 
- 			if(cnt0>=N){
 
- 				Vset0 = Vin0;
 
- 				cnt0=0;
 
- 			}
 
- 			//if(cnt1>=N)
 
- 			//	Vset1 = Vin1;
 
- 			Vout0 = Vmean;
 
- 			//Vout1 = Vmean;
 
- 		}
 
- 		// if we are in the locking mode and each time we have a complete measurement
 
- 		if(((GP0DAT&0x000000FF)>>3)&0x1==1 && cnt0>=N){
 
- 			cnt0=0;
 
- 			if(Vset0<Vin0)
 
- 				Vout0 = Vout0 - N_step; // calculate the voltage for next step
 
- 			if(Vset0>Vin0)
 
- 				Vout0 = Vout0 + N_step; // calculate the voltage for next step
 
- 		}
 
- 		
 
- 		//those line could also be inserted in the if conditions and thus not set every loops
 
- 		DAC2DAT = DATtoADC(Vout0); // output voltage on DAC0
 
- 		
 
- 		
 
- 		//else -> it's hold for low locking
 
- 	}
 
- }
 
- void lock_EOM_and_AOM(void)
 
- {
 
-     int step, N_delay, V_EOM;//, V_AOM;
 
- 	//unsigned long y_max, y_min;
 
- 	
 
- 	ADCpoweron(20000);			// power on ADC	
 
- 	ADCCP = 0x00;				// conversion on ADC0
 
- 	DAC0CON = 0x12;				// AGND-ARef range 0x12 2.5V
 
- 	DAC1CON = 0x12;	
 
- 	REFCON = 0x01;				// internal 2.5V reference
 
-     ADCCON = 0x6E4;             // continuous conversion
 
- 	GP1CON = 0x00000000;	    // setting IO
 
- 	GP1DAT = 0xFF000000;	    // group P1.x as output
 
- 	GP0CON = 0x00000000;	    // setting IO
 
- 	GP0DAT = 0x00000000;        // group P0.x as input
 
- 	
 
- 	step=5;
 
- 	N_delay=500;
 
- 	V_EOM = 2048;
 
- //	V_AOM = 0;
 
- 	
 
- 	while(1){ // infinite loop
 
- 		
 
- 		// wait for the trigger of calibration
 
- 		if(Read_Digital(6)==1){
 
-             Write_Digital(3,1);// LED on
 
-             GP4DAT = 0x04000000;
 
-             
 
-             // calibration of the zero of the EOM
 
-             Lock_min_fringe(&V_EOM,step, N_delay);
 
-             
 
-             // calibration of the power with the AOM
 
-             
 
-             
 
- 		}
 
- 		Write_Digital(3,0);// LED off
 
- 		GP4DAT ^= 0x00040000;
 
- 		
 
- 	}
 
- }
 
- int main(void)
 
- { 
 
-     //test_blink();
 
- 	//Copy();
 
- 	//Copy_S_and_Hcnt();
 
- 	//ramp();
 
- 	//ramp_with_TTLin();
 
- 	//lock_StabPulse();
 
- 	//lock_EOM2();
 
- 	//synchronizer2();
 
- 	
 
- 	lock_StabPulse4();
 
- 	
 
- 	//test_clock2();
 
- 	return 0;
 
- }
 
 
  |