Output offset voltage compensation.
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){
uint8_t tx_data[8]
Transmission data vector.
uint8_t guadagno_minimo_PGA
void PGA_GAIN_set(char canale, unsigned int guadagno_da_impostare)
It sets the new gain irrespective of the offset.
void instruction_Offset_compensation(void)
Output offset voltage compensation.
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.
#define istruzione_byte_1
#define istruzione_byte_3
#define istruzione_byte_2
#define istruzione_byte_4_e_scelta_canale
#define istruzione_byte_0
void Aspetta_tanti_ms(int millisecondi)
The timing function.
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.