1#include "tutti_gli_header.h"
173volatile uint16_t preamplifier_attesa_tra_le_misure = 10;
175int32_t preamplifier_error_voltage= 10000;
177uint8_t preamplifier_canali_da_regolare= 0;
179uint8_t preamplifier_externalADC_1_onboardADC_0 ;
182volatile int32_t preamplifier_Output_offset_target_at_the_moment[12] ;
183volatile uint8_t termalizzazione_fatta[12];
186int32_t preamplifier_error_voltage_at_the_moment[12];
187int32_t preamplifier_error_voltage_at_PGA_gain[12];
188int32_t ADC_misura_fatta_old[12]={0,0,0,0,0,0,0,0,0,0,0,0};
190int32_t preamplifier_coarse_step_trimmer[]={preamplifier_coarse_step_trimmer_default,preamplifier_coarse_step_trimmer_default,preamplifier_coarse_step_trimmer_default, \
191 preamplifier_coarse_step_trimmer_default, preamplifier_coarse_step_trimmer_default,preamplifier_coarse_step_trimmer_default, \
192 preamplifier_coarse_step_trimmer_default,preamplifier_coarse_step_trimmer_default, preamplifier_coarse_step_trimmer_default,
193 preamplifier_coarse_step_trimmer_default,preamplifier_coarse_step_trimmer_default,preamplifier_coarse_step_trimmer_default,};
194int32_t preamplifier_fine_step_trimmer[]={preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default, \
195 preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default, \
196 preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default, \
197 preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default,preamplifier_fine_step_trimmer_default,};
202 preamplifier_SAR_ini[12];
204uint8_t PGA_settled_gain_old[12] , preamplifier_canali_da_regolare_old;
210int32_t
preamplifier_Output_offset_target[12]={0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
229 uint8_t scheda_su_giu = (canali_input >> 7) & 1;
230 uint8_t offset_scheda=0;
234 for( canali_=0; canali_ <6; canali_ ++){
235 if( (canali_input >> canali_) & 1){
254 uint8_t scrivere_leggere= (canale >> 6) & 1;
255 uint8_t scheda_su_giu= ((canale >> 7) & 1)*6;
257 for ( canale_=0; canale_ <6; canale_++){
258 if ( (canale >> canale_) & 1){
260 contenuto_trimmer, scrivere_leggere );
278uint8_t iii,canale, indice;
279uint8_t
volatile tx_data_buffer[8],fai_fai=1;
284 for(iii=0;iii < 8;iii++){
286 tx_data_buffer[iii]=
tx_data[iii];
296 if ( preamplifier_attesa_tra_le_misure <100) preamplifier_attesa_tra_le_misure=100;
297 if (preamplifier_attesa_tra_le_misure > 10000) preamplifier_attesa_tra_le_misure=10000;
302 preamplifier_canali_da_regolare_old=preamplifier_canali_da_regolare;
327 uint8_t dati_scambio[4] , scheda=scheda_su_scheda_giu;
328 for( canale=0;canale<6;canale++){
331 if(dati_scambio[0] ==0){
333 preamplifier_coarse_step_trimmer[canale+scheda]=*(int32_t *)dati_scambio;
335 preamplifier_fine_step_trimmer[canale+scheda]= *(int32_t *)dati_scambio;
337 preamplifier_error_voltage_at_the_moment[canale+scheda]= preamplifier_coarse_step_trimmer[canale+scheda] >>1;
343 for( canale=0;canale<12;canale++){
344 preamplifier_SAR_ini[canale].starting_value =128;
345 preamplifier_SAR_ini[canale].starting_exp_value[0]=7;
346 preamplifier_SAR_ini[canale].starting_exp_value[1]=7;
349 for( canale=0;canale<6;canale++){
350 if((preamplifier_canali_da_regolare >> canale) & 1){
361 for( canale=0;canale<6;canale++){
362 if((preamplifier_canali_da_regolare >> canale) & 1){
364 termalizzazione_fatta[canale + scheda_su_scheda_giu]=0;
373 uint8_t ri_misuriamo=0;preamplifier_canali_da_regolare_old=preamplifier_canali_da_regolare;
374 for( canale=0;canale<6;canale++){
375 if((preamplifier_canali_da_regolare_old >> canale) & 1){
376 if (termalizzazione_fatta[canale + scheda_su_scheda_giu]==0){
377 preamplifier_canali_da_regolare=1 <<canale;
399 for(iii=0;iii < 8 ;iii++){
400 tx_data[iii]= tx_data_buffer[iii];
402 tx_data[6] = preamplifier_canali_da_regolare;
404 for( iii=0;iii<6;iii++){
405 somma += preamplifier_error_voltage_at_PGA_gain[iii+scheda_su_scheda_giu];
407 somma = somma / 6000;
408 if( somma >255) somma=255;
423 #define numero_ripetizioni 3
424 uint8_t canale, indice , ripetizioni, preamplifier_canali_da_regolare_locale=preamplifier_canali_da_regolare_old,trimmer_per_ini;
426 uint16_t iii,media_prov;
428 int32_t ADC_misura_fatta_prov,ADC_misura_fatta_prov_vet[200],ADC_misura_fatta_[12], *pendenza_trimmer;
431 pendenza_trimmer = preamplifier_coarse_step_trimmer;
434 pendenza_trimmer = preamplifier_fine_step_trimmer;
438 if(scheda_su_scheda_giu==1) scheda_su_scheda_giu=6;
442 for(ripetizioni= 0; ripetizioni < numero_ripetizioni ;ripetizioni++){
445 for(canale=0; canale<6;canale++){
446 indice= canale + scheda_su_scheda_giu;
448 if( (preamplifier_canali_da_regolare_locale >> canale) & 1){
455 for(canale=0; canale<6;canale++){
456 indice= canale + scheda_su_scheda_giu;
458 if( (preamplifier_canali_da_regolare_locale >> canale) & 1){
459 if( (ADC_misura_fatta_[indice]<preamplifier_positive_saturation) && (ADC_misura_fatta_[indice]> preamplifier_negative_saturation)){
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);
473 termalizzazione_fatta[indice]=1;
478 if ( (delta<3) && (delta>-3)){
479 preamplifier_canali_da_regolare_locale -= 1<<canale ;
482 if (delta<0)delta=-delta;
486 preamplifier_SAR_ini[indice].starting_value=0;
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;
499 preamplifier_canali_da_regolare_locale -= 1<<canale ;
500 preamplifier_SAR_ini[indice].starting_value=0;
505 for(canale=0; canale<6;canale++){
506 indice= canale + scheda_su_scheda_giu;
508 if( (preamplifier_canali_da_regolare_locale >> canale) & 1){
529 uint8_t canale=0, indice;
530 if(scheda_su_scheda_giu_>=1) scheda_su_scheda_giu_=6;
534 preamplifier_canali_da_regolare_old = preamplifier_canali_da_regolare;
536 for(canale=0; canale< 6; canale++){
537 indice= canale + scheda_su_scheda_giu_;
540 if ( preamplifier_error_voltage < ((
PGA_settled_gain[indice] * preamplifier_fine_step_trimmer[indice] *3 )/2) ){
542 preamplifier_error_voltage_at_PGA_gain[indice] =(3 *
PGA_settled_gain[indice] * preamplifier_fine_step_trimmer[indice] )/2;
544 preamplifier_error_voltage_at_PGA_gain[indice] = preamplifier_error_voltage;
546 if( preamplifier_error_voltage_at_PGA_gain[indice] > max_error) max_error = preamplifier_error_voltage_at_PGA_gain[indice];
568 uint8_t target_raggiunto_1_non_raggiunto_0[]={0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
569 int32_t ADC_misura_fatta_prov,ADC_misura_fatta_prov_vet[200];
570 uint16_t iii, media_prov;
572 if( scheda_su_scheda_giu>=1) scheda_su_scheda_giu=6;
585 preamplifier_canali_da_regolare_old= preamplifier_canali_da_regolare;
586 for(indice_trimmer=0; indice_trimmer<2;indice_trimmer++){
588 if( indice_trimmer) {
589 preamplifier_canali_da_regolare = preamplifier_canali_da_regolare_old;
590 for(canale=0; canale<6;canale++){
591 indice= canale + scheda_su_scheda_giu;
592 preamplifier_error_voltage_at_the_moment[indice]= preamplifier_error_voltage_at_PGA_gain[indice] / PGA_settled_gain_old[indice];
593 target_raggiunto_1_non_raggiunto_0[indice]=0;
598 for(scalata=0; scalata<8; scalata++){
602 confronto= 1 << (7-scalata);
603 for(canale=0; canale<6;canale++){
604 indice= canale + scheda_su_scheda_giu;
605 if( (preamplifier_SAR_ini[indice].starting_exp_value[indice_trimmer] >= (7-scalata))){
606 if( (preamplifier_canali_da_regolare >> canale) & 1){
615 for(canale=0; canale<6;canale++){
616 indice= canale + scheda_su_scheda_giu;
617 if( (preamplifier_SAR_ini[indice].starting_exp_value[indice_trimmer] >= (7-scalata)) ){
618 if( (preamplifier_canali_da_regolare >> canale) & 1){
619 if( target_raggiunto_1_non_raggiunto_0[indice]==0){
622 if( ( ADC_misura_fatta - preamplifier_Output_offset_target_at_the_moment[indice] ) < \
623 ( - preamplifier_error_voltage_at_the_moment[indice]) ){
625 target_raggiunto_1_non_raggiunto_0[indice]=0;
626 ADC_misura_fatta_old[indice]= ADC_misura_fatta;
627 }
else if ( ( ADC_misura_fatta - preamplifier_Output_offset_target_at_the_moment[indice] ) < \
630 target_raggiunto_1_non_raggiunto_0[indice]=1;
631 preamplifier_canali_da_regolare -= 1 << canale ;
632 ADC_misura_fatta_old[indice]= ADC_misura_fatta;
633 }
else if ( ( ADC_misura_fatta - preamplifier_Output_offset_target_at_the_moment[indice] ) >\
634 ( preamplifier_error_voltage_at_the_moment[indice])){
636 target_raggiunto_1_non_raggiunto_0[indice]=0;
641 }
else if ( ( ADC_misura_fatta - preamplifier_Output_offset_target_at_the_moment[indice] ) >\
644 target_raggiunto_1_non_raggiunto_0[indice]=1;
645 ADC_misura_fatta_old[indice]= ADC_misura_fatta;
646 preamplifier_canali_da_regolare -= 1 << canale ;
674uint8_t canale, indice;
675 if( scheda_su_scheda_giu >=1) scheda_su_scheda_giu=6;
677 if( (indice_trimmer == 1) && ((7-scalata)==bit_to_go) ){
678 preamplifier_canali_da_regolare_old = preamplifier_canali_da_regolare;
681 for(canale=0; canale< 6; canale++){
682 indice = canale + scheda_su_scheda_giu;
683 if( (preamplifier_SAR_ini[indice].starting_exp_value[1]<2) && (PGA_settled_gain_old[indice] > 1) ){
685 preamplifier_SAR_ini[indice].starting_exp_value[1]=2;
690 PGA_GAIN_CROSS( scheda_su_scheda_giu , canale , PGA_settled_gain_old[indice] );
691 if ( (PGA_settled_gain_old[indice] ==1) && (((preamplifier_canali_da_regolare >> canale)&1)==0)){
692 preamplifier_canali_da_regolare_old &= ~(1 << canale);
696 preamplifier_error_voltage_at_the_moment[indice] = preamplifier_error_voltage_at_PGA_gain[indice];
699 preamplifier_canali_da_regolare =preamplifier_canali_da_regolare_old;
718 uint8_t buffer_istruzione[8],iii;
719 for(iii=0;iii<8;iii++){
720 buffer_istruzione[iii]=
tx_data[iii];
735 while( (ii <50) && (
evento_CAN != ARM_CAN_EVENT_RECEIVE ) ){
746 valore_mis= ( ( ( *(int32_t *)
rx_data ) & 0xFFFFFFFF ) ) ;
750 for(iii=0;iii<8;iii++){
751 tx_data[iii]=buffer_istruzione[iii];
771 uint8_t valore_previsto_trimmer_offset, uint8_t solo_recupero_default_comp_se_1){
773 uint8_t dati_da_leggere_o_scrivere[]={0,0,0,0},trimmer_comp_di_default;
774 int32_t differenza_trimmer_offset, variazione_trimmer_termico, pendenza_deriva_trimmer_offset,pendenza_deriva_trimmer_compensazione;
776 if (scheda_su_scheda_giu) scheda_su_scheda_giu=6;
781 if(*(uint32_t *)dati_da_leggere_o_scrivere ==0){
792 if (solo_recupero_default_comp_se_1){
794 dati_da_leggere_o_scrivere[0] =trimmer_comp_di_default;
796 differenza_trimmer_offset = valore_previsto_trimmer_offset - dati_da_leggere_o_scrivere[
trimmer_coarse_offset];
802 pendenza_deriva_trimmer_offset =*(int32_t *)dati_da_leggere_o_scrivere;
805 pendenza_deriva_trimmer_compensazione=-(*(int32_t *)dati_da_leggere_o_scrivere);
806 variazione_trimmer_termico = (differenza_trimmer_offset * pendenza_deriva_trimmer_offset) / pendenza_deriva_trimmer_compensazione ;
807 variazione_trimmer_termico += (((differenza_trimmer_offset * pendenza_deriva_trimmer_offset) % pendenza_deriva_trimmer_compensazione )*2 )/(pendenza_deriva_trimmer_compensazione)\
808 + trimmer_comp_di_default ;
811 if ( variazione_trimmer_termico >0xff){
812 dati_da_leggere_o_scrivere[0] =0xff;
813 }
else if ( variazione_trimmer_termico <0 ){
814 dati_da_leggere_o_scrivere[0] =0;
816 dati_da_leggere_o_scrivere[0] = variazione_trimmer_termico & 0xff;
821 dati_da_leggere_o_scrivere[0]=128;
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...
volatile uint16_t ADC_medie_per_misura
the number of ADC readings to average, the maximum is 400
const struct ADC_coefficiente_type ADC_coefficiente[]
Node normalizing coeficinets used in ADC_lettura_24bit()
#define ADC_molteplicita_node_to_read
@ instr_readback_node_voltages
Nodes voltage read from external ADC.
uint8_t tx_data[8]
Transmission data vector.
uint32_t volatile evento_CAN
This is the variable which resembles the flags from the communication.
uint32_t tx_obj_idx
This is the variable which resembles the flags from the communication.
unsigned int indirizzo_CAN_della_scheda
Per ora lo assegnamo cos\i l'indirizzo della scheda.
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 guadagno_minimo_PGA
uint8_t PGA_settled_gain[12]
PGA set gain.
#define detector_bit_per_storing_startup
#define detector_bit_per_storing_user_state
#define detector_bit_recall_user_defined
#define detector_bit_recall_startup
#define detector_bit_store_state_in_user_as_it_is
#define detector_offset_from_half_scale
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.
@ CAN_error_comunichiamo_qualche_dato_timeout_on_transmission
Transmission CAN error.
@ error_address_CAN
Error register for CAN bus
#define istruzione_byte_3
#define istruzione_byte_4_e_scelta_canale
volatile uint16_t LED_rosso_fondo_scala
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_store_recover_state_M24C32_64(uint8_t scheda_su_scheda_giu, uint8_t canali_da_regolare, uint8_t set_1_store_0, uint8_t startup_1_user_0)
Store the system state or recover and apply the system state.
@ Memory_preamplifier_slope_calibration_ON_0_OFF_ff
slope trimmer active if zero
@ Memory_preamplifier_compensation_slope_trimmer_with_temp
thermal compensation trimmer temperature drift
@ Memory_preamplifier_trimmers_for_drift
preamplifier trimmer at default
@ Memory_preamplifier_address_fine_trimmer_slope_offset
fine slope for trimmer offset
@ Memory_preamplifier_offset_slope_trimmer_with_temp
offset trimmer temperature drift, this number is in nV
@ Memory_preamplifier_address_coarse_trimmer_slope_offset
coarse slope for trimmer offset
@ Memory_preamplifier_drift_ON_0_OFF_ff
offset drift correction active if zero
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...
@ node_voltage_Analog_Mux_0_offset
Starting Offset for this set of nodes, 32.
void instr_preamplifier_scrittura_lettura_trimmer_offset_function(void)
Content of the preamplifier trimmers can be read/write.
void preamplifier_trova_il_guess(uint8_t trimmer_da_usare)
static void preamplifier_normalize_gain_offset_error(uint8_t scheda_su_scheda_giu_)
The ouput offset will be set at the value that was given with the instr_ouput_offset_we_want_to_set i...
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 preamplifier_ritorno_al_gain_originale(uint8_t scalata, uint8_t indice_trimmer, uint8_t *target_raggiunto_1_non_raggiunto_0)
This function sets the original gain when a few LSb have to be determined. The umber of bits is bit_t...
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,...
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.
int32_t preamplifier_Output_offset_target[12]
Offset target values.
void preamplifier_aggiusta_offset_SAR(void)
This function provide the output offset with the standard SAR method.
int32_t preamplifier_ADC_external_measured_node_function(uint8_t scheda_su_scheda_giu, uint8_t indice)
This function provide node reading from an external ADC.
#define preamplifier_scrivi_il_trimmer
void Aspetta_tanti_ms(int millisecondi)
The timing function.
uint8_t volatile contenuto_trimmer_preamplifier[12][4]
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...
#define trimmer_fine_offset
#define trimmer_coarse_offset
#define trimmer_thermal_compensation
volatile int8_t vettore_istruzioni[8]
This is a copy of the received 8 bytes from the CAN.