Schema per Realizzare un Ohmetro o Milli-Ohmetro per la Misura di Resistenza Elettrica con Microcontrollore e Display LCD…
INTRO
La misura della resistenza elettrica è molto semplice e sfrutta la legge di Ohm. Facendo scorrere una corrente di valore noto e misurando la tensione generata sulla resistenza è possibile conoscere il valore di resistenza secondo la relazione R=V/I.
Quindi serve un generatore di corrente costante e con il microcontrollore e in particolare grazie all’ADC interno si va a misurare la tensione sul resistore e si calcola il valore di resistenza con delle operazioni matematiche all’interno del microcontrollore. Sul display LCD viene infine visualizzato il valore della resistenza da testare. Il microcontrollore usato è un PIC18F della Microchip ma si può usare un altro microcontrollore sempre della famiglia PIC, l’importante che abbia un ADC interno.
Questo strumento permette di misurare resistenze di valore molto piccolo, da 0.02 Ohm a 1.9 Ohm, oppure tra 0.2 e 19 Ohm o per valori da 2 Ohm ad un massimo di 190 Ohm. Con una piccola modifica si può creare un sistema per variare il range dinamicamente, come un normale Ohmetro. Inoltre cambiando il sistema di generazione della corrente di riferimento ed usandone uno ad alta precisione si possono andare a misurare resistori con valori superiori ai 190 Ohm.
CODICE
Il codice è il seguente:
sbit LCD_RS at RB0_bit; //Configurazione Pin LCD
sbit LCD_EN at RB1_bit; //RB0 -> RS
sbit LCD_D4 at RB2_bit; //RB1 -> EN
sbit LCD_D5 at RB3_bit; //RB2 -> D4
sbit LCD_D6 at RB4_bit; //RB3 -> D5
sbit LCD_D7 at RB5_bit; //RB4 -> D6
//RB5 -> D7
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
const char character[] = {0,14,17,17,17,10,27,0}; //Simbolo di Ohm
unsigned int conversion; //Variabile valore convertito
long value; //varibile valore tensione corrente
unsigned char cifra; //Variabile cifra dei valori
float kr = 0.6275; //R4=100 resistenza misurabile da 0.2 a 160 ohm
float kr1 = 0.065; //R4=1000 resistenza misurabile da 2 a 1600 ohm
void CustomChar(char pos_row, char pos_char) { //Genera il simbolo di Ohm
char i;
Lcd_Cmd(64);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 0);
}
void main (){ //Programma principale
TRISA = 0b00000001; //AN0 ingresso
Lcd_Init(); //Inizializza LCD
Lcd_Cmd(_LCD_CURSOR_OFF); //Cursore non visibile
Lcd_Cmd(_LCD_CLEAR); //Pulisci LCD
while (1) { //Ciclo infinito
conversion = ADC_Read(0); //Converti AN0
value = (long)conversion * 5000; //*(5000/1023) = * 4.8876
value = value / 1023; //Trasformo il valore da binario a decimale
value = value/kr; //Moltiplico per la costante di Resistenza
Lcd_Chr(1, 1, 'R'); //Scrivo "Resistenza" sulla prima riga
Lcd_Chr(1, 2, 'e'); //partendo dalla posizione 1
Lcd_Chr(1, 3, 's');
Lcd_Chr(1, 4, 'i');
Lcd_Chr(1, 5, 's');
Lcd_Chr(1, 6, 't');
Lcd_Chr(1, 7, 'e');
Lcd_Chr(1, 8, 'n'); //fino alla posizione 8
Lcd_Chr(1, 9, 'z');
Lcd_Chr(1, 10, 'a');
Lcd_Chr(2, 2, ' '); //Vai alla seconda riga
cifra = value / 10000; //Cifra centinaia di OHM
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le centinaia
cifra = (value / 1000) % 10; //Cifra decine di OHM
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le unità
cifra = (value / 100) % 10; //Cifra unità di OHM
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi le unità
Lcd_Chr_CP(46); //Scrivi punto
cifra = (value / 10) % 10; //Cifra decimi di OHM
cifra = cifra + 48; //Trasformazione in codice ASCII
Lcd_Chr_CP(cifra); //Scrivi i decimi
CustomChar(2,8);
Delay_ms(10); //Delay di 10mSec
}
}
Prima di tutto si va a definire la connessione tra LCD e microcontrollore. Il display LCD sarà connesso alle PORTB del microcontrollore. Dopo di che vengono inizializzate alcune variabili che useremo all’interno del codice, come ad esempio il carattere che contiene il simbolo di Ohm, il valore convertito e le costanti di conversione tensione/resistenza calcolate in base al riferimento di corrente.
La funzione “CustomChar” viene generata da Mikroc e serve in questo caso per scrivere il simbolo di Ohm sul display LCD. Viene generato in automatico da Mikroc dalla funzione “LCD Custom Char Generator” nel menù a tendina “Tools”.
Nel programma principale si vanno ad inizializzare il display LCD e il convertitore analogico digitale ADC. Nel ciclo infinito invece si va a leggere il valore dell’ADC, si converte da binario a decimale e infine si va a dividere per la costante di resistenza opportuna per convertire il valore da tensione a resistenza.
Dopo di che si va a visualizzare sulla prima riga del display LCD la stringa “Resistenza”, si va a dividere in centinaia, decine, unità e decimi il valore di resistenza calcolato e si mostra una cifra alla volta con un punto tra unità e decimi. Infine si scrive il simbolo di Ohm e si inserisce un ritardo di 10mS.
I fuses in questo caso sono quelli di default della pagina di MIKROC.
SCHEMA
Lo schema è il seguente:
La tensione di alimentazione è 5V continui e stabilizzati a basso ripple, ad esempio un vecchio caricatore per cellulari. La tensione positiva è connessa al pin 20 del microcontrollore, all’alimentazione del display, ad R3 e all’ingresso del riferimento di corrente. La massa o terminale negativo è invece connessa a tutti i pin dove vi è il simbolo della massa e ai pin 8 e 19 del microcontrollore per alimentarlo.
Il cristallo di quarzo da 4MHz e i due condensatori da 22pF formano il circuito di oscillazione mentre R3 mantiene in funzione il microcontrollore.
Il display LCD è connesso alle PORTB come da figura, alimentato sempre con 5V e viene usata RV1 per la regolazione del contrasto. U3A forma un amplificatore non invertente con guadagno pari a G=2, in modo tale da amplificare la tensione generata sul resistore da testare e migliorare la lettura da parte dell’ADC.
Il riferimento di corrente è formato da un regolatore di tensione LM317 con apposita connessione in modo tale da generare una corrente che sarà I=(1.25/R4) + 0.0005, in questo caso 125.5mA, perché i 0.5mA che si sommano alla formula dipendono dai circuiti interni dell’integrato LM317. La costante di corrente usata nel codice dipende da questo valore di corrente e dall’amplificazione di U3A. in particolare Kr = ((I[mA])/(100*G)) dove I[mA] è la corrente espressa in milli-Ampere, 100 è una costante che dipende dalla divisione in cifre del codice e G è il guadagno dell’amplificatore. In questo caso Kr=125.5/(100*2)=0.6275.
Lo schema montato su breadboard ha il seguente aspetto:
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS e il codice scritto e compilato con MIKROC al seguente LINK!!!
Come già segnalato, dal link è scaricabile un file .rar il cui contenuto
fa riferimento ad un misuratore di livello liquidi (“indicatore livello
liquidi.ms14”) che pare NON avere alcuna pertinenza con il milliohmetro
oggetto del progetto (“ohmetro-milli-ohmetro-controllore”).
In data 28 luglio mi è stato gentilmente indicato che il tutto sarebbe
stato corretto l’indomani….
Resto in attesa e ringrazio
Salve, gentilmente mi potrebbe girare il file exe. del progetto?
Perchè, cliccando sul link, la pagina non si apre. Se per caso lei abbia il link o file rar o meglio ancora il file exe. me lo potrebbe gentilmente mandare alla seguente email luigi.gennuso@virgilio.it.
grazie infinitamente
buona giornata
Luigi.
Il link sembra corretto da parte mia, l’unico problema è il browser.
provi a cliccare sul link con tasto destro, apri in una finestra in incognito e poi aggiorni la pagina.
riesco a scaricarlo con tutti i browser in questo modo e i file sono corretti
Buongiorno, sono riuscito a scaricare e a scrivere sul Pic.
Leggendo non viene citato nessun settaggio da parte del Pic inerente ai Fuse, clock interno o esterno.
Quindi deduco che non devo settare nulla.
Vi aggiornerò a progetto finito.
Vi ringrazio ancora una volta per avermi postato link exe.
A presto!
Luigi
Salve, leggendo attentamente sulla pagina dice :
I FUSES in questo caso sono quelli di default della pagina di Mikroc.
Ecco perché non mi funziona perché devo settare i fuses.
Potrei avere fuses per settare i il Pic? Grazie buona giornata a tutti
Una curiosità, senza nessuna resistenza la corrente generata da lm317 entra nell operazionale? Si può danneggiare?