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

◆ instruction_Detector_bias()

void instruction_Detector_bias ( void  )

The detector bias is set at the value passed from the CAN.

This instruction needs to know which channel to set at byte istruzione_byte_4_e_scelta_canale and the the setting value, in mV, byte_istr_dati_0 and byte_istr_dati_1 of the CAN message.

Returns
No Parameters, the actual result is sent to the CAN bus output throught tx_data.
1146{
1147 //Per la positiva
1148// long int vout_pos, vout_neg;
1149 #define offset_adjusted_at_the_pre_bias_set 0 /*Byte_1*/
1150 #define bias_adjustement_start_from_half_scale 1 /*Byte_1*/
1151 bool errore_pos[2]={true,true}, errore_neg[2]={true,true},errore_generale=true;
1152// int valore_positivo,valore_negativo, tolleranza=((vettore_istruzioni[istruzione_byte_3]*1000)/bias_reading_attenuation)/2;//diviso 2 perch\'e \'e sulle 2 tensioni che si determina l'errore
1153 int valore_positivo,valore_negativo, tolleranza=((vettore_istruzioni[istruzione_byte_3]*1000))/2;//diviso 2 perch\'e \'e sulle 2 tensioni che si determina l'errore
1154 unsigned int attesa;
1155 long int discrepanza;
1156 char canale=0, troppe_misure=0,ii;
1157// int tensione_target_attenuata[]={(Detector_Voltage_Bias[0]>>1)/bias_reading_attenuation, (Detector_Voltage_Bias[1]>>1)/bias_reading_attenuation};
1158 int tensione_target_attenuata[]={(Detector_Voltage_Bias[0]>>1), (Detector_Voltage_Bias[1]>>1)};
1159// vout_pos = ( vettore_istruzioni[byte_istr_dati_0] & 0xFF+ ((vettore_istruzioni[byte_istr_dati_1] & 0xFF) << 8) ); // Viene letto il valore scelto da remoto
1160// vout_pos = ((vout_pos>>1) * 1000)/ bias_reading_attenuation ;
1161 int offset;
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};
1164// int coarse_trimmer_step = coarse_Trimmer_offset_step * guadagno_minimo_PGA ; //*********************************************
1165// int fine_trimmer_step = fine_Trimmer_offset_step * guadagno_minimo_PGA ; //*********************************************
1166
1167// vout_neg=-vout_pos;
1168// int16_t Valori_per_i_trimmer_pos[2],Valori_per_i_trimmer_neg[2]; // Qui verranno inseriti i valori per i trimmer
1169 struct canale_ADC_type{
1170 unsigned char att_pos;
1171 unsigned char att_neg;
1172 }canale_ADC[]={ADC_Misura_bias_10_att_ch0_p,ADC_Misura_bias_10_att_ch0_n,ADC_Misura_bias_10_att_ch1_p,ADC_Misura_bias_10_att_ch1_n} ;
1173
1174 //PGA a 1 per evitare sconquassi
1175 if( vettore_istruzioni[istruzione_byte_1] >> offset_adjusted_at_the_pre_bias_set) {
1176 //Vogliamo lacsiare l'offset inalterato
1177 for( canale=0;canale<2;canale++){
1178 if( ((vettore_istruzioni[istruzione_byte_4_e_scelta_canale]&3) >> canale) & 1){
1179// offset=lettura_ADC( nodo_di_misura_1[canale]) - lettura_ADC( nodo_di_misura_2[canale]); //Il <<1 \'e per renderlo differenziale
1180 valore_target_per_offset[canale]=correzione_misura_ADC(coeffcienti_misura_ADC_nodi[nodo_di_misura_1[canale]], offset);
1181 //Voglim mantenere la tenione allo stesso livello se \'e in scala, altrimenti aggiustiamo a zero
1182 if( (valore_target_per_offset[canale] >= saturazione_positiva) || ( valore_target_per_offset[canale] <= saturazione_negativa ) ) {
1183 valore_target_per_offset[canale]=0;
1184 }
1185 //L'offset all'uscita del pga che vorremo avere a guadagno 1
1186 valore_target_per_offset[canale] = ( valore_target_per_offset[canale] * (int)guadagno_minimo_PGA ) / (int)PGA_Gain_V_su_V[canale] ;
1187 }
1188 }
1189 }
1190 char PGA_Gain_V_su_V_old[]={PGA_Gain_V_su_V[0], PGA_Gain_V_su_V[1]};
1191 PGA_GAIN_set(3,1);
1192
1193// if ( vettore_istruzioni[istruzione_byte_4_e_scelta_canale]) canale=1;
1194
1195
1197 attesa =1000;
1198 }else {
1200 }
1201 for(ii =0; ii<2;ii++){
1202 if( ( ((vettore_istruzioni[istruzione_byte_4_e_scelta_canale]) >> ii) & 1) == 0) {
1203 errore_pos[ii]=false;
1204 errore_neg[ii]=false;
1205 }
1206 }
1207
1208 if( (vettore_istruzioni[istruzione_byte_1] >> bias_adjustement_start_from_half_scale) ){
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); // Viene fatta una misura con entrambi i trimmer a met\'a scala per ricavare l'offset
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); // Viene fatta una misura con entrambi i trimmer a met\'a scala per ricavare l'offset
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);
1219 }
1220 }
1221 Aspetta_tanti_ms(attesa);
1222}
1223
1224 for(canale =0; canale<2;canale++){
1225 if ( errore_pos[canale] ){
1226// offset = lettura_ADC( canale_ADC[canale].att_pos); // Viene misurato l'offset per usscita pos e valutato il nuvo valore dei trimmer
1227 offset = correzione_misura_ADC(indice_Vbias, offset);
1228 discrepanza = tensione_target_attenuata[canale] - offset;
1229// Trova_valori_trimmer_per_la_Vbias_del_rivelatore_per_la_tensione_in_uscita_uguale_a_vout ( tensione_target_attenuata[canale], &detector_Trimmer_bias[canale].coarse_pos, 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]);
1231
1232
1233// offset = lettura_ADC( canale_ADC[canale].att_neg); // Viene misurato l'offset per uscita neg e valutato il nuovo valore dei trimmer
1234 offset = correzione_misura_ADC(indice_Vbias, offset);
1235 discrepanza = -tensione_target_attenuata[canale] - offset;
1236// Trova_valori_trimmer_per_la_Vbias_del_rivelatore_per_la_tensione_in_uscita_uguale_a_vout ( -tensione_target_attenuata[canale], &detector_Trimmer_bias[canale].coarse_neg, 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);
1240
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);
1243 }
1244 }
1245 Aspetta_tanti_ms(attesa);
1246
1247while( errore_generale && (troppe_misure<5) ){
1248 errore_generale=false;
1249 troppe_misure++;
1250 for( canale=0;canale<2;canale++){
1251 if(errore_pos[canale]){
1252
1253// risultato= lettura_ADC( canale_ADC[canale].att_pos); // Viene misurato il Vbias Pos
1254 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1255 discrepanza = tensione_target_attenuata[canale] - risultato; // Si itera finch\'e |discrepanza| < tot
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);
1260 }
1261 if (errore_neg[canale]){
1262// risultato= lettura_ADC( canale_ADC[canale].att_neg);
1263 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1264 discrepanza = -tensione_target_attenuata[canale] - risultato; // Si itera finch\'e |discrepanza| <1
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);
1269 }
1270 errore_generale |=errore_neg[canale] | errore_pos[canale] ;
1271 }
1272 Aspetta_tanti_ms(attesa);
1273 }
1274
1275 //Ristabiliamo l'offset se richiesto
1276 if( vettore_istruzioni[istruzione_byte_1] >> offset_adjusted_at_the_pre_bias_set) {
1277 //Il bias viene riaggiustato al valore originale
1279 vettore_istruzioni[istruzione_byte_1]=0x40; //Offset target from elsewhere
1282 }
1283
1285 for ( canale=0;canale<2;canale++){
1286// risultato= lettura_ADC( canale_ADC[canale].att_pos); // Viene misurato il Vbias Pos
1287 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1288// valore_positivo = (risultato*bias_reading_attenuation)/1000;
1289 valore_positivo = (int)(((risultato)/1000) & 0xFFFFFFFF);
1290// tx_data[byte_istr_dati_0] = valore_positivo & 0xFF;
1291// tx_data[byte_istr_dati_1] = (valore_positivo >>8) & 0xFF;
1292
1293// risultato= lettura_ADC( canale_ADC[canale].att_neg);
1294 risultato = correzione_misura_ADC(indice_Vbias, risultato);
1295// valore_negativo = (risultato*bias_reading_attenuation)/1000;
1296 valore_negativo = (int)(((risultato)/1000) & 0xFFFFFFFF);
1297 valore_negativo =valore_positivo - valore_negativo;
1298 tx_data[byte_istr_dati_0 + 2*canale] = (unsigned char)(valore_negativo & 0xFF);
1299 tx_data[byte_istr_dati_1+ 2*canale] = (unsigned char)((valore_negativo >>8) & 0xFF);
1300 tx_data[istruzione_byte_4_e_scelta_canale] = ( errore_neg[canale] | errore_pos[canale] ) << canale;
1301 }
1302 //PGA ristabilito
1303 PGA_GAIN_set(1,PGA_Gain_V_su_V_old[0]);
1304 PGA_GAIN_set(2,PGA_Gain_V_su_V_old[1]);
1305
1306
1307}
uint8_t tx_data[8]
Transmission data vector.
Definition: Can.c:321
uint8_t guadagno_minimo_PGA
Definition: DAC_PGA.c:88
void PGA_GAIN_set(char canale, unsigned int guadagno_da_impostare)
It sets the new gain irrespective of the offset.
Definition: DAC_PGA.c:443
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.
void instruction_Offset_compensation(void)
Output offset voltage compensation.
Definition: Istruzioni.c:902
#define istruzione_byte_1
Definition: Istruzioni.h:21
#define istruzione_byte_3
Definition: Istruzioni.h:23
#define istruzione_byte_2
Definition: Istruzioni.h:22
#define ADC_Misura_bias_10_att_ch0_p
mux 4
Definition: Istruzioni.h:193
#define byte_istr_dati_1
Definition: Istruzioni.h:26
#define byte_istr_dati_0
Definition: Istruzioni.h:25
#define istruzione_byte_4_e_scelta_canale
Definition: Istruzioni.h:24
#define ADC_Misura_bias_10_att_ch1_p
mux 2
Definition: Istruzioni.h:175
void Aspetta_tanti_ms(int millisecondi)
The timing function.
Definition: Timer.c:52
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.

Definition at line 1145 of file Detector_Bias.c.