Laboratorio di Calcolo B
Dario Barberis , Paolo Morettini, Fabrizio Parodi, Enrico Robutti


Introduzione

Misura automatica curva I-V

Prima di iniziare la misura dovrete verificare che i collegamenti sulla basetta siano corretti, e dovrete voi stessi collegare e regolare le alimentazioni.
Il circuito richiede una alimentazione positiva di +5V ed una negativa di -9V (e naturalmente un riferimento a 0V).
Fate attenzione a non sbagliare i collegamenti, perché potreste distruggere i componenti.
I data sheets completi dei due dispositivi sono disponibili di seguito
Amp-op (741)
DAC

Struttura del programma

   Inizializzazione
   Calibrazione di V
   Misura di I vs V
   (opzionale) Fit di V vs I (determinazione di R)
   Chiusura

Il main dovrà chiamare una funzione diversa a seconda dell'opzione fornita dall'utente (calibrazione, misura (e eventualmente fit)).

int main(){
  // calibrazione o misura ?  (ad es. lcalib true/false)
  ...
  // inizializza porta seriale e parallela, apre il file di I/O opportuno
  init(lcalib);
  ...
  if (lcalib){
    Calibrazione();
  } else {
    Misura();
  }
  ...
  // chiude porta seriale e parallela ed il file di I/O opportuno
  end(lcalib);
  ...
  return 0;
}
Dove
void Calibrazione(){
  double tensione;
  for (unsigned char ch=0; ch<256;ch++){
    ioctl(fd_parallela,...,...); // scrive sulla linea DATA 
    sleep(2);   // diamo il tempo al circuito di assestarsi
    tensione = get_metex(...);   // legge V dal multimetro
    // scrive numero e tensione nel file 
    // (opzionale) grafico V vs numero
  }
}
e
void Misura(){
  double corrente,tensione;
  double vtun[256];
  // legge 256 valori dal file di calibrazione --> vtun[256];
  for (unsigned char buf=,...,...){ // numeri scelti
                                    // (=valori di tensione)
    ioctl(fd_parallela,...,...);    // setta il valore di tensione
    sleep(2);
    corrente = get_metex(...);      // lettura corrente 
    tensione = vtun[buf];
    // scrittura di corrente e tensione nel file di misure
    // grafico in tempo reale di I vs V
  }
}
Opzionalmente Misura può essere predisposta in modo che si possa selezionare direttamente la tensione (e non un numero tra 0 e 255).
int get_closest_int(double V, double Vref){
  // restituisce i tale che i*Vref/255 sia vicino a V
}
void Misura(){
  double corrente,tensione;
  double vtun[256];
  // legge 256 valori dal file di calibrazione --> vtun[256];
  double V[n]={...,...};  // puo' essere impostato dall'utente
  for (int i=0;i<n;i++){  // numero di valori di tensione
    unsigned char buf = get_closest_int(V[i],Vref); 
    ioctl(fd_parallela,...,...);  // setta il valore di tensione
    sleep(2);
    corrente = get_metex(...);    // lettura corrente 
    tensione = vtun[buf];
    // scrittura di corrente e tensione nel file di misure
    // grafico in tempo reale di I vs V
  }
}