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

◆ instr_DetBias_trimmer_calibration_function()

void instr_DetBias_trimmer_calibration_function ( void  )

The fine and coarse trimmers for Detector bias adjustment are calibrated here

Returns
No Parameters
481 uint8_t canale,internalADC_0_externalADC_1=(tx_data[4] & 1), canale_selezionato=10;
482 uint8_t trimmer_old[4], PGA_Gain_old[12], trimmer_fine_test, trimmer_coarse_test;
483 uint8_t *dati_da_scrivere,dati_per_switch[]={0,0,0,0}, delta_trimmer, divisore;
484 int32_t target_slope = *(int32_t *)tx_data, tampone;
485 //convertiamo i valori di riferimento
486 int32_t pendenza[]={0,0,0,0,},trimmer_riferimento_fine = (*(uint16_t *)&tx_data[0]);//fine trimmer in microV
487 int32_t ADC_misura_fatta_first[]={0,0,0,0},ADC_misura_fatta_last[]={0,0,0,0}, risul_vof;//Coarse trimmer in unit\'a di 10^5
489 //Detrminare il canale da calibrare
490 scheda_su_scheda_giu = ((tx_data[6] >> 7) & 1)*6;
491 for(canale=0;canale<6;canale++){
492 if((tx_data[6]>>canale)&1){
493 canale_selezionato=canale;
494 break;
495 }
496 }
497
498 //Vettori corrispondenze
499 typedef struct {
500 uint8_t trimmer; //Il trimmer da modificare
501 uint16_t memoria_trimmer; //la cella di memoria dove star\'a la pendenza
502 uint16_t memoria_switch_trimmer; //la cella di memoria che certifa la presenza della calibrazione
503 int32_t segno_uscita; //Coefficiente per la variazione del segnale di uscita
504 uint8_t nodo_lettura; //il nodo di tensione da leggere
505 }trimmer_da_lavorare_;
506
511
512//Preamplifier memory contents regarding detector trimmer slopes are copied in the mainboard memory or restored.
513//This is a patch: the storing of these data in the preamplifier memoery is unnecessary, but it was done.
514//So now the content of the preamplifier memory is done also in the mainboard memory at the time of the slopes measurements.
515//These data are restored in the preamplifier memory at startup so that if the preamplifier is changed the slopes are not lost.
516 trimmer_da_lavorare_ trimmer_da_lavorare_mainboard_CH0[]={
521
522 uint8_t ii, trimmer_coarse_o_fine=10; //inizializzazione ad un valore abnorme
523
524
525//L'offset da considerare in trimmer_da_lavorare per selezionare la coppia di trimmer giusti, i 2 coarse o i 2 fine.
526 if( tx_data[5]==1){
527 trimmer_coarse_o_fine=2;
528 delta_trimmer=100;
529 divisore=1;
530 }else if (tx_data[5]==2){
531 trimmer_coarse_o_fine=0;
532 delta_trimmer=10;
533 divisore=10;
534 }
535
536
537//Condizioni iniziale da ristabilire
538 //Memorizzare il valore dei trimmer, da poterer poi ristabilire ed impostiamo la met\'a scala
539 for(canale=0;canale<4;canale++){
540 trimmer_old[canale]=contenuto_trimmer_detector[canale_selezionato+scheda_su_scheda_giu][canale];
541 detector_scrittura_lettura_trimmer_bias(scheda_su_scheda_giu, canale_selezionato, canale, 128, 1);
542 }
543 //Impostare il gain a 1
544 for(canale=0;canale<6;canale++){
545 PGA_Gain_old[canale]=PGA_settled_gain[canale + scheda_su_scheda_giu];
546 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale, 1 );
547 }
548
549 //Qui calibriamo
550 //Misuriamo a met\'a scala
551 Aspetta_tanti_ms(500);
552 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
553 ADC_misura_fatta_first[ii] = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,internalADC_0_externalADC_1,trimmer_da_lavorare[ii].nodo_lettura,0);
554
555 detector_scrittura_lettura_trimmer_bias(scheda_su_scheda_giu, canale_selezionato, trimmer_da_lavorare[ii].trimmer, \
556 128+trimmer_da_lavorare[ii].segno_uscita*delta_trimmer, 1);
557 }
558 Aspetta_tanti_ms(500);
559 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
560 ADC_misura_fatta_last[ii] = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,internalADC_0_externalADC_1,trimmer_da_lavorare[ii].nodo_lettura,0);
561 }
562 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
563 pendenza[ii]=( (ADC_misura_fatta_last[ii] - ADC_misura_fatta_first[ii]) * (trimmer_da_lavorare[ii].segno_uscita ) )/ ( (int)delta_trimmer) ;
564 tampone = ((int)100*pendenza[ii]) / target_slope;
565 if (target_slope){ //If target_slope is passed 0 there is no comparison
566 if ( (tampone >130) || (tampone<70)){
567 //valore non in tolleranza
568 pendenza[ii]=target_slope;
569 tx_data[5]=3 + ii -trimmer_coarse_o_fine;
570 }
571 }
572 }
573 //memorizzare il valore nella eprom se \'e in tolleranza
574 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
575 dati_da_scrivere= (uint8_t *)&pendenza[ii];
576 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu,I2C_mainboard, canale_selezionato, (trimmer_da_lavorare[ii].memoria_trimmer <<2) , dati_da_scrivere);
577 //We store also in the mainboard EPROM, to be restored in the preamplifier memory at startup
578 EPROM_scrittura_M24C32_64(scheda_su_scheda_giu,I2C_mainboard, Canale_Eprom_mainboard,\
579 ((trimmer_da_lavorare_mainboard_CH0[ii].memoria_trimmer+6*canale_selezionato) <<2), dati_da_scrivere);
580 dati_per_switch[0]=0;
581 if( tx_data[5] >2){
582 dati_per_switch[0]=0xFF;
583 }
584 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (trimmer_da_lavorare[ii].memoria_switch_trimmer << 2) , dati_per_switch);
585 //We store also in the mainboard EPROM, to be restored in the preamplifier memory at startup
586 EPROM_scrittura_M24C32_64(scheda_su_scheda_giu,I2C_mainboard, Canale_Eprom_mainboard,\
587 ((trimmer_da_lavorare_mainboard_CH0[ii].memoria_switch_trimmer+6*canale_selezionato) <<2), dati_per_switch);
588 }
589 pendenza[ trimmer_coarse_o_fine] = (pendenza[ trimmer_coarse_o_fine] / divisore );
590 tx_data[0]= (pendenza[ trimmer_coarse_o_fine] )& 0xff;
591 tx_data[1] =(( pendenza[ trimmer_coarse_o_fine] )>>8)& 0xff;
592 pendenza[ trimmer_coarse_o_fine+1]= (pendenza[ trimmer_coarse_o_fine+1] / divisore );
593 tx_data[2]= (pendenza[ trimmer_coarse_o_fine+1] )& 0xff;
594 tx_data[3]=( ( pendenza[ trimmer_coarse_o_fine+1])>>8)& 0xff;
595 tx_data[4]= divisore;
596//E qui riportiamo tutto come prima
597 //ristabilire i trimmer.
598 for(canale=0;canale<4;canale++){
599 detector_scrittura_lettura_trimmer_bias( scheda_su_scheda_giu, canale_selezionato, \
600 canale, trimmer_old[canale], Detector_scrivi_il_trimmer );
601 }
602 //Ristabilire il guadagno
603 for(canale=0;canale<6;canale++){
604 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale, PGA_Gain_old[canale] );
605 }
606
607}
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
#define Detector_trimmer_fine_bias_pos
#define Detector_trimmer_coarse_bias_pos
Definition: Detector_Bias.h:98
#define Detector_trimmer_fine_bias_neg
#define Detector_trimmer_coarse_bias_neg
Definition: Detector_Bias.h:99
#define Detector_scrivi_il_trimmer
Definition: Detector_Bias.h:94
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_mainboard_det_coa_slope_cali_ON_0_OFF_ff_ch0
slope detector positive trimmer active if zero
@ Memory_mainboard_det_positive_ad_coarse_trim_slope_bias_ch0
coarse slope for detector positive trimmer bias
@ Memory_mainboard_det_fin_slope_cali_ON_0_OFF_ff_ch0
slope detector negative trimmer active if zero
@ Memory_mainboard_det_positive_ad_fine_trim_slope_bias_ch0
fine slope for detector positive trimmer bias
@ Memory_mainboard_det_negative_ad_coarse_trim_slope_bias_ch0
coarse slope for detector negative trimmer bias
@ Memory_mainboard_det_negative_ad_fine_trim_slope_bias_ch0
fine slope for detector negative trimmer bias
@ Memory_detector_negative_address_coarse_trimmer_slope_bias
coarse slope for detector negative trimmer bias
@ Memory_detector_positive_address_coarse_trimmer_slope_bias
coarse slope for detector positive trimmer bias
@ Memory_detector_negative_address_fine_trimmer_slope_bias
fine slope for detector negative trimmer bias
@ Memory_detector_fine_slope_calibration_ON_0_OFF_ff
slope detector negative trimmer active if zero
@ Memory_detector_coarse_slope_calibration_ON_0_OFF_ff
slope detector positive trimmer active if zero
@ Memory_detector_positive_address_fine_trimmer_slope_bias
fine slope for detector positive trimmer bias
@ node_voltage_Analog_Mux_0_offset
Starting Offset for this set of nodes, 32.
void Aspetta_tanti_ms(int millisecondi)
The timing function.
Definition: Timer.c:52
void instr_DetBias_trimmer_calibration_function(void)
The fine and coarse trimmers for Detector bias adjustment are calibrated here
Definition: Trimmer.c:480
uint8_t contenuto_trimmer_detector[12][4]
Content of the trimmer for detector bias system.
Definition: Trimmer.c:161
void detector_scrittura_lettura_trimmer_bias(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 detector biasing, the contents of the trimmers are stored in the...
Definition: Trimmer.c:238

Definition at line 480 of file Trimmer.c.