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

◆ preamplifier_trova_il_guess()

void preamplifier_trova_il_guess ( uint8_t  trimmer_da_usare)


The ouput offset will be set at the value that was given with the instr_ouput_offset_we_want_to_set instruction.

Returns
No Parameters, the actual result is sent to the CAN bus output throught tx_data.
422void preamplifier_trova_il_guess(uint8_t trimmer_da_usare){
423 #define numero_ripetizioni 3
424 uint8_t canale, indice , ripetizioni, preamplifier_canali_da_regolare_locale=preamplifier_canali_da_regolare_old,trimmer_per_ini;
425 uint8_t scheda_su_scheda_giu = ((vettore_istruzioni[6]>>7 &1)*6);
426 uint16_t iii,media_prov; //medie=20;
427 int16_t delta;
428 int32_t ADC_misura_fatta_prov,ADC_misura_fatta_prov_vet[200],ADC_misura_fatta_[12], *pendenza_trimmer;
429
430 if( trimmer_da_usare == trimmer_coarse_offset){
431 pendenza_trimmer = preamplifier_coarse_step_trimmer;
432 trimmer_per_ini = 0;
433 }else if (trimmer_da_usare == trimmer_fine_offset){
434 pendenza_trimmer = preamplifier_fine_step_trimmer;
435 trimmer_per_ini=1;
436 }
437
438 if(scheda_su_scheda_giu==1) scheda_su_scheda_giu=6;
439
440 //le condizioni di lavoro devono essere gi\'a impostate
441 //ripetiamo qualche volta
442 for(ripetizioni= 0; ripetizioni < numero_ripetizioni ;ripetizioni++){
443 //prima di tutto leggere tutte le uscite
444 Aspetta_tanti_ms(preamplifier_attesa_tra_le_misure);
445 for(canale=0; canale<6;canale++){ // Scansoniamo tutti i possibili canali sulla scheda selezionata
446 indice= canale + scheda_su_scheda_giu; //Solito 2 schede possibili, la prima schede ha indirizzi da 0 a 5, la seconda da 6 a 11
447
448 if( (preamplifier_canali_da_regolare_locale >> canale) & 1){//Selezionaiamo solo i canali indicati
449
450// ADC_misura_fatta_[indice]= ADC_misura_differenziale_con_media_at_PGA(scheda_su_scheda_giu, preamplifier_externalADC_1_onboardADC_0, canale, preamplifier_error_voltage_at_the_moment);
451 ADC_misura_fatta_[indice]=ADC_misura_differenziale_con_media_generico(scheda_su_scheda_giu,preamplifier_externalADC_1_onboardADC_0,canale,1);
452 //Attenzione che le uscite non siano sature
453 }//chiusura canali da considerare
454 }//chiusura Canali
455 for(canale=0; canale<6;canale++){ // Scansoniamo tutti i possibili canali sulla scheda selezionata
456 indice= canale + scheda_su_scheda_giu; //Solito 2 schede possibili, la prima schede ha indirizzi da 0 a 5, la seconda da 6 a 11
457
458 if( (preamplifier_canali_da_regolare_locale >> canale) & 1){//Selezionaiamo solo i canali indicati
459 if( (ADC_misura_fatta_[indice]<preamplifier_positive_saturation) && (ADC_misura_fatta_[indice]> preamplifier_negative_saturation)){
460
461 delta = ( preamplifier_Output_offset_target_at_the_moment[indice] - ADC_misura_fatta_[indice] ) / pendenza_trimmer[indice] ;
462 delta += (( preamplifier_Output_offset_target_at_the_moment[indice] - ADC_misura_fatta_[indice] ) % pendenza_trimmer[indice] ) / (pendenza_trimmer[indice]>>1); //mezzo bit recuperato
463
464 if( (delta + contenuto_trimmer_preamplifier[indice][trimmer_da_usare])<0){
465 contenuto_trimmer_preamplifier[indice][trimmer_da_usare] =0;
466 }else if( (delta +contenuto_trimmer_preamplifier[indice][trimmer_da_usare]) >0xff) {
467 contenuto_trimmer_preamplifier[indice][trimmer_da_usare] =0xff;
468 }else{
469 contenuto_trimmer_preamplifier[indice][trimmer_da_usare] += delta;
470 }
471 //Aggiungiamoci il valore della correzione della temperatura aggiustato al valore del trimmer dell'offset
472 if ( (trimmer_da_usare ==trimmer_coarse_offset)){
473 termalizzazione_fatta[indice]=1;
474 preamplifier_determina_trimmer_therma_comp( scheda_su_scheda_giu, canale, contenuto_trimmer_preamplifier[indice][trimmer_da_usare], 0);
475 }
476
477 preamplifier_scrittura_lettura_trimmer(scheda_su_scheda_giu, canale, trimmer_da_usare, contenuto_trimmer_preamplifier[indice][trimmer_da_usare],1);
478 if ( (delta<3) && (delta>-3)){// siamo giusti, con errore contenuto
479 preamplifier_canali_da_regolare_locale -= 1<<canale ;
480// preamplifier_SAR_ini[indice].starting_value = ( contenuto_trimmer_preamplifier[indice][trimmer_da_usare] ) & 0xFC;
481 }
482 if (delta<0)delta=-delta;
483 if( contenuto_trimmer_preamplifier[indice][trimmer_da_usare] >= delta){
484 preamplifier_SAR_ini[indice].starting_value = contenuto_trimmer_preamplifier[indice][trimmer_da_usare] -delta ;
485 }else{
486 preamplifier_SAR_ini[indice].starting_value=0;
487 }
488 if (delta<=1){
489 preamplifier_SAR_ini[indice].starting_exp_value[ trimmer_per_ini]= 1;
490 }else if (delta <= 3) {
491 preamplifier_SAR_ini[indice].starting_exp_value[ trimmer_per_ini]= 2;
492 }else if (delta <= 10){
493 preamplifier_SAR_ini[indice].starting_exp_value[ trimmer_per_ini]= 3;
494 }else if (delta > 10){
495 preamplifier_SAR_ini[indice].starting_exp_value[ trimmer_per_ini]= 5;
496 }
497
498 }/* chiusura saturazione rispettata */ else{
499 preamplifier_canali_da_regolare_locale -= 1<<canale ; //rimane il default
500 preamplifier_SAR_ini[indice].starting_value=0;
501 }//chiusura saturazione non rispettata
502 }//chiusura canali da considerare
503 }//chiusura Canali
504 }//chiusura ripetiamo qualche volta
505 for(canale=0; canale<6;canale++){ // Scansoniamo tutti i possibili canali sulla scheda selezionata
506 indice= canale + scheda_su_scheda_giu; //Solito 2 schede possibili, la prima schede ha indirizzi da 0 a 5, la seconda da 6 a 11
507
508 if( (preamplifier_canali_da_regolare_locale >> canale) & 1){
509 contenuto_trimmer_preamplifier[indice][trimmer_da_usare]= preamplifier_SAR_ini[indice].starting_value;
510 }
511 }
512}
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
void preamplifier_trova_il_guess(uint8_t trimmer_da_usare)
void preamplifier_determina_trimmer_therma_comp(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t valore_previsto_trimmer_offset, uint8_t solo_recupero_default_comp_se_1)
This function determines and set the thermal compensation trimmer.
void Aspetta_tanti_ms(int millisecondi)
The timing function.
Definition: Timer.c:52
uint8_t volatile contenuto_trimmer_preamplifier[12][4]
Definition: Trimmer.c:179
void preamplifier_scrittura_lettura_trimmer(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 preamplifier trimmer, the contents of the trimmers are stored in...
Definition: Trimmer.c:283
#define trimmer_fine_offset
Definition: Trimmer.h:80
#define trimmer_coarse_offset
Definition: Trimmer.h:82
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.

Definition at line 422 of file Preamplifier_Offset_Drift_Correcttion.c.