CROSS Technical Documentation User Manual and Technical Doc.
INFN Milano Bicocca
Loading...
Searching...
No Matches

◆ instr_offset_trimmer_calibration_function()

void instr_offset_trimmer_calibration_function ( void  )

The fine and coarse trimmers for offset adjustment are calibrated here

Returns
No Parameters
321 uint8_t canale,internalADC_0_externalADC_1=(tx_data[4] & 1), canale_selezionato=10;
322 uint8_t trimmer_old[4], PGA_Gain_old[12], trimmer_fine_test, trimmer_coarse_test;
323 uint8_t *dati_da_scrivere,dati_da_leggere[]={0,0,0,0};
324 //convertiamo i valori di riferimento
325 int32_t pendenza_fine=0,pendenza_coarse=0,trimmer_riferimento_fine = (*(uint16_t *)&tx_data[0]);//fine trimmer in microV
326 int32_t ADC_misura_fatta_first,ADC_misura_fatta_last,trimmer_riferimento_coarse= (*(uint16_t *)&tx_data[2] ) *10;//Coarse trimmer in unit\'a di 10^5
327 ERROR_codifica_errore(0,0,0,0); //Reset_ch0 errori
328 //Detrminare il canale da calibrare
329 scheda_su_scheda_giu = ((tx_data[6] >> 7) & 1)*6;
331 for(canale=0;canale<6;canale++){
332 if((tx_data[6]>>canale)&1){
333 canale_selezionato=canale;
334 break;
335 }
336 }
337 //Memorizzare il valore dei trimmer, da poterer poi ristabilire
338 for(canale=0;canale<4;canale++){
339 trimmer_old[canale]=contenuto_trimmer_preamplifier[canale_selezionato+scheda_su_scheda_giu][canale];
340 }
341 //Impostare il gain a 1
342 for(canale=0;canale<6;canale++){
343 PGA_Gain_old[canale]=PGA_settled_gain[canale + scheda_su_scheda_giu];
344 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale, 1 );
345 }
346 //Verificre che l'offset sia in una scala opportuna
347// if(internalADC_0_externalADC_1){
348// //lettura con ADC exsterno
349// ADC_misura_fatta_first = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu ,node_voltage_PGA_ch_0 + \
350// canale_selezionato+scheda_su_scheda_giu);
351// ERROR_codifica_errore(scheda_su_scheda_giu, error_address_reg_ADC0 , ADC_external_fails , 1);
352// }else{
353// //lettura con adc interno
354// ADC_misura_fatta_first = ADC_lettura(scheda_su_scheda_giu, node_voltage_PGA_ch_0 + \
355// canale_selezionato+scheda_su_scheda_giu, 1);
356// ERROR_codifica_errore(scheda_su_scheda_giu, error_address_reg_ADC0 , ADC_internal_General_fails , 1);
357// }
358 ADC_misura_fatta_first = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,internalADC_0_externalADC_1,node_voltage_PGA_ch_0 + canale_selezionato, 1);
359 //se l'offset non \'e in scala non viene fatto nessun calcolo.
360 if( (ADC_misura_fatta_first > trimmer_max_voltage_per_trimmer_calibration) || \
361 (ADC_misura_fatta_first <-trimmer_max_voltage_per_trimmer_calibration)){
362 //Offset troppo grande
363 tx_data[5]=4;
364 }else{
365 //facciamo i conti
366 //loop per la calibrazione dei 2 trimmer
367 if(tx_data[5] & 1){//Calibrazione trimmer fine
368 // cambiare il trimmer fine di un po'
369 if(trimmer_old[trimmer_fine_offset] >128){
370 trimmer_fine_test= 0;
371 }else{
372 trimmer_fine_test =255;
373 }
374 preamplifier_scrittura_lettura_trimmer( scheda_su_scheda_giu, canale_selezionato, \
376 Aspetta_tanti_ms( 500);
377// if(internalADC_0_externalADC_1){
378// ADC_misura_fatta_last = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu, node_voltage_PGA_ch_0 + \
379// canale_selezionato+scheda_su_scheda_giu);
380// }else{
381// ADC_misura_fatta_last = ADC_lettura(scheda_su_scheda_giu, node_voltage_PGA_ch_0 + canale_selezionato+scheda_su_scheda_giu, 1);
382// }
383 ADC_misura_fatta_last = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,internalADC_0_externalADC_1,node_voltage_PGA_ch_0 + canale_selezionato, 1);
384
385 pendenza_fine = (ADC_misura_fatta_first - ADC_misura_fatta_last) \
386 /(trimmer_old[trimmer_fine_offset] - trimmer_fine_test);
387 if( (pendenza_fine > ((trimmer_riferimento_fine *12)/10)) \
388 || (pendenza_fine <((trimmer_riferimento_fine *10)/12) )){
389 //Misura anadata a male, prendiamo il default
390 pendenza_fine = trimmer_riferimento_fine;
391 tx_data[5] -= 1; //Togliamo perch\'e non \'e andato bene
392 }
393 //memorizzare il valore nella eprom se \'e in tolleranza
394 dati_da_scrivere= (uint8_t *)&pendenza_fine;
395 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_address_fine_trimmer_slope_offset << 2) , dati_da_scrivere);
396 ADC_misura_fatta_first = ADC_misura_fatta_last; //Se si misura anche il coarse questa \'e l'ultima misura valida
397 EPROM_lettura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_slope_calibration_ON_0_OFF_ff << 2) , dati_da_leggere);
398 if(dati_da_leggere[0]>3){ //If it the first time it is read the content of the register is 0xff
399 dati_da_leggere[0]=1; //1 means that the fine slope is stored
400 }else{
401 dati_da_leggere[0] |=1; //It maybe that the coars was already measured. Here we add the information about this slope, the 1
402 }
403 dati_da_leggere[1]=0;dati_da_leggere[2]=0;dati_da_leggere[3]=0;
404 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_slope_calibration_ON_0_OFF_ff << 2) , dati_da_leggere);
405 }
406 if( tx_data[5] & 2){
407 // cambiare il trimmer coarse di 4 passi e misurare di nuovo, se si vuole calcolare questa
408 if(trimmer_old[trimmer_coarse_offset] >128){
409 trimmer_coarse_test= trimmer_old[trimmer_coarse_offset] -4;
410 }else{
411 trimmer_coarse_test =trimmer_old[trimmer_coarse_offset] +4;
412 }
413 preamplifier_scrittura_lettura_trimmer( scheda_su_scheda_giu, canale_selezionato, \
415 Aspetta_tanti_ms( 500);
416// if(internalADC_0_externalADC_1){
417// ADC_misura_fatta_last = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu, node_voltage_PGA_ch_0 + \
418// canale_selezionato+scheda_su_scheda_giu);
419// }else{
420// ADC_misura_fatta_last = ADC_lettura(scheda_su_scheda_giu, node_voltage_PGA_ch_0 + canale_selezionato+scheda_su_scheda_giu , 1);
421// }
422 ADC_misura_fatta_last = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,internalADC_0_externalADC_1,node_voltage_PGA_ch_0 + canale_selezionato, 1);
423
424 pendenza_coarse = (ADC_misura_fatta_first - ADC_misura_fatta_last) \
425 /(trimmer_old[trimmer_coarse_offset] - trimmer_coarse_test);
426 if( (pendenza_coarse > ((trimmer_riferimento_coarse *12)/10)) \
427 || (pendenza_coarse <((trimmer_riferimento_coarse *10)/12) )){
428 //Misura anadata a male, prendiamo il default
429 pendenza_coarse = trimmer_riferimento_coarse;
430 tx_data[5] -= 2; //Togliamo perch\'e non \'e andato bene
431 }
432 //memorizzare il valore nella eprom se \'e in tolleranza
433 dati_da_scrivere= (uint8_t *)&pendenza_coarse;
434 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_address_coarse_trimmer_slope_offset <<2) , dati_da_scrivere);
435
436 EPROM_lettura_M24C32_64( scheda_su_scheda_giu,I2C_mainboard, canale_selezionato, (Memory_preamplifier_slope_calibration_ON_0_OFF_ff << 2) , dati_da_leggere);
437 if(dati_da_leggere[0]>3){ //If it the first time it is read the content of the register is 0xff
438 dati_da_leggere[0]=2; //2 means that the fine slope is stored
439 }else{
440 dati_da_leggere[0] |=2; //It maybe that the coars was already measured. Here we add the information about this slope, the 2
441 }
442 dati_da_leggere[1]=0;dati_da_leggere[2]=0;dati_da_leggere[3]=0;
443 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_slope_calibration_ON_0_OFF_ff << 2) , dati_da_leggere);
444 }
445 }
446 EPROM_lettura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_slope_calibration_ON_0_OFF_ff << 2) , dati_da_leggere);
447 if(dati_da_leggere[0]==3){
448 dati_da_leggere[0]=0;
449 dati_da_leggere[1]=0;dati_da_leggere[2]=0;dati_da_leggere[3]=0;
450 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (Memory_preamplifier_slope_calibration_ON_0_OFF_ff << 2) , dati_da_leggere);
451 }
452 // ritornare il valore misurato nella istruzione can
453 pendenza_fine = pendenza_fine;
454 tx_data[0]= pendenza_fine & 0xff;
455 tx_data[1] =(pendenza_fine >> 8) & 0xff;
456 pendenza_coarse = pendenza_coarse /10 ;
457 tx_data[2]= pendenza_coarse & 0xff;
458 tx_data[3]= ( pendenza_coarse >> 8) & 0xff;
459 //ristabilire i trimmer.
460 for(canale=0;canale<4;canale++){
461 preamplifier_scrittura_lettura_trimmer( scheda_su_scheda_giu, canale_selezionato, \
462 canale, trimmer_old[canale], preamplifier_scrivi_il_trimmer );
463 }
464 //Ristabilire il guadagno
465 for(canale=0;canale<6;canale++){
466 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale, PGA_Gain_old[canale] );
467 }
469}
int32_t ADC_misura_differenziale_con_media_generico(uint8_t scheda_su_scheda_giu_, uint8_t preamplifier_externalADC_1_onboardADC_0, uint8_t nodo_da_misurare, uint8_t differenziale_1_single_0)
This function sets the original gain when a few LSb have to be determined. The umber of bits is bit_t...
Definition: Adc.c:899
volatile uint16_t ADC_medie_per_misura
the number of ADC readings to average, the maximum is 400
Definition: Adc.c:206
uint8_t tx_data[8]
Transmission data vector.
Definition: Can.c:321
void PGA_GAIN_CROSS(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t PGA_gain_to_set)
Here the 2 digital signals from the trimmer are exploited to set the gain of the input stage of the P...
Definition: DAC_PGA.c:109
uint8_t PGA_settled_gain[12]
PGA set gain.
Definition: DAC_PGA.c:95
void Error_imposta_la_istruzione(void)
Function to be located at the end of every instruction to mark the error, if any.
void ERROR_codifica_errore(uint8_t scheda_su_scheda_giu, unsigned char error_addres, unsigned char code_to_shift, uint8_t reset_count_se_0)
If an error is found its flag is codified here.
@ node_voltage_PGA_ch_0
Node voltage selection of PGA differential or positive.
Definition: Istruzioni.h:58
void EPROM_lettura_M24C32_64(uint8_t scheda_su_scheda_giu_, uint8_t mainboard_postmainboard, uint8_t canale, short indirizzo_memoria, uint8_t *dati_letti)
Read from preamplifier and on-board flashes.
void EPROM_scrittura_M24C32_64(uint8_t scheda_su_scheda_giu, uint8_t mainboard_postmainboard, uint8_t canale, short indirizzo_memoria, uint8_t *dati_da_scrivere)
Wriring the EEPROM.
@ Memory_preamplifier_slope_calibration_ON_0_OFF_ff
slope trimmer active if zero
@ Memory_preamplifier_address_fine_trimmer_slope_offset
fine slope for trimmer offset
@ Memory_preamplifier_address_coarse_trimmer_slope_offset
coarse slope for trimmer offset
#define preamplifier_scrivi_il_trimmer
void Aspetta_tanti_ms(int millisecondi)
The timing function.
Definition: Timer.c:52
void instr_offset_trimmer_calibration_function(void)
The fine and coarse trimmers for offset adjustment are calibrated here
Definition: Trimmer.c:320
uint8_t volatile contenuto_trimmer_preamplifier[12][4]
Definition: Trimmer.c:179
void preamplifier_scrittura_lettura_trimmer(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t trimmer, uint8_t valore, uint8_t scrivi_1_leggi_0)
Setting the value of any trimmer for preamplifier trimmer, the contents of the trimmers are stored in...
Definition: Trimmer.c:283
#define trimmer_fine_offset
Definition: Trimmer.h:80
#define trimmer_coarse_offset
Definition: Trimmer.h:82

Definition at line 320 of file Trimmer.c.