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

◆ misura_il_valore_trimmer_detector()

static void misura_il_valore_trimmer_detector ( EPROM_detector__ EPROM_detector,
uint8_t  scheda_su_scheda_giu_,
uint8_t  canali_da_regolare,
uint8_t  trimmer_da_scrivere 
)
static


This function provides the guess values and the error about the detector trimmers. This function is static.

Parameters
[in]EPROM_detectoris a struct with the necessary information about trimmer calibration retrievd from memory.
[in]scheda_su_scheda_giu_the selcted board
[in]canali_da_regolareis a byte which has 1's in correspondaance of the channels whos bias has to be set
[in]trimmer_da_scrivereis the trimmer, coarse, positive and negatice, of fine, positive and negative, to be worked on
Returns
No Parameters, except for the global variables such as the trimmers contents.
553static void misura_il_valore_trimmer_detector(EPROM_detector__ *EPROM_detector, uint8_t scheda_su_scheda_giu_,\
554 uint8_t canali_da_regolare, uint8_t trimmer_da_scrivere){
555uint8_t canale,indice=0,iii;
556 int32_t delta, delto, EPROM_detector_slope_pos[6],EPROM_detector_slope_neg[6],ADC_misura_fatta_neg,ADC_misura_fatta_pos,risul_vof;
557 uint8_t misura_da_fare_pos[6], misura_da_fare_neg[6];
558 if(scheda_su_scheda_giu_) scheda_su_scheda_giu_=6;
559 for( canale=0;canale<6;canale++){
560 if( (canali_da_regolare >> canale) & 1){//Selezionaiamo solo i canali indicati
561 indice= canale + scheda_su_scheda_giu_;
562 misura_da_fare_pos[canale] = Detector_SAR_ini[indice].target_non_raggiunto_pos;
563 misura_da_fare_neg[canale] = Detector_SAR_ini[indice].target_non_raggiunto_neg;
564// Detector_SAR_ini[indice ].starting_value_pos =128; //Questo serve col fine se si \'e gi\'a in tolleranza
565// Detector_SAR_ini[indice ].starting_value_neg =128; //Questo serve col fine se si \'e gi\'a in tolleranza
566 if( trimmer_da_scrivere == Detector_trimmer_coarse_bias_pos){
567 EPROM_detector_slope_pos[canale] = EPROM_detector[canale].slope_coarse_positiva;
568 EPROM_detector_slope_neg[canale] = EPROM_detector[canale].slope_coarse_negativa;
569 }else{
570 EPROM_detector_slope_pos[canale] = EPROM_detector[canale].slope_fine_positiva;
571 EPROM_detector_slope_neg[canale] = EPROM_detector[canale].slope_fine_negativa ;
572 }
573 }
574 }
575
576if(trimmer_da_scrivere == Detector_trimmer_coarse_bias_pos){
577 for( canale=0;canale<6;canale++){
578 if( (canali_da_regolare >> canale) & 1){//Selezionaiamo solo i canali indicati
580 Detector_SAR_ini[canale + scheda_su_scheda_giu_].starting_value_pos, Detector_scrivi_il_trimmer );//Trimmer inizializzato a zero fine pos
582 Detector_SAR_ini[canale + scheda_su_scheda_giu_].starting_value_neg, Detector_scrivi_il_trimmer );//Trimmer inizializzato a zero fine neg
583 detector_scrittura_lettura_trimmer_bias( scheda_su_scheda_giu_, canale, Detector_trimmer_fine_bias_pos, 0x80, Detector_scrivi_il_trimmer );//Trimmer inizializzato a zero fine pos
584 detector_scrittura_lettura_trimmer_bias( scheda_su_scheda_giu_, canale, Detector_trimmer_fine_bias_neg, 0x80, Detector_scrivi_il_trimmer );//Trimmer inizializzato a zero fine neg
585 if ( flag_error_verified ){ ERROR_codifica_errore( scheda_su_scheda_giu_, error_address_PGA_DetectorTrimmer_down , DetectorTrimmer_error_0 + canale, 1);
586 canali_da_regolare=0;
587 }
588 }
589 }
590}
591if(trimmer_da_scrivere == Detector_trimmer_fine_bias_pos){
592 for( canale=0;canale<12;canale++){
593 Detector_SAR_ini[canale].starting_value_pos =128;
594 Detector_SAR_ini[canale].starting_value_neg =128;
595 }
596 }
597 Aspetta_tanti_ms(Detector_attesa_tra_le_misure);
598//Calcoliamo il valore target e lo impostiamo
599for( canale=0;canale<6;canale++){
600 if( (canali_da_regolare >> canale) & 1){//Selezionaiamo solo i canali indicati
601 if( Detector_externalADC_1_onboardADC_0){
602 //Misura con adc esterno
603 if(misura_da_fare_pos[canale]){
604 ADC_misura_fatta_pos = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu_ ,\
606 Aspetta_tanti_ms(100);
607 if(misura_da_fare_neg[canale]){
608 ADC_misura_fatta_neg = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu_ ,\
609 node_voltage_Analog_Mux_0_offset + canale *2 +1);
610 }
611 }else{
612 //Misuro con adc interno
613 if(misura_da_fare_pos[canale]){
614
615 ADC_misura_fatta_pos = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu_,\
616 Detector_externalADC_1_onboardADC_0,node_voltage_Analog_Mux_0_offset + canale *2,0);
617 }
618 Aspetta_tanti_ms(100);
619 if(misura_da_fare_neg[canale]){
620
621 ADC_misura_fatta_neg = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu_,\
622 Detector_externalADC_1_onboardADC_0,node_voltage_Analog_Mux_0_offset + canale *2+1,0);
623 }
624 }
625 if(misura_da_fare_pos[canale]){
626 delta = Detector_SAR_ini[canale + scheda_su_scheda_giu_].starting_value_pos + ( (Detector_bias_target[canale + scheda_su_scheda_giu_]\
627 - ADC_misura_fatta_pos) / EPROM_detector_slope_pos[canale ] ) ;
628 delta += ( (Detector_bias_target[canale + scheda_su_scheda_giu_] - ADC_misura_fatta_pos) %\
629 EPROM_detector_slope_pos[canale ] )\
630 / (EPROM_detector_slope_pos[canale]>>1);
631 if (delta <0) delta=0;
632 if (delta >0xff) delta=0xff;
633 Detector_SAR_ini[canale + scheda_su_scheda_giu_].starting_value_pos = delta;
634 detector_scrittura_lettura_trimmer_bias( scheda_su_scheda_giu_, canale, trimmer_da_scrivere, \
635 Detector_SAR_ini[canale+scheda_su_scheda_giu_ ].starting_value_pos, Detector_scrivi_il_trimmer );//Trimmer inizializzato a zero coarse pos
636 }
637
638 if(misura_da_fare_neg[canale]){
639 delta =Detector_SAR_ini[canale+scheda_su_scheda_giu_ ].starting_value_neg + ( (-Detector_bias_target[canale + scheda_su_scheda_giu_] -\
640 ADC_misura_fatta_neg) / EPROM_detector_slope_neg[canale ] ) ;
641 delta += ( (-Detector_bias_target[canale + scheda_su_scheda_giu_] - ADC_misura_fatta_neg) %\
642 EPROM_detector_slope_neg[canale + scheda_su_scheda_giu_] )\
643 / (EPROM_detector_slope_neg[canale + scheda_su_scheda_giu_] >> 1);
644 if (delta <0) delta=0;
645 if (delta >0xff) delta=0xff;
646 Detector_SAR_ini[canale+scheda_su_scheda_giu_ ].starting_value_neg = delta;
647 detector_scrittura_lettura_trimmer_bias( scheda_su_scheda_giu_, canale, trimmer_da_scrivere +1, \
648 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_neg, Detector_scrivi_il_trimmer );//Trimmer inizializzato a zero coarse neg
649 }
650 }
651}
652Aspetta_tanti_ms(Detector_attesa_tra_le_misure);
653//qui invece determiniamo l'errore per capire che SAR applicare
654for( canale=0;canale<6;canale++){
655 if( (canali_da_regolare >> canale) & 1){//Selezionaiamo solo i canali indicati
656 if( Detector_externalADC_1_onboardADC_0){
657 //Misura con adc esterno
658 if(misura_da_fare_pos[canale]){
659 Aspetta_tanti_ms(100);
660 ADC_misura_fatta_pos = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu_ ,\
662 }
663 Aspetta_tanti_ms(100);
664 if(misura_da_fare_neg[canale]){
665 ADC_misura_fatta_neg = preamplifier_ADC_external_measured_node_function(scheda_su_scheda_giu_ ,\
666 node_voltage_Analog_Mux_0_offset + canale *2 +1);
667 }
668 }else{
669 //Misuro con adc interno
670 if(misura_da_fare_pos[canale]){
671
672 ADC_misura_fatta_pos = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu_,\
673 Detector_externalADC_1_onboardADC_0,node_voltage_Analog_Mux_0_offset + canale *2,0);
674 }
675 Aspetta_tanti_ms(100);
676 if(misura_da_fare_neg[canale]){
677
678 ADC_misura_fatta_neg = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu_,\
679 Detector_externalADC_1_onboardADC_0,node_voltage_Analog_Mux_0_offset + canale *2+1,0);
680 }
681 }
682 if(misura_da_fare_pos[canale]){//Si determina il minimo valore di SAR
683 delta = ( (Detector_bias_target[canale + scheda_su_scheda_giu_] - ADC_misura_fatta_pos) / EPROM_detector_slope_pos[canale ] ) ;
684 delta += ( (Detector_bias_target[canale + scheda_su_scheda_giu_] - ADC_misura_fatta_pos) % EPROM_detector_slope_pos[canale ] )\
685 /(EPROM_detector_slope_pos[canale]>>1);
686 delto= delta;
687 if( delto < 0) delto=-1*delto;
688 if (delto <=1){
689 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos=1;
690 }else if (delto <=2){
691 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos=2;
692 }else if( delto<=4){
693 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos=3;
694 }else{
695 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos=7;
696 }
697// delta += Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_pos;
698 if(delta==0) delta =1;
699 delta = Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_pos - delto;
700 if(delta<0) Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_pos=0;
701 if( delta > 255) Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_pos=0xff;
702 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_pos =delta;
703// for(iii=0;iii<Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos;iii++){
704// Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_pos &= ~(1<<iii); //tolgo
705// }
706 }
707
708if(misura_da_fare_neg[canale]){
709 delta =( (-Detector_bias_target[canale + scheda_su_scheda_giu_] - ADC_misura_fatta_neg) / EPROM_detector_slope_neg[canale] ) ;
710 delta +=( (-Detector_bias_target[canale + scheda_su_scheda_giu_] - ADC_misura_fatta_neg) % EPROM_detector_slope_neg[canale] )\
711 / (EPROM_detector_slope_neg[canale]>>1);
712 delto= delta;
713 if( delto < 0) delto=-1*delto;
714 if (delto <=1){
715 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg=1;
716 }else if (delto <=2){
717 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg=2;
718 }else if( delto<=4){
719 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg=3;
720 }else{
721 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg=7;
722 }
723 if(delta==0) delta=1;
724 delta = Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_neg - delto;
725 if(delta<0) Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_neg=0;
726 if( delta > 255) Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_neg=0xff;
727 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_neg = delta;
728// for(iii=0;iii<Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg;iii++){
729// Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_value_neg &= ~(1<<iii); //tolgo
730// }
731 }
732 }
733}
734
735}
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
static void misura_il_valore_trimmer_detector(EPROM_detector__ *EPROM_detector, uint8_t scheda_su_scheda_giu_, uint8_t canali_da_regolare, uint8_t trimmer_da_scrivere)
int32_t Detector_bias_target[12]
Detector bias target values.
#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 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.
@ error_address_PGA_DetectorTrimmer_down
Error register for on board PGA/detector trimmer
@ DetectorTrimmer_error_0
detector trimmer setting error for CH0
@ node_voltage_Analog_Mux_0_offset
Starting Offset for this set of nodes, 32.
int32_t preamplifier_ADC_external_measured_node_function(uint8_t scheda_su_scheda_giu, uint8_t indice)
This function provide node reading from an external ADC.
void Aspetta_tanti_ms(int millisecondi)
The timing function.
Definition: Timer.c:52
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 553 of file Detector_Bias.c.