1#include "tutti_gli_header.h"
159volatile uint16_t Detector_attesa_tra_le_misure=10;
160int32_t Detector_error_voltage=10000;
161uint8_t Detector_canali_da_regolare=0;
162uint8_t Detector_externalADC_1_onboardADC_0=0;
163uint8_t Detector_SAR_1_no_SAR_0=1;
164uint8_t Detector_fastSAR_1_no_fastSAR_0=1;
165uint8_t Detector_PGA_settled_gain_old[12];
166int32_t Detector_misura_fatta_old[12];
167int32_t Detector_bias_target_negativo[12];
222const int32_t Detector_positive_coarse_step_trimmer[]={Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,
223 Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,
224 Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,
225 Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer};
227const int32_t Detector_positive_fine_step_trimmer[]={ Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer,
228 Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer,
229 Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer,
230 Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer};
232const int32_t Detector_negative_coarse_step_trimmer[]={Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,
233 Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,
234 Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,
235 Detector_default_coarse_trimmer,Detector_default_coarse_trimmer,Detector_default_coarse_trimmer};
237const int32_t Detector_negative_fine_step_trimmer[]={ Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer,
238 Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer,
239 Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer,
240 Detector_default_fine_trimmer,Detector_default_fine_trimmer,Detector_default_fine_trimmer};
247 1000, 1000, 1000, 1000, 1000, 1000};
258 Detector_SAR_ini[12];
287 uint8_t scheda_su_giu = ((canali_input >> 7) & 1)*6;
288 uint8_t offset_scheda=0;
289 int32_t bias_to_apply,ADC_max_bias_pos, ADC_min_bias_neg;
301 if(ADC_max_bias_pos > ADC_min_bias_neg){
302 ADC_max_bias_pos=ADC_min_bias_neg;
305 if(bias_to_apply > ADC_max_bias_pos){
306 bias_to_apply=ADC_max_bias_pos;
308 ADC_max_bias_pos =bias_to_apply/1000;
309 tx_data[0]= ADC_max_bias_pos & 0xff;
310 tx_data[1]= (ADC_max_bias_pos >>8) & 0xff;
313 for( canali_=0; canali_ <6; canali_ ++){
314 if( (canali_input >> canali_) & 1){
334uint8_t iii,canale, indice, dati_scambio[4], Detector_pre_out_offset_no_change, no_slope=0;
335uint8_t
volatile tx_data_buffer[8],fai_fai=1;
336int8_t variazione, scheda_su_scheda_giu,Detector_offset_starts_at_half_scale;
342 for(iii=0;iii < 8;iii++){
344 tx_data_buffer[iii]=
tx_data[iii];
349 if (Detector_attesa_tra_le_misure==0) Detector_attesa_tra_le_misure=100;
352 if (Detector_error_voltage==0) Detector_error_voltage=200e3;
356 uint8_t Detector_canali_da_regolare_iniziali = Detector_canali_da_regolare;
375#define det_slope_default_coarse (int32_t) -264000
376#define det_slope_default_fine (int32_t) 3000
377EPROM_detector__ EPROM_detector[6]={det_slope_default_coarse,det_slope_default_coarse,det_slope_default_fine,det_slope_default_fine,
378 det_slope_default_coarse,det_slope_default_coarse,det_slope_default_fine,det_slope_default_fine,
379 det_slope_default_coarse,det_slope_default_coarse,det_slope_default_fine,det_slope_default_fine,
380 det_slope_default_coarse,det_slope_default_coarse,det_slope_default_fine,det_slope_default_fine,
381 det_slope_default_coarse,det_slope_default_coarse,det_slope_default_fine,det_slope_default_fine,
382 det_slope_default_coarse,det_slope_default_coarse,det_slope_default_fine,det_slope_default_fine};
388for(iii=0;iii<4;iii++){
393 for(canale=0;canale<6;canale++){
394 if( (Detector_canali_da_regolare >> canale) &1){
397 if(flag_error_verified) Detector_canali_da_regolare =0;
399 if(dati_scambio[0] & (flag_error_verified ==0)){
402 flag_error_verified=0;
412 if( dati_scambio[0] ==0){
414 EPROM_detector[canale].slope_coarse_positiva=*(int32_t *)dati_scambio;
416 EPROM_detector[canale].slope_coarse_negativa= *(int32_t *)dati_scambio;
421 if(flag_error_verified) Detector_canali_da_regolare =0;
423 if(flag_error_verified) Detector_canali_da_regolare =0;
424 if(dati_scambio[0] & (flag_error_verified ==0)){
428 if(scheda_su_scheda_giu)
tx_data[6] += 0x80;
430 if(flag_error_verified) Detector_canali_da_regolare =0;
432 if ( (flag_error_verified ==0)){
434 EPROM_detector[canale].slope_fine_positiva=*(int32_t *)dati_scambio;
436 EPROM_detector[canale].slope_fine_negativa= *(int32_t *)dati_scambio;
441 for(iii=0;iii<8;iii++){
442 tx_data[iii]= tx_data_buffer[iii];
445if (Detector_offset_starts_at_half_scale){
447 for( canale=0;canale<12;canale++){
448 Detector_SAR_ini[canale].starting_value_pos =128;
449 Detector_SAR_ini[canale].starting_value_neg =128;
452 for( canale=0;canale<6;canale++){
458 for( canale=0;canale<6;canale++){
459 if( (Detector_canali_da_regolare >> canale) &1 ){
460 Detector_SAR_ini[canale + scheda_su_scheda_giu].target_non_raggiunto_neg=
true;
461 Detector_SAR_ini[canale +scheda_su_scheda_giu].target_non_raggiunto_pos=
true;
462 Detector_SAR_ini[canale +scheda_su_scheda_giu].starting_exp_value_pos=7;
463 Detector_SAR_ini[canale +scheda_su_scheda_giu].starting_exp_value_neg=7;
470 if(Detector_pre_out_offset_no_change){
471 for( canale=0;canale<6;canale++){
472 if( (Detector_canali_da_regolare >> canale) &1 ){
478if(flag_error_verified==0){
479 for(canale=0; canale< 6; canale++){
481 indice= canale + scheda_su_scheda_giu;
484 if(flag_error_verified) Detector_canali_da_regolare =0;
496 for(canale=0; canale< 6; canale++){
498 indice= canale + scheda_su_scheda_giu;
499 if(Detector_pre_out_offset_no_change==0)
PGA_GAIN_CROSS( scheda_su_scheda_giu , canale , Detector_PGA_settled_gain_old[indice] );
502 if(Detector_pre_out_offset_no_change){
503 uint8_t istruzione_old[8];
504 for(iii=0;iii<8;iii++){
507 for(iii=0;iii<6;iii++){
508 PGA_settled_gain[iii+scheda_su_scheda_giu]= Detector_PGA_settled_gain_old[iii+scheda_su_scheda_giu];
520 for(iii=0;iii<8;iii++){
525 for(iii=0;iii < 8 ;iii++){
526 tx_data[iii]= tx_data_buffer[iii];
529 tx_data[6] = Detector_canali_da_regolare & 0x3F;
530 tx_data[5] = Detector_error_voltage / 1000;
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){
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;
567 EPROM_detector_slope_pos[canale] = EPROM_detector[canale].slope_coarse_positiva;
568 EPROM_detector_slope_neg[canale] = EPROM_detector[canale].slope_coarse_negativa;
570 EPROM_detector_slope_pos[canale] = EPROM_detector[canale].slope_fine_positiva;
571 EPROM_detector_slope_neg[canale] = EPROM_detector[canale].slope_fine_negativa ;
577 for( canale=0;canale<6;canale++){
578 if( (canali_da_regolare >> canale) & 1){
586 canali_da_regolare=0;
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;
599for( canale=0;canale<6;canale++){
600 if( (canali_da_regolare >> canale) & 1){
601 if( Detector_externalADC_1_onboardADC_0){
603 if(misura_da_fare_pos[canale]){
607 if(misura_da_fare_neg[canale]){
613 if(misura_da_fare_pos[canale]){
619 if(misura_da_fare_neg[canale]){
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 ] ) ;
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;
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 ] ) ;
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;
654for( canale=0;canale<6;canale++){
655 if( (canali_da_regolare >> canale) & 1){
656 if( Detector_externalADC_1_onboardADC_0){
658 if(misura_da_fare_pos[canale]){
664 if(misura_da_fare_neg[canale]){
670 if(misura_da_fare_pos[canale]){
676 if(misura_da_fare_neg[canale]){
682 if(misura_da_fare_pos[canale]){
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);
687 if( delto < 0) delto=-1*delto;
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;
693 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos=3;
695 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_pos=7;
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;
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);
713 if( delto < 0) delto=-1*delto;
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;
719 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg=3;
721 Detector_SAR_ini[canale +scheda_su_scheda_giu_].starting_exp_value_neg=7;
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;
749 uint8_t canale, non_misuro;
751 int32_t variabile_ponte,ADC_misura_fatta_pos,ADC_misura_fatta_neg,mezzo_bit;
753 uint8_t target_raggiunto_1_non_raggiunto_0[]={0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
757 if(scheda_su_scheda_giu_>=1) scheda_su_scheda_giu_=6;
761 for (canale=0;canale<6;canale++){
762 if( (Detector_canali_da_regolare >> canale ) & 1) {
765 mezzo_bit = mezzo_bit - EPROM_detector_sar[canale].slope_coarse_positiva - EPROM_detector_sar[canale].slope_coarse_negativa;
772 Detector_canali_da_regolare=0;
776 mezzo_bit = mezzo_bit / (4*iii) ;
782 for(indice_trimmer=0; indice_trimmer<2;indice_trimmer++){
785 for(canale=0;canale<6;canale++){
786 if( (Detector_canali_da_regolare >> canale ) & 1){
787 Detector_SAR_ini[canale + scheda_su_scheda_giu_].target_non_raggiunto_neg=
true;
788 Detector_SAR_ini[canale +scheda_su_scheda_giu_].target_non_raggiunto_pos=
true;
794 for (canale=0;canale<6;canale++){
795 if( (Detector_canali_da_regolare >> canale ) & 1) {
796 indice= canale + scheda_su_scheda_giu_;
798 mezzo_bit = mezzo_bit + EPROM_detector_sar[canale].slope_fine_negativa + EPROM_detector_sar[canale].slope_fine_positiva;
808 mezzo_bit = mezzo_bit / (4*iii) ;
809 if( Detector_error_voltage > mezzo_bit) mezzo_bit = Detector_error_voltage;
817 for(scalata=0; scalata<8; scalata++){
818 confronto= 1 << (7-scalata);
820 for(canale=0; canale<6;canale++){
821 indice= canale + scheda_su_scheda_giu_;
822 if( (Detector_canali_da_regolare >> canale) & 1){
823 if( ((Detector_SAR_ini[indice].starting_exp_value_pos >= (7-scalata))) &&\
824 Detector_SAR_ini[indice].target_non_raggiunto_pos){
830 if( ((Detector_SAR_ini[indice].starting_exp_value_neg >= (7-scalata))) && \
831 Detector_SAR_ini[indice].target_non_raggiunto_neg){
842 for(canale=0; canale<6;canale++){
843 indice= canale + scheda_su_scheda_giu_;
844 if( (Detector_canali_da_regolare >> canale) & 1){
865 if( (Detector_SAR_ini[indice].target_non_raggiunto_pos) && \
866 (Detector_SAR_ini[indice].starting_exp_value_pos >= (7-scalata))){
876 if( (Detector_SAR_ini[indice].target_non_raggiunto_neg) && \
877 (Detector_SAR_ini[indice].starting_exp_value_neg >= (7-scalata))){
887 Detector_canali_da_regolare=0;
891 if( (Detector_SAR_ini[indice].target_non_raggiunto_pos) && (Detector_SAR_ini[indice].starting_exp_value_pos >= (7-scalata))){
902 Detector_SAR_ini[indice].target_non_raggiunto_pos =
false;
920 Detector_SAR_ini[indice].target_non_raggiunto_pos =
false;
926 if( (Detector_SAR_ini[indice].target_non_raggiunto_neg) && \
927 (Detector_SAR_ini[indice].starting_exp_value_neg >= (7-scalata))){
946 Detector_SAR_ini[indice].target_non_raggiunto_neg =
false;
958 Detector_SAR_ini[indice].target_non_raggiunto_neg =
false;
962 if( (Detector_SAR_ini[indice].target_non_raggiunto_neg || Detector_SAR_ini[indice].target_non_raggiunto_pos)==
false){
964 Detector_canali_da_regolare -= 1 << canale ;
987 uint8_t scrivere_leggere= (canale >> 6) & 1;
988 uint8_t scheda_su_giu= ((canale >> 7) & 1)*6;
991 for ( canale_=0; canale_ <6; canale_++){
992 if ( (canale >> canale_) & 1){
994 contenuto_trimmer, scrivere_leggere );
1013 uint8_t scheda_su_giu= (canale >> 7) & 1;
1015 int32_t ADC_misura_fatta;
1018 for ( canale_=0; canale_ <6; canale_++){
1019 if( (canale >> canale_) & 1){
1057 if( flag_error_verified){
1103 detector_Trimmer_bias[2] ;
1108int trimmer_bias_fine_step_actual[]={trimmer_bias_fine_step,trimmer_bias_fine_step};
1149 #define offset_adjusted_at_the_pre_bias_set 0
1150 #define bias_adjustement_start_from_half_scale 1
1151 bool errore_pos[2]={
true,
true}, errore_neg[2]={
true,
true},errore_generale=
true;
1154 unsigned int attesa;
1155 long int discrepanza;
1156 char canale=0, troppe_misure=0,ii;
1162 char nodo_di_misura_1[]={ADC_ADC_PGA_neg_out_ch0, ADC_ADC_PGA_neg_out_ch1};
1163 char nodo_di_misura_2[]={ADC_ADC_PGA_pos_out_ch0, ADC_ADC_PGA_pos_out_ch1};
1169 struct canale_ADC_type{
1170 unsigned char att_pos;
1171 unsigned char att_neg;
1177 for( canale=0;canale<2;canale++){
1180 valore_target_per_offset[canale]=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], offset);
1182 if( (valore_target_per_offset[canale] >= saturazione_positiva) || ( valore_target_per_offset[canale] <= saturazione_negativa ) ) {
1183 valore_target_per_offset[canale]=0;
1186 valore_target_per_offset[canale] = ( valore_target_per_offset[canale] * (int)
guadagno_minimo_PGA ) / (int)PGA_Gain_V_su_V[canale] ;
1190 char PGA_Gain_V_su_V_old[]={PGA_Gain_V_su_V[0], PGA_Gain_V_su_V[1]};
1201 for(ii =0; ii<2;ii++){
1203 errore_pos[ii]=
false;
1204 errore_neg[ii]=
false;
1209 for(canale =0; canale<2;canale++){
1210 if ( errore_pos[canale] ){
1211 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_pos, 0x80);
1212 detector_Trimmer_bias[canale].coarse_pos=0x80;
1213 detector_Trimmer_bias[canale].fine_pos=0x80;
1214 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_pos, 0x80);
1215 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_neg, 0x80);
1216 detector_Trimmer_bias[canale].coarse_neg=0x80;
1217 detector_Trimmer_bias[canale].fine_neg=0x80;
1218 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_neg , 0x80);
1224 for(canale =0; canale<2;canale++){
1225 if ( errore_pos[canale] ){
1227 offset = correzione_misura_ADC(indice_Vbias, offset);
1228 discrepanza = tensione_target_attenuata[canale] - offset;
1230 imposta_il_trimmer_del_bias(&detector_Trimmer_bias[canale].coarse_pos, discrepanza, trimmer_bias_coarse_step_actual[canale], trimmer_bias_fine_step_actual[canale]);
1234 offset = correzione_misura_ADC(indice_Vbias, offset);
1235 discrepanza = -tensione_target_attenuata[canale] - offset;
1237 imposta_il_trimmer_del_bias(&detector_Trimmer_bias[canale].coarse_neg, discrepanza, trimmer_bias_coarse_step_actual[canale], trimmer_bias_fine_step_actual[canale]);
1238 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_neg, detector_Trimmer_bias[canale].coarse_neg);
1239 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_neg, detector_Trimmer_bias[canale].fine_neg);
1241 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_pos, detector_Trimmer_bias[canale].coarse_pos);
1242 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_pos, detector_Trimmer_bias[canale].fine_pos);
1247while( errore_generale && (troppe_misure<5) ){
1248 errore_generale=
false;
1250 for( canale=0;canale<2;canale++){
1251 if(errore_pos[canale]){
1254 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1255 discrepanza = tensione_target_attenuata[canale] - risultato;
1256 errore_pos[canale]=(discrepanza < -tolleranza || discrepanza > tolleranza);
1257 imposta_il_trimmer_del_bias(&detector_Trimmer_bias[canale].coarse_pos, discrepanza, trimmer_bias_coarse_step_actual[canale], trimmer_bias_fine_step_actual[canale]);
1258 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_pos,detector_Trimmer_bias[canale].coarse_pos);
1259 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_pos, detector_Trimmer_bias[canale].fine_pos);
1261 if (errore_neg[canale]){
1263 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1264 discrepanza = -tensione_target_attenuata[canale] - risultato;
1265 errore_neg[canale]=(discrepanza <= -tolleranza || discrepanza >= tolleranza);
1266 imposta_il_trimmer_del_bias(&detector_Trimmer_bias[canale].coarse_neg, discrepanza, trimmer_bias_coarse_step_actual[canale], trimmer_bias_fine_step_actual[canale]);
1267 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_neg, detector_Trimmer_bias[canale].coarse_neg);
1268 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_neg, detector_Trimmer_bias[canale].fine_neg);
1270 errore_generale |=errore_neg[canale] | errore_pos[canale] ;
1285 for ( canale=0;canale<2;canale++){
1287 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1289 valore_positivo = (int)(((risultato)/1000) & 0xFFFFFFFF);
1294 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1296 valore_negativo = (int)(((risultato)/1000) & 0xFFFFFFFF);
1297 valore_negativo =valore_positivo - valore_negativo;
1323void imposta_il_trimmer_del_bias(int16_t *Valori_per_i_trimmer,
long int discrepanza,
int trimmer_bias_coarse_step_singolo,
int trimmer_bias_fine_step_singolo){
1327 int8_t n = -discrepanza / trimmer_bias_coarse_step_singolo;
1328 Valori_per_i_trimmer[0]= Valori_per_i_trimmer[0] + n;
1329 if (Valori_per_i_trimmer[0] > 0xFF) Valori_per_i_trimmer[0]=0xFF;
1330 if (Valori_per_i_trimmer[0] <0) Valori_per_i_trimmer[0] =0;
1334 int8_t n = discrepanza / trimmer_bias_fine_step_singolo;
1335 Valori_per_i_trimmer[1]= Valori_per_i_trimmer[1] + n;
1336 if (Valori_per_i_trimmer[1]>0xFF) Valori_per_i_trimmer[1]=0xFF;
1337 if(Valori_per_i_trimmer[1]<0) Valori_per_i_trimmer[1]=0;
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...
volatile uint16_t ADC_medie_per_misura
the number of ADC readings to average, the maximum is 400
volatile bool ADC_non_leggi_lo_offset_se_true
if not necessary, the ADC input offset from buffer is not read
@ instr_output_offset_to_be_set
Adjust the ouput voltage that was previously set at instr_ouput_offset_we_want_to_set.
uint8_t tx_data[8]
Transmission data vector.
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...
uint8_t guadagno_minimo_PGA
uint8_t PGA_settled_gain[12]
PGA set gain.
void PGA_GAIN_set(char canale, unsigned int guadagno_da_impostare)
It sets the new gain irrespective of the offset.
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)
void instr_detector_scrittura_lettura_trimmer_bias_function(void)
This is an instruction via CAN bus to read/write the detector trimmers. It calls the detector_scrittu...
void imposta_il_trimmer_del_bias(int16_t *Valori_per_i_trimmer, long int discrepanza, int trimmer_bias_coarse_step_singolo, int trimmer_bias_fine_step_singolo)
Trimmer settings for the function instruction_Detector_bias()
void instruction_Detector_bias(void)
The detector bias is set at the value passed from the CAN.
int Detector_Voltage_Bias[]
The bias voltage applied to the detectors.
static void Detector_aggiusta_offset_SAR(EPROM_detector__ *EPROM_detector_sar, uint8_t scheda_su_scheda_giu_)
This function provide the output offset with the fast SAR method: only a few LS bits are left for thi...
int32_t Detector_bias_target[12]
Detector bias target values.
void instr_detector_Vbias_we_want_to_set_function(void)
void instr_Vbias_to_be_set_function(void)
The detector bias will be set at the value set with the function instr_detector_Vbias_we_want_to_set_...
const struct Detector_coefficiente_type Detector_coarse_trimmer_normalizing_factor[]
Coarse trimmer, negative side, normalizing factor with repect to the positive side.
void instruction_Vbias_target(void)
The detector bias will be set at the value passed from the CAN if, after this setting,...
static bool Detector_verifica_Vbias(uint8_t scheda_su_giu, bool si_commuta)
Function to verify if the Vbias voltage is within the limit to be swtitched.
const struct Detector_coefficiente_type Detector_small_res_normalizing_factor[]
Small Load resistor, negative side, normalizing factor with repect to the positive resistors.
void instr_Relays_driver_set_reset_channel_function(void)
Function to set the relais for detector bias.
uint8_t detector_Relay_state[12]
The state of the Detector realis is considerede. Note that this is the wanted working condition....
const struct Detector_coefficiente_type Detector_large_res_normalizing_factor[]
Large Load resistor, negative side, normalizing factor with repect to the positive resistors.
#define trimmer_bias_coarse_step
Trimmer fine step in microV/step
#define Detector_max_limit_to_rail
#define Detector_min_voltage_for_switch
#define minimum_error_detector_voltage
< Minimum settbale voltage error for detector bias above
#define Detector_trimmer_fine_bias_pos
#define Detector_trimmer_coarse_bias_pos
#define Detector_trimmer_fine_bias_neg
#define Detector_max_voltage_for_switch
#define Detector_trimmer_coarse_bias_neg
#define Detector_scrivi_il_trimmer
void Relays_driver_set_reset_channel(uint8_t scheda_su_giu, uint8_t numero_canale, uint8_t valore_da_trasmettere)
Setting the state of the detector realis: pre connected to detector or intrnal resistor,...
#define Detector_small_RLOAD
#define Detector_prea_to_det
#define Detector_bias_invertito
#define Detector_external_bias
#define Detector_internal_bias
#define Detector_prea_to_GND
#define Detector_bias_diretto
#define Detector_large_RLOAD
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.
@ Vbol_neg_large_for_switching
Negative Vbol too large for switching from internal to external power or vice-versa.
@ Vbol_neg_small_for_switching
Negative Vbol too small for switching from internal to external power or vice-versa.
@ Vbol_pos_large_for_switching
Positive Vbol too large for switching from internal to external power or vice-versa.
@ Vbol_pos_small_for_switching
Positive Vbol too small for switching from internal to external power or vice-versa.
@ ADC_internal_General_fails
ADC general fault.
@ Detector_bias_slopes_not_available
One or more channels have not the slope set.
@ error_address_reg_ADC0
Error register for ADC0.
@ error_address_Bias_adjustment
Error register for channel detector bias adjustment.
@ error_address_PGA_DetectorTrimmer_down
Error register for on board PGA/detector trimmer
@ error_address_Power_Supply_in_General
Error register for channel power supplies.
@ DetectorTrimmer_error_0
detector trimmer setting error for CH0
void instruction_Offset_compensation(void)
Output offset voltage compensation.
#define istruzione_byte_1
#define istruzione_byte_3
#define istruzione_byte_2
#define ADC_Misura_bias_10_att_ch0_p
mux 4
#define istruzione_byte_4_e_scelta_canale
#define ADC_Misura_bias_10_att_ch1_p
mux 2
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.
@ 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.
@ node_voltage_Analog_Mux_meas_input_bias_neg
@ node_voltage_Analog_Mux_meas_input_bias_pos
void preamplifier_set_reset_pre_gain(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t set_2_reset_1_idle_0)
Here the 2 digital signals of the preamplifier's trimmer are exploited to set the gain of the preampl...
#define preamplifier_Gain_basso
. */
#define preamplifier_Gain_alto
. */
void instr_output_offset_to_be_set_function(void)
The detector bias will be set at the value set with the function instr_detector_Vbias_we_want_to_set_...
int32_t preamplifier_Output_offset_target[12]
Offset target values.
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.
void instr_DetBias_trimmer_calibration_function(void)
The fine and coarse trimmers for Detector bias adjustment are calibrated here
uint8_t contenuto_trimmer_detector[12][4]
Content of the trimmer for detector bias system.
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...
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.