3#include "tutti_gli_header.h"
14int valore_target_per_offset[]={0,0};
118 uint8_t dati_da_scrivere[]={0,0,0,0};
168 tx_data[0]= dati_da_scrivere[0];
180uint8_t canale, offset_board=0;
181int32_t variabile_in_mV;
189 for( canale=0; canale<6;canale++){
200 for( canale=0; canale<6;canale++){
211 for( canale=0; canale<6;canale++){
250 uint8_t scheda_su_scheda_giu = (canale >> 7) & 1;
251 uint32_t temperatura_in_microK_;
253 for( canale_=0;canale_<6;canale_++){
254 if ( (canale >> canale_) & 1){
256 tx_data[0]= temperatura_in_microK_ & 0xFF;
257 tx_data[1]= (temperatura_in_microK_ >> 8) & 0xFF;
258 tx_data[2]= (temperatura_in_microK_ >> 16) & 0xFF;
259 tx_data[3]= (temperatura_in_microK_ >> 24) & 0xFF;
277 uint8_t scheda_su_scheda_giu = (canale & board_up) >0 ;
279 canale_ = canale & 0x3f;
281 for (canale_=0; canale_<6;canale_++){
282 if( (canale >> canale_) &1){
286 if ( canale & write_trimmer){
307 uint8_t scheda_su_scheda_giu= (canale >> 7) & 1;
309 if (gain_small_large){
314 for(canale_=0; canale_<6;canale_++){
315 if( (canale >> canale_) &1){
331 #define PGA_mantieni_loffset 1
333 uint8_t canale_, preamplifier_canali_da_regolare= (
vettore_istruzioni[6] & 0x3F),iii,istruzione_old[8];
337 uint8_t preamplifier_externalADC_1_onboardADC_0=0;
341 for (iii =0; iii < 7;iii++){
345 for ( canale_ =0; canale_<6; canale_++){
349 for ( canale_ =0; canale_<6; canale_++){
350 if( (preamplifier_canali_da_regolare >> canale_) & 1){
355 if( preamplifier_attesa_tra_le_misure==0) preamplifier_attesa_tra_le_misure=500;
356 preamplifier_canali_da_regolare_old = preamplifier_canali_da_regolare ;
370 for (iii =0; iii < 7;iii++){
377 for(canale_=0; canale_<6;canale_++){
378 if( ( preamplifier_canali_da_regolare >> canale_) &1 ){
380 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale_, PGA_gain_to_set ) ;
398 uint8_t scheda_su_scheda_giu= (canale >> 7) & 1;
406 uint8_t set_2_reset_1_idle_0=1;
407 if (PGA_gain_da_impostare){
408 set_2_reset_1_idle_0=2;
410 for(canale_=0; canale_<6;canale_++){
411 if ((canale>> canale_) & 1) {
420void instr_PGA_DAC_GAIN_CROSS_function(
void){
422 uint8_t scheda_su_scheda_giu= (canale >> 7) & 1;
430 for(canale_=0; canale_<6;canale_++){
431 if ((canale>> canale_) & 1) {
479 *(
unsigned int *) &
tx_data[
byte_istr_dati_0] = correzione_misura_ADC(coeffcienti_misura_ADC_nodi[sottoistruzione], misura);
526 for( canale_=0; canale_<6; canale_++){
531 void Detector_PGA_Rele(
char discriminazione){
532 char chan=0, action=0;
534 if (discriminazione>=0x10) chan=1;
535 action= discriminazione & 0x0F;
541 PGA_pre_gain=PGA_pre_gain_1_ch1;
543 PGA_pre_gain=PGA_pre_gain_1_ch0;
548 PGA_pre_gain=PGA_pre_gain_10_ch1;
550 PGA_pre_gain=PGA_pre_gain_10_ch0;
553 GPIO_PinWrite(PGA_pre_gain.porta_num, PGA_pre_gain.pin_num, 1);
555 GPIO_PinWrite(PGA_pre_gain.porta_num, PGA_pre_gain.pin_num, 0);
559 Funzione_per_attivare( chan, (1 << action));
582 read_write_value_for_wait_for_ADC_setting ,
583 read_write_medie_ADC,
585 read_PGA_Gain_V_su_V,
586 read_write_guadagno_minimo_PGA,
587 read_write_massimo_guadagno_impostabile,
588 read_write_Trimmer_offset_preampli,
589 read_write_Trimmer_thermal_preampli,
590 read_write_Trimmer_detector_bias_positive,
591 read_write_Trimmer_detector_bias_negative,
592 read_write_Trimmer_drift_in_micro_su_C,
593 read_write_Trimmer_common_mode
598 for(ii =0;ii<2;ii++){
599 if( (sottoistruzione >> ii) && 1) canale=ii;
604 case read_write_value_for_wait_for_ADC_setting:
616 case read_write_medie_ADC:
625 case read_PGA_Gain_code:
627 tx_data[0]= PGA_Gain_code[canale] & 0xFF;
628 tx_data[1]= (PGA_Gain_code[canale] >>8 ) & 0xFF;
631 case read_PGA_Gain_V_su_V:
633 tx_data[0]= PGA_Gain_V_su_V[canale] & 0xFF;
636 case read_write_guadagno_minimo_PGA:
645 case read_write_massimo_guadagno_impostabile:
654 case read_write_Trimmer_offset_preampli:
659 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_corse_offset_trimmer, Trimmer_offset_preampli[canale].coarse_offset);
660 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_fine_offset_trimmer, Trimmer_offset_preampli[canale].fine_offset);
662 tx_data[0]= Trimmer_offset_preampli[canale].fine_offset & 0xFF;
663 tx_data[1]= Trimmer_offset_preampli[canale].coarse_offset & 0xFF;
666 case read_write_Trimmer_thermal_preampli:
672 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_coarse_thermal_trimmer , Trimmer_offset_preampli[canale].coarse_thermal);
673 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_JFET_Offset_trimmer , Trimmer_offset_preampli[canale].JFET_Offset);
677 tx_data[1]= Trimmer_offset_preampli[canale].coarse_thermal & 0xFF;
678 tx_data[0]= Trimmer_offset_preampli[canale].JFET_Offset & 0xFF;
681 case read_write_Trimmer_detector_bias_positive:
686 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_pos, detector_Trimmer_bias[canale].coarse_pos);
687 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_pos, detector_Trimmer_bias[canale].fine_pos);
689 tx_data[0]= detector_Trimmer_bias[canale].fine_pos & 0xFF;
690 tx_data[1]= detector_Trimmer_bias[canale].coarse_pos & 0xFF;
693 case read_write_Trimmer_detector_bias_negative:
698 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_coarse_neg, detector_Trimmer_bias[canale].coarse_neg);
699 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (canale, trimmer_bias_fine_neg, detector_Trimmer_bias[canale].fine_neg);
701 tx_data[0]= detector_Trimmer_bias[canale].fine_neg & 0xFF;
702 tx_data[1]= detector_Trimmer_bias[canale].coarse_neg & 0xFF;
705 case read_write_Trimmer_drift_in_micro_su_C:
710 case read_write_Trimmer_common_mode:
714 Imposta_trimmer_common_mode_I2CB ( Trimmer_numero_offset + canale, Trimmer_CMRR_JFET_COLD.CMRR[canale]);
716 tx_data[0]= Trimmer_CMRR_JFET_COLD.CMRR[canale] & 0xFF;
737 int misura_temperatura_locale[2];
739 Misura_della_temperatura(misura_temperatura_locale);
761 risultato= (misura_temperatura_locale[0] & 0xFFFF) + ((misura_temperatura_locale[1] & 0xFFFF)<<16);
769void Misura_della_temperatura(
int *misura_temperatura_locale){
770 uint8_t ii, addr[2] ={ 0x4A, 0x49};
771 uint8_t dati_scrittura[2], dati_scrittura_aa[]={4,0x60},dati_scrittura_bb[]={0};
775 I2CAdrv ->MasterTransmit (addr[ii], dati_scrittura_aa, 2,
false);
776 while (I2CAdrv->GetStatus().busy);
778 I2CAdrv ->MasterTransmit (addr[ii], dati_scrittura_bb, 1,
false);
779 while (I2CAdrv->GetStatus().busy);
781 I2CAdrv->MasterReceive (addr[ii], dati_scrittura, 2,
false);
782 while (I2CAdrv->GetStatus().busy);
784 misura_temperatura_locale[ii] =( (dati_scrittura[0]<<8) + (dati_scrittura[1]) )>>2;
785 misura_temperatura_locale[ii] = ((misura_temperatura_locale[ii]*1000)) >> 5 ;
903 #define offset_PGA_1_or_pre_0_out 7
904 #define offset_different_between_ch 6
905 #define offset_drift_adjusted_on_offset 5
906 #define attivazione_CMRR 2
907 #define JFET_offset_used_0_not_used_1 1
908 #define JFET_offset_measured_and_stored_in_EPROM 0
913 #define stato_esci_dalla_misura (int)(-1 )
914 #define stato_compensazione_termica_su_zero_offset 0
915 #define stato_compensazione_in_temperatura_sull_0ffset_secondo_passo 1
916 #define stato_compensazione_in_temperatura_sull_0ffset 2
917 #define stato_senza_compensazione_in_temperatura 3
918 #define stato_misurare_parametro_per_EPROM_terzo_passo 4
919 #define stato_misurare_parametro_per_EPROM_secondo_passo 5
920 #define stato_misurare_parametro_per_EPROM 6
929 signed char stato_della_misura;
931 unsigned short errore, errore_temperatura, indirizzo_da_usare;
932 char gain_da_moltiplicare;
933 long int offset, discrepanza[2];
935 int attesa, misura_finale[2];
938 char ii, nodo_di_misura_1[]={ADC_ADC_PGA_neg_out_ch0, ADC_ADC_PGA_neg_out_ch1};
939 char nodo_di_misura_2[]={ADC_ADC_PGA_pos_out_ch0, ADC_ADC_PGA_pos_out_ch1};
942 bool saturazione_canale[]={
false,
false};
950 attiva_il_CMRR( chi_aggiustiamo ,0);
952 attiva_il_CMRR( chi_aggiustiamo ,1);
955 if ( (tolleranza << 1) < (fine_trimmer_step[0]+fine_trimmer_step[1])) tolleranza = (fine_trimmer_step[0]+fine_trimmer_step[1]) >> 1;
960 nodo_di_misura_1[0]=ADC_ADC_PGA_neg_in_ch0;
961 nodo_di_misura_1[1]= ADC_ADC_PGA_neg_in_ch1;
962 nodo_di_misura_2[0]=ADC_ADC_PGA_pos_in_ch0;
963 nodo_di_misura_2[1]=ADC_ADC_PGA_pos_in_ch1;
964 coarse_trimmer_step[0] = coarse_Trimmer_offset_step_actual[0] ;
965 fine_trimmer_step[1] = coarse_Trimmer_offset_step_actual[1] ;
966 gain_da_moltiplicare= 1;
972 stato_della_misura=stato_compensazione_in_temperatura_sull_0ffset;
974 stato_della_misura=stato_compensazione_termica_su_zero_offset;
976if ( buffer_vettore_istruzioni_istruzione_byte_0 == 0xff) stato_della_misura=stato_senza_compensazione_in_temperatura;
980for( canale=0;canale<2;canale++){
981 if( (chi_aggiustiamo >> canale) & 1){
983 Trimmer_offset_preampli[canale].JFET_Offset=0x80;
986 Trimmer_offset_preampli[canale].JFET_Offset=dati_letti[0];
987 Trimmer_offset_preampli[canale].coarse_offset=dati_letti[1];
988 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_corse_offset_trimmer, Trimmer_offset_preampli[canale].coarse_offset);
990 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_JFET_Offset_trimmer, Trimmer_offset_preampli[canale].JFET_Offset);
994 while (stato_della_misura >=0){
998 if ( buffer_vettore_istruzioni_istruzione_byte_0 <0xff){
1000 if ( buffer_vettore_istruzioni_istruzione_byte_0==0){
1001 Misura_della_temperatura(temperatura);
1002 for (ii=0;ii<2;ii++){
1003 temperatura[ii]= temperatura[ii]*3;
1004 temperatura[ii]= temperatura[ii]/1000;
1006 temperatura[0]=buffer_vettore_istruzioni_istruzione_byte_0*3;
1007 temperatura[1]=temperatura[0];
1010 for (canale=0; canale<2;canale++){
1012 for (ii=0; ii< numero_temperature_impostazione_deriva[canale]; ii++){
1013 errore_temperatura= abs( valori_temperature_impostazione_deriva[canale][ii] - temperatura[canale]);
1014 if (errore_temperatura < errore){
1015 errore=errore_temperatura;
1016 temperatura_di_lavoro[canale]= ii;
1022 for (canale=0; canale<2;canale++){
1024 if( stato_della_misura ==0){
1025 if (canale) stato_della_misura=stato_esci_dalla_misura;
1026 if( (chi_aggiustiamo >> canale) & 1){
1027 offset_di_lavoro[canale]= (numero_offset_per_impostazione_deriva[canale] +1 ) >>1 ;
1031 Trimmer_offset_preampli[canale].coarse_thermal = dati_letti[ indirizzo_da_usare & 3];
1035 if( stato_della_misura ==stato_compensazione_in_temperatura_sull_0ffset_secondo_passo){
1036 if (canale) stato_della_misura=stato_esci_dalla_misura;
1037 if( (chi_aggiustiamo >> canale) & 1){
1040 for (ii=0; ii< numero_offset_per_impostazione_deriva[canale]; ii++){
1041 errore_temperatura= abs( valori_offset_per_impostazione_deriva[canale][ii] - (
signed char)(Trimmer_offset_preampli[canale].coarse_offset - dati_letti[1] ) ) ;
1042 if (errore_temperatura < errore){
1043 errore=errore_temperatura;
1044 offset_di_lavoro[canale]= ii;
1050 Trimmer_offset_preampli[canale].coarse_thermal = dati_letti[ indirizzo_da_usare & 3];
1054 if( stato_della_misura ==stato_compensazione_in_temperatura_sull_0ffset){
1055 if (canale) stato_della_misura=stato_compensazione_in_temperatura_sull_0ffset_secondo_passo;
1056 if( (chi_aggiustiamo >> canale) & 1){
1057 offset_di_lavoro[canale]= (numero_offset_per_impostazione_deriva[canale] +1 ) >>1 ;
1059 Trimmer_offset_preampli[canale].coarse_thermal = 0x80;
1063 if( stato_della_misura ==stato_senza_compensazione_in_temperatura){
1064 if (canale) stato_della_misura=stato_esci_dalla_misura;
1065 if( (chi_aggiustiamo >> canale) & 1){
1066 Trimmer_offset_preampli[canale].coarse_thermal = 0x80;
1071 if( stato_della_misura ==stato_misurare_parametro_per_EPROM_secondo_passo){
1072 if (canale) stato_della_misura=stato_misurare_parametro_per_EPROM_terzo_passo;
1073 if( (chi_aggiustiamo >> canale) & 1){
1074 Trimmer_offset_preampli[canale].JFET_Offset=0x80 +\
1075 (( (128 - Trimmer_offset_preampli[canale].coarse_offset) * JFET_offset_conversione) >> 7) ;
1076 Trimmer_offset_preampli[canale].coarse_offset=0x80;
1077 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_JFET_Offset_trimmer, Trimmer_offset_preampli[canale].JFET_Offset);
1081 if( stato_della_misura ==stato_misurare_parametro_per_EPROM){
1082 if (canale) stato_della_misura=stato_misurare_parametro_per_EPROM_secondo_passo;
1083 if( (chi_aggiustiamo >> canale) & 1){
1084 Trimmer_offset_preampli[canale].coarse_thermal = 0x80;
1085 Trimmer_offset_preampli[canale].JFET_Offset=0x80;
1086 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_JFET_Offset_trimmer, Trimmer_offset_preampli[canale].JFET_Offset);
1134 if( (chi_aggiustiamo >> canale) & 1){
1135 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_coarse_thermal_trimmer, Trimmer_offset_preampli[canale].coarse_thermal );
1139 Trimmer_offset_preampli[canale].coarse_offset = ((Trimmer_offset_preampli[canale].coarse_offset + Trimmer_offset_preampli[canale].coarse_thermal - 128)*coarse_Trimmer_drift_offset_ratio_by_2e7) >> 7 ;
1140 if( Trimmer_offset_preampli[canale].coarse_offset > 255) Trimmer_offset_preampli[canale].coarse_offset=255;
1141 if( Trimmer_offset_preampli[canale].coarse_offset <0) Trimmer_offset_preampli[canale].coarse_offset=0;
1142 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_corse_offset_trimmer, Trimmer_offset_preampli[canale].coarse_offset);
1154 valore_target_per_offset[1]=valore_target_per_offset[0];
1156 int valore_target_per_ch[]={(valore_target_per_offset[0] *(int)gain_da_moltiplicare )/ (int)PGA_Gain_V_su_V[0], (valore_target_per_offset[1] *(
int)gain_da_moltiplicare)/ (
int)PGA_Gain_V_su_V[1]};
1158 if (attesa == 0) attesa=1000;
1159 if( attesa > 10000) attesa =10000;
1162 char PGA_Gain_V_su_V_old[]={PGA_Gain_V_su_V[0], PGA_Gain_V_su_V[1]};
1167 for( canale=0;canale<2;canale++){
1168 if( (chi_aggiustiamo >> canale) & 1){
1170 risultato=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], offset);
1171 if ( (risultato >= saturazione_positiva) || (risultato <= saturazione_negativa) ){
1173 saturazione_canale[canale]=
true;
1182 for( canale=0;canale<2;canale++){
1183 if( (chi_aggiustiamo >> canale) & 1){
1185 offset=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], offset);
1186 discrepanza[canale] = offset - valore_target_per_ch[canale] ;
1190 Trova_valori_trimmer_per_offset_preamplificatore(discrepanza[canale], &Trimmer_offset_preampli[canale], coarse_trimmer_step[canale], fine_trimmer_step[canale]);
1192 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_corse_offset_trimmer, Trimmer_offset_preampli[canale].coarse_offset);
1193 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_fine_offset_trimmer, Trimmer_offset_preampli[canale].fine_offset);
1204 PGA_Gain_V_su_V[0]=PGA_Gain_V_su_V_old[0];
1205 PGA_Gain_V_su_V[1]=PGA_Gain_V_su_V_old[1];
1209 for( canale=0;canale<2;canale++){
1210 if( (chi_aggiustiamo >> canale) & 1){
1212 offset=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], offset) * (int)
guadagno_minimo_PGA / (
int)PGA_Gain_V_su_V[canale] ;
1213 int correzione = ( misura_finale[canale] - offset ) / (( (fine_trimmer_step[0]+fine_trimmer_step[1])>>1) ) ;
1214 Trimmer_offset_preampli[canale].fine_offset= Trimmer_offset_preampli[canale].fine_offset - correzione;
1215 if (Trimmer_offset_preampli[canale].fine_offset >255) Trimmer_offset_preampli[canale].fine_offset=255;
1216 if( Trimmer_offset_preampli[canale].fine_offset <0 ) Trimmer_offset_preampli[canale].fine_offset=0;
1217 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_fine_offset_trimmer, Trimmer_offset_preampli[canale].fine_offset);
1224for(canale=0;canale<2;canale++){
1226 misura_finale[canale]=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], offset);
1229misura_finale[0] =(misura_finale[0] / 1000);
1232misura_finale[1] =(misura_finale[1] / 1000);
1237 if( stato_della_misura ==stato_misurare_parametro_per_EPROM_terzo_passo){
1238 stato_della_misura=stato_esci_dalla_misura;
1239 for(canale=0;canale<2;canale++){
1240 if( (chi_aggiustiamo >> canale) & 1){
1264 for( canale=0;canale<2;canale++){
1265 if( saturazione_canale[canale]){
1266 Trimmer_offset_preampli[canale].fine_offset=0x80;
1267 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_fine_offset_trimmer, 0x80);
1268 Trimmer_offset_preampli[canale].coarse_offset =0;
1271 signed char posizione_bit_di_test;
1273 for( posizione_bit_di_test =7; posizione_bit_di_test>=0;posizione_bit_di_test--){
1274 for( canale=0;canale<2;canale++){
1275 if( saturazione_canale[canale]){
1276 Trimmer_offset_preampli[canale].coarse_offset |=(1 << posizione_bit_di_test) & 0xFF;
1277 Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (canale, preampli_corse_offset_trimmer, Trimmer_offset_preampli[canale].coarse_offset);
1280 if ( saturazione_canale[0] | saturazione_canale[1]){
1283 for( canale=0;canale<2;canale++){
1284 if( saturazione_canale[canale]){
1286 risultato=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], risultato);
1287 if ( (risultato >= saturazione_positiva) ){
1289 saturazione_canale[canale]=
true;
1292 if( (risultato <= saturazione_negativa) ){
1294 Trimmer_offset_preampli[canale].coarse_offset &= ~(1 << posizione_bit_di_test);
1295 saturazione_canale[canale]=
true;
1298 saturazione_canale[canale]=
false;
1394void attiva_il_CMRR(
char chi_aggiustiamo ,
char attivare_si_no){
1395 unsigned char canale, dati_letti[4];
1396 for( canale=0;canale<2;canale++){
1397 if( (chi_aggiustiamo >> canale) & 1){
1398 if( attivare_si_no) {
1403 Trimmer_CMRR_JFET_COLD.CMRR[canale]=dati_letti[0];
1404 Imposta_trimmer_common_mode_I2CB ( Trimmer_numero_offset + canale, Trimmer_CMRR_JFET_COLD.CMRR[canale]);
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...
void ADC_sleep_ON_OFF(uint8_t up_down, uint8_t ADC_ON_1_OFF_0_NOP_GT1)
ADC is set to sleep or awake.
void instr_ADC_LETTURA_function(void)
All the posible nodes voltages can be read with this instruction. Either the internal or an external ...
unsigned char medie_ADC
The number of averages done is 1 << medie_ADC, or 2^medie_ADC.
volatile uint8_t ADC_sleep_off
if 0 ADC in sleep when not working, ADC>1 ADC never sleep
@ instr_Shut_Down_ON_OFF
µ-controller can be maintained always ON
@ instr_NO_operation
NOP, the fw version is replayed.
@ instr_offset_trimmer_calibration
fine and coarse trimmer calibration for ofset compensation
@ instr_preamplifier_memory
Write /read the preamplifier EPROM.
@ instr_PGA_DAC_GAIN_CROSS
Set the gain of the second stage of the PGA.
@ instr_PGA_gain_set
Set the PGA gain value.
@ instr_detector_Vbias_we_want_to_set
The voltage we intend to set to the detector. This command does not apply the voltage.
@ instr_readback_node_voltages
Nodes voltage read from external ADC.
@ instr_ERROR_inspection
quering about the presence of any error
@ instr_LED_ON_OFF
LEDs can be switched ON/OFF for test and diagnostic.
@ instr_output_offset_to_be_set
Adjust the ouput voltage that was previously set at instr_ouput_offset_we_want_to_set.
@ instr_Vbias_to_be_set
The voltage set with instr_detector_Vbias_we_want_to_set is set to the detector.
@ instr_ADC_LETTURA
ADC reading, the following byte from the CAN set the reading node.
@ instr_preamplifier_scrittura_lettura_trimmer_offset
Write /read to /from the trimmers for the preamplifier offset adjustment.
@ instr_preamplifier_temperature_meas
Measure the preamplifier temperature.
@ instr_EPROM_read_write
read from preamplifier or mainboard or post frontend board EPROM
@ instr_connect_disconnect_mux_node
select/deselect a node from the analog mux
@ instr_preamplifier_gain_low_high_set
Set /reset of the large gain for the preamplifier.
@ instr_inizializza_tutto_da_zero
µ-controller is reset. The perifelal are all initialized.
@ instr_ERROR_echo_on_off
if enabled, echo of the error via CAN as soon as the error is verified
@ instr_ouput_offset_we_want_to_set
Set the output offset to set channel per channel.
@ instr_detector_scrittura_lettura_trimmer_bias
Write /read to /from the trimmers for the detectors biases.
@ instr_Relays_driver_set_reset_channel
Set / reset of the relais that manage the detectors.
@ instr_readback_variables
Variables Readback
@ instr_DetBias_trimmer_calibration
fine and coarse trimmer calibration for detector bias compensation
@ instr_periferal_reset
I2C, SPI and CAN can be reset.
@ instr_PGA_set_reset_pre_PGA_gain
Set /reset of the first stage of PGA.
@ The_total_number_of_instrucions
This is the total numebr of instructions, not an instruction.
@ instr_offset_voltage_variable
detector set voltage vector
@ instr_PGA_gain_variable
PGA gain vector.
@ instr_detector_bias_variable
detector set voltage vector
uint8_t tx_data[8]
Transmission data vector.
volatile uint8_t rx_data[8]
Received 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 massimo_guadagno_impostabile
uint8_t guadagno_minimo_PGA
uint8_t PGA_settled_gain[12]
PGA set gain.
void PGA_set_reset_pre_PGA_gain(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t set_2_reset_1_idle_0)
Here the 2 digital signals from the trimmer are exploited to set the gain of the input stage of the P...
void PGA_GAIN_set(char canale, unsigned int guadagno_da_impostare)
It sets the new gain irrespective of the offset.
void PGA_DAC_GAIN_CROSS(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t guadagno_da_impostare, uint8_t PGA_si_NO)
#define PGA_set_pre_pga_low_gain
Set the amplifier gain in front of the PGA to 1 V/V, it is left shifted once in the trimmer.
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...
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_...
void instr_Relays_driver_set_reset_channel_function(void)
Function to set the relais for detector bias.
#define wait_time_for_rele_setting
[ref_spi_clock_for_relais]
void Error_imposta_la_istruzione(void)
Function to be located at the end of every instruction to mark the error, if any.
void instr_ERROR_inspection_function(void)
The state of the errors can be verified/reset.
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.
void instr_ERROR_echo_on_off_function(void)
Immediate echos of a verified error activated/disattivated.
void termometro_lettura(uint8_t scheda_su_scheda_giu, uint8_t canale, uint32_t *temperatura_in_microK)
Read the termometer on preamplifier.
void instr_readback_variables_function(void)
readback of some parameters
void instruction_Misura_della_temperatura(void)
The temperature from both preamplifier is read.
void instruction_lettura_ADC(void)
ADC instrunction implementation with node selection.
void instr_NO_operation_function(void)
The NOP sends backs the fw version.
void instr_Shut_Down_ON_OFF_function(void)
μ-controller power down ON/OFF
void Setting_of_the_pointer_for_command_parser(void)
The pointer to the instruction functions is constructed here.
void instr_readback_node_voltages_function(void)
readback of some node voltages from external ADC
void instr_connect_disconnect_mux_node_function(void)
Routing of available node voltage to outout by means of the analog mux.
void instr_PGA_gain_set_function(void)
PGA gain set.
void instruction_Offset_compensation(void)
Output offset voltage compensation.
void instr_preamplifier_gain_low_high_set_function(void)
preamplifier gain set large or small
void instr_preamplifier_memory_function(void)
void instr_preamplifier_temperature_meas_function(void)
void(* ptr_istruzioni[The_total_number_of_instrucions])(void)
This is the pointer array to the instructions set: the byte istruzione_codice of the CAN message is t...
void aggiustamento_SAR(bool *saturazione_canale, int attesa, char *nodo_di_misura_1)
When the preamplifier output is saturated we start with the standard SAR.
void instruction_Detector_PGA_Rele(void)
This is a sub-function of the ADC instrunction. It is useful as it cane be used in other part of the ...
void instr_PGA_set_reset_pre_PGA_gain_function(void)
PGA input stage gain set.
void instruction_Some_parameters_to_set(void)
Some usefull parematers can be set here.
#define istruzione_byte_1
#define istruzione_byte_3
#define istruzione_byte_2
#define istruzione_byte_4_e_scelta_canale
#define istruzione_byte_0
void instr_LED_ON_OFF_function(void)
LEDs can be set ON/OFF.
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.
void instr_EPROM_read_write_function(void)
CAN insrtuction to Read from preamplifier, on-board and post frontend board EPROM.
@ Memory_postmainboard_ADCs_always_ON_0_powerdown_1
ADCs powerdown ON if 0, always ON if >1.
@ Memory_postmainboard_micro_PD_wait_time_in_sec
wait time before microcontroller power down since last operation
@ Memory_postmainboard_micro_powdown_active_1_alwaysON_0
microntroller aoutopower OFF if true, always ON if false
void Analog_mux_line_to_select_deselect(uint8_t scheda_su_scheda_giu, uint8_t line_to_select, uint8_t select_1_deselect_0)
Selection of the line to mesure with the analog MUX of the mainboard, driven by the I2C->parallel mux...
volatile uint32_t POWER_DOWN_MAX_ATTESA
upper limit for POWER_DOWN_TEMPO_ATTESA
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_preamplifier_scrittura_lettura_trimmer_offset_function(void)
Content of the preamplifier trimmers can be read/write.
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_...
void instr_ouput_offset_we_want_to_set_function(void)
The preamplifier offset will be set at the value passed from the CAN with this function if,...
int32_t preamplifier_Output_offset_target[12]
Offset target values.
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
void instr_offset_trimmer_calibration_function(void)
The fine and coarse trimmers for offset adjustment are calibrated here
void instr_inizializza_tutto_da_zero_function(void)
Start-up function.
void instr_periferal_reset_function(void)
I2C, SPI and CAN can be rest.
int wait_for_ADC_setting
settable from the can
bool flag_power_down
if flag_power_down is true the u-controller goes in power down after a while
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.
unsigned int FW_version
This is where the FW version is stored.