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

◆ instr_Vbias_to_be_set_function()

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_function() with which the target values are stored in the vector Detector_bias_target[].

Returns
No Parameters, the actual result is sent to the CAN bus output throught tx_data.
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;
337int32_t delta;
338
340//uint8_t non_toccare_il_gain_del_pre= vettore_istruzioni[3] & 0x2;
341
342 for(iii=0;iii < 8;iii++){// Potrebbe essere richiesto qualcosa sul can,
343 //bufferizziamo l'istruzione
344 tx_data_buffer[iii]= tx_data[iii];
345 }
346// Ora interpretiamo l'istruzione
347 //attesa tra le misure
348 Detector_attesa_tra_le_misure = vettore_istruzioni[4] *100;
349 if (Detector_attesa_tra_le_misure==0) Detector_attesa_tra_le_misure=100;
350 //errore tollerato
351 Detector_error_voltage= vettore_istruzioni[5] *1000;
352 if (Detector_error_voltage==0) Detector_error_voltage=200e3;
353 if( Detector_error_voltage < minimum_error_detector_voltage) Detector_error_voltage = minimum_error_detector_voltage;
354 //i canali da agiustare
355 Detector_canali_da_regolare= vettore_istruzioni[6];
356 uint8_t Detector_canali_da_regolare_iniziali = Detector_canali_da_regolare;
357 scheda_su_scheda_giu = ((vettore_istruzioni[6] >> 7) & 1)*6;
358
359//Flags dal byte 3 dell'istruzione
360 Detector_externalADC_1_onboardADC_0 = vettore_istruzioni[3] & 1; //l'adc da usare, interno o esterno
361 Detector_pre_out_offset_no_change = (vettore_istruzioni[3]>>3 ) & 1; //pre output offset no change
362 Detector_offset_starts_at_half_scale = ( vettore_istruzioni[3] >> 4 ) & 1; //
363
364// struct EPROM_detector_{
365// int32_t slope_coarse_positiva;
366//// int32_t coefficiente_raccordo_slope_coarse; //=(slope_coarse_pos<<10)/(slope_coarse_neg), ricordarsi di dividere per 2^10 quando si usa
367// int32_t slope_coarse_negativa;
368// int32_t slope_fine_positiva;
369//// int32_t coefficiente_raccordo_slope_fine; //=(slope_fine_pos<<10)/(slope_fine_neg), ricordarsi di dividere per 2^10 quando si usa
370// int32_t slope_fine_negativa;
371//// int8_t offset_coarse_neg;
372//// int8_t offset_fine_neg;
373//};
374
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};
383
384ERROR_codifica_errore( 0, 0, 0, 0 ); // In caso il canale 0 non sia compreso resettiamo qui
385
386//Leggiamo le memorie
387//Inganniamo e prepariamo l'istruzione per l'eventuale valutazione della pendenza qui sotto
388for(iii=0;iii<4;iii++){
389 tx_data[iii]=0;
390}
391tx_data[4]= (tx_data_buffer[3] & 1 )+ (vettore_istruzioni[2] << 2);
392
393 for(canale=0;canale<6;canale++){//Carichiamo o determiniamo le pendenze
394 if( (Detector_canali_da_regolare >> canale) &1){
395 EPROM_lettura_M24C32_64(scheda_su_scheda_giu, I2C_mainboard, canale, Memory_detector_coarse_slope_calibration_ON_0_OFF_ff <<2,dati_scambio);
396
397 if(flag_error_verified) Detector_canali_da_regolare =0; //Lettura fallita, non facciamo pi\'u niente
398
399 if(dati_scambio[0] & (flag_error_verified ==0)){// Calibrazione non ancora fatta.
400 //Se non c'e' calibrazione usiamo il default e segnaliamo l'errore
402 flag_error_verified=0; //Forziamo la misura
403 no_slope =0xFF; //Segnaliamo per l'errore
404// tx_data[5]=2; //coarse measurement
405// tx_data[6] = canale;
406// tx_data[4]= (tx_data_buffer[3] & 1 )+ (vettore_istruzioni[2] << 2);
407// if (scheda_su_scheda_giu) tx_data[6] += 0x80;
408// instr_DetBias_trimmer_calibration_function(); //Si misura e si mette nella eprom la pendenza coarse
409// if(flag_error_verified) Detector_canali_da_regolare =0; //Lettura fallita, non facciamo pi\'u niente
410 }
411// if ( (flag_error_verified ==0)){ //provvisorio, poi si toglie
412 if( dati_scambio[0] ==0){
413 EPROM_lettura_M24C32_64(scheda_su_scheda_giu, I2C_mainboard, canale, Memory_detector_positive_address_coarse_trimmer_slope_bias <<2,dati_scambio);
414 EPROM_detector[canale].slope_coarse_positiva=*(int32_t *)dati_scambio;
415 EPROM_lettura_M24C32_64(scheda_su_scheda_giu, I2C_mainboard, canale, Memory_detector_negative_address_coarse_trimmer_slope_bias <<2,dati_scambio);
416 EPROM_detector[canale].slope_coarse_negativa= *(int32_t *)dati_scambio;
417// EPROM_detector[canale].coefficiente_raccordo_slope_coarse = (EPROM_detector[canale].slope_coarse_positiva << 10) / EPROM_detector[canale].slope_coarse_negativa ;
418 }
419
420 EPROM_lettura_M24C32_64(scheda_su_scheda_giu,I2C_mainboard, canale, Memory_detector_fine_slope_calibration_ON_0_OFF_ff <<2,dati_scambio);
421 if(flag_error_verified) Detector_canali_da_regolare =0; //Lettura fallita, non facciamo pi\'u niente
422
423 if(flag_error_verified) Detector_canali_da_regolare =0; //Lettura fallita, non facciamo pi\'u niente
424 if(dati_scambio[0] & (flag_error_verified ==0)){
425 tx_data[5]=1; //fine measurement
426 tx_data[6] = canale ;
427 tx_data[4]= (tx_data_buffer[3] & 1 )+ (vettore_istruzioni[2] << 2);
428 if(scheda_su_scheda_giu) tx_data[6] += 0x80;
429 instr_DetBias_trimmer_calibration_function(); //Si misura e si mette nella eprom la pendenza fine
430 if(flag_error_verified) Detector_canali_da_regolare =0;
431 }
432 if ( (flag_error_verified ==0)){ //provvisorio, poi si toglie
433 EPROM_lettura_M24C32_64(scheda_su_scheda_giu, I2C_mainboard, canale, Memory_detector_positive_address_fine_trimmer_slope_bias <<2,dati_scambio);
434 EPROM_detector[canale].slope_fine_positiva=*(int32_t *)dati_scambio;
435 EPROM_lettura_M24C32_64(scheda_su_scheda_giu, I2C_mainboard, canale, Memory_detector_negative_address_fine_trimmer_slope_bias <<2,dati_scambio);
436 EPROM_detector[canale].slope_fine_negativa= *(int32_t *)dati_scambio;
437// EPROM_detector[canale].coefficiente_raccordo_slope_fine = (EPROM_detector[canale].slope_fine_positiva << 10) / EPROM_detector[canale].slope_fine_negativa ;
438 }
439 }
440 }
441 for(iii=0;iii<8;iii++){
442 tx_data[iii]= tx_data_buffer[iii]; //recuperiamo l'istruzione
443 }
444
445if (Detector_offset_starts_at_half_scale){
446//Initialization for default SAR, changes are applied in fastSAR, eventually
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;
450 }
451 }else{//Si inizia ad aggiustare da dove si \'e
452 for( canale=0;canale<6;canale++){
453 Detector_SAR_ini[canale + scheda_su_scheda_giu].starting_value_pos =contenuto_trimmer_detector[canale + scheda_su_scheda_giu][Detector_trimmer_coarse_bias_pos];
454 Detector_SAR_ini[canale + scheda_su_scheda_giu].starting_value_neg =contenuto_trimmer_detector[canale + scheda_su_scheda_giu][Detector_trimmer_coarse_bias_neg];
455 }
456 }
457
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;
464 }
465 }
466
467//FINE: Initialization for default SAR, changes are applied in fastSAR, eventually
468
469//Se vogliamo conservare l'offset dobbiamo misurarlo.
470 if(Detector_pre_out_offset_no_change){
471 for( canale=0;canale<6;canale++){
472 if( (Detector_canali_da_regolare >> canale) &1 ){
473 preamplifier_Output_offset_target[scheda_su_scheda_giu + canale] = ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,preamplifier_externalADC_1_onboardADC_0,canale,1);
474 }
475 }
476 }
477//Impostiamo tutti i guadagni del PGA ad 1 e del pre a 20
478if(flag_error_verified==0){
479 for(canale=0; canale< 6; canale++){
480 preamplifier_set_reset_pre_gain ( scheda_su_scheda_giu, canale, preamplifier_Gain_basso );
481 indice= canale + scheda_su_scheda_giu;
482 Detector_PGA_settled_gain_old[indice]= PGA_settled_gain[indice];
483 PGA_GAIN_CROSS( scheda_su_scheda_giu , canale , guadagno_minimo_PGA );
484 if(flag_error_verified) Detector_canali_da_regolare =0;
485 //Inserire test errori qui
486 }
487}
488
489
490 //SAR ottimizzato
491 Detector_aggiusta_offset_SAR( EPROM_detector, scheda_su_scheda_giu);
492
493
494//Riportiamo i guadagni al valore nominale
495
496 for(canale=0; canale< 6; canale++){
497 preamplifier_set_reset_pre_gain ( scheda_su_scheda_giu, canale, preamplifier_Gain_alto );
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] );
500 }
501
502 if(Detector_pre_out_offset_no_change){
503 uint8_t istruzione_old[8];
504 for(iii=0;iii<8;iii++){
505 istruzione_old[iii]=vettore_istruzioni[iii];
506 }
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];
509 }
511 vettore_istruzioni[2]=istruzione_old[2];vettore_istruzioni[3]=0;
512 if(vettore_istruzioni[2] ==0) vettore_istruzioni[2]=10;
513 vettore_istruzioni[4]=istruzione_old[4];
515 vettore_istruzioni[5]=istruzione_old[5];
516 if(vettore_istruzioni[5]==0) vettore_istruzioni[5] =50;
517 vettore_istruzioni[6]=istruzione_old[6];
519 instr_output_offset_to_be_set_function(); //Lanciamo la funzione di aggiustamento offset, che alla fine imposter\'a i guadagni corretti finali
520 for(iii=0;iii<8;iii++){
521 vettore_istruzioni[iii]=istruzione_old[iii];
522 }
523 }
524
525 for(iii=0;iii < 8 ;iii++){
526 tx_data[iii]= tx_data_buffer[iii];
527 }
528 tx_data[0] = no_slope; //Se la slope non nella rom la notifichiamo
529 tx_data[6] = Detector_canali_da_regolare & 0x3F; //i canali non in tolleranza hanno un 1 in corrispondenza
530 tx_data[5] = Detector_error_voltage / 1000;
532
533 //Dobbiamo scrivere in memoria se richiesto, da abilitare
534// EPROM_store_recover_detector_voltage_M24C32_64( scheda_su_scheda_giu, Detector_canali_da_regolare_iniziali, \
535// Detector_Voltage_Bias[3 + scheda_su_scheda_giu] , 0 );
536
537}
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
volatile uint16_t ADC_medie_per_misura
the number of ADC readings to average, the maximum is 400
Definition: Adc.c:206
@ 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.
Definition: Can.c:321
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...
Definition: DAC_PGA.c:109
uint8_t guadagno_minimo_PGA
Definition: DAC_PGA.c:88
uint8_t PGA_settled_gain[12]
PGA set gain.
Definition: DAC_PGA.c:95
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...
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_...
#define minimum_error_detector_voltage
< Minimum settbale voltage error for detector bias above
Definition: Detector_Bias.h:30
#define Detector_trimmer_coarse_bias_pos
Definition: Detector_Bias.h:98
#define Detector_trimmer_coarse_bias_neg
Definition: Detector_Bias.h:99
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.
@ Detector_bias_slopes_not_available
One or more channels have not the slope set.
@ error_address_Bias_adjustment
Error register for channel detector bias adjustment.
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
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.
void instr_DetBias_trimmer_calibration_function(void)
The fine and coarse trimmers for Detector bias adjustment are calibrated here
Definition: Trimmer.c:480
uint8_t contenuto_trimmer_detector[12][4]
Content of the trimmer for detector bias system.
Definition: Trimmer.c:161
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.

Definition at line 333 of file Detector_Bias.c.