Sparrow-Voltmeter von 0 bis 9, 99 V           

von Hermann Nieder                        
      
Elektronik-Labor  Projekte  AVR  Sparrow  Contest          





Ich habe mich  durch Burkhard Kainkas Beitrag “Sparrow-LED-Voltmeter“  anregen lassen und für den ATtiny13 auf der Sparrow-Platine ein Programm entworfen, das es erlaubt,  Gleichspannungen von 0 bis etwa 9,99 V zu messen. und zwar mithilfe  eines Trimmpotenziometers von 100k als einzigem zusätzlichen Bauteil, das die Eingangsspannung an ADC2 (PB4) des Mikrocontrollers herabsetzt. Dieses  könnte durch zwei geeignete Festwiderstände ersetzt werden.  Im Bild wird durch den ATtiny13 gerade die Spannung an einer roten Leuchtdiode, die über 1k an die Spannungsquelle des Sparrow angeschlossen ist , ermittelt und angezeigt. Auch die Spannung an den Klemmen der abgebildeten 9V-Batterie lässt sich damit recht gut bestimmen.




Das 100k-Trimmpoti P1 wurde mithilfe eines Digitalmultimeters so eingestellt, dass   der Widerstand zwischen seinem Schleifkontakt S und A(Masse, GND) 10k beträgt. Eine Eingangsspannung zwischen E und Masse(GND) wird auf ein Zehntel ihres Wertes herabgesetzt. Mithilfe eines Schraubendrehers lässt sich die zuvor vorgenommene Einstellung im Betrieb etwas verändern, um das Sparrow-Voltmeter mithilfe eines Digitalmultimeters als Vergleichsinstrument zu „eichen“.

Als Anzeigeelemente dienen die rote und  die grüne Leuchtdiode. Die Lichtsignale  erfolgen jeweils  in Form von „sichtbaren  Morsezeichen“.
Wird S1 gedrückt, erfolgt mit der roten LED die Anzeige eines der Spannung an ADC2 entsprechenden Bytes und abschließend mit dem grünen Exemplar das Zeichen „D“ für „dezimal“. Die Umrechnung in einen Spannungswert kann in diesem Fall mithilfe eines Taschenrechners erfolgen.

Bequemer als im ersten Fall geht es, wenn man S2 drückt. Nun  geschieht die Umrechnung in einen Spannungswert durch den Mikrocontroller. Danach wird mit der roten LED das Zeichen für die erste Ziffer angezeigt und darauf mit der grünen das Zeichen für einen „Punkt“. Anschließend folgen mit der roten LED  die Darstellung der Zeichen für zwei Ziffern und schließlich mit der grünen LED das Zeichen  „V“ für Volt.  

    

Das Programmlisting in C wurde mit dem Raspberry Pi entworfen. Im Bild wird gerade die HEX-Datei für das Sparrow-Voltmeter in den ATtiny13 übertragen.

 
Download: Sp_Spg1_T13.zip  
Direkt laden: http://tiny.systems/categorie/cheepit/Voltmeter10V.html
/* Sp_Spg1.c */
/* 08.03.2015*/
#include <avr/io.h>
#include <util/delay.h>
unsigned long AD_wert,U_wert,Ur_wert;
int AD_dat,Ziffer,U,U_anzg,Urest;

#define setbit(P,BIT) ((P) |= (1<<(BIT)))
#define clearbit(P,BIT) ((P) &=~(1<<(BIT)))

void Blink_grn_k()//kurzes Blinken gruene LED
{
setbit(PORTB,PB1);
_delay_ms(150);
clearbit(PORTB,PB1);
_delay_ms(150);
}

void Blink_grn_L()//langes Blinken gruene LED
{
setbit(PORTB,PB1);
_delay_ms(450);
clearbit(PORTB,PB1);
_delay_ms(150);
}

void Blink_rt_k()//kurzes Blinken rote LED
{
setbit(PORTB,PB3);
_delay_ms(150);
clearbit(PORTB,PB3);
_delay_ms(150);
}

void Blink_rt_L()// langes Blinken rote LED
{
setbit(PORTB,PB3);
_delay_ms(450);
clearbit(PORTB,PB3);
_delay_ms(150);
}

void Blinkanzeige()// Blinkanzeige von Ziffern
{ // in Form von "sichtbaren"
switch(Ziffer) // Morsezeichen
{
case 0:
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 1:
Blink_rt_k();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 2:
Blink_rt_k();
Blink_rt_k();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 3:
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 4:
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_L();
_delay_ms(300);
break;
case 5:
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 6:
Blink_rt_L();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 7:
Blink_rt_L();
Blink_rt_L();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 8:
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 9:
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_k();
_delay_ms(300);
break;
default:
break;
}
}

void AD_start()
{
ADCSRA |= (1<<ADSC); // ADC starten
while(ADCSRA & (1<<ADSC));// warten, bis ADSC wieder auf Null
ADCSRA |=(1<<ADSC);
while(ADCSRA & (1<<ADSC));
}

void Anzeige_bt()// "Byteanzeige"
{
_delay_ms(2000);
AD_dat=ADCH;
Ziffer=AD_dat/100;
Blinkanzeige();
U=AD_dat%100;
U_anzg=U/10;
Urest=U%10;
Ziffer=U_anzg;
Blinkanzeige();
Ziffer=Urest;
Blinkanzeige();
_delay_ms(300);
Blink_grn_L(); // Zeichen "D"
Blink_grn_k(); // fuer "dezimale"
Blink_grn_k(); // Anzeige eines Bytes
}

int main(void)
{
DDRB=0b00001010; // PORTB.1 und PORTB.3 sind Ausgaenge

ADCSRA =(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);// Division Fact. 8
ADMUX=(1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //int . Referenz, 8-Bit-Messung
// ADC2 (PB4)
while(1)

{
if(!(PINB &(1<<PB0)))//if 1
{
AD_start(); // Wenn S1 gedrueckt,
Anzeige_bt(); // Anzeige eines
// Bytes
} // end if 1

if(!(PINB &(1<<PB2)))//if 2
{ // Wenn S2 gedrueckt,
AD_start(); // Anzeige der Spannung
_delay_ms(1000); // in Volt
AD_wert=ADCH;
AD_wert=AD_wert*43;//wegen 1.1/255=0.0043
AD_wert=AD_wert*11; // Umrechnungsfaktor,
Ziffer=AD_wert/10000;//mithilfe von
Blinkanzeige(); //D.-Multimeter ermittelt
Blink_grn_k();//"Dezimalpunkt"
Blink_grn_L();// mit gruener LED
Blink_grn_k();
Blink_grn_L();
Blink_grn_k();
Blink_grn_L();
_delay_ms(300);

U_wert=AD_wert%10000;
Ziffer=U_wert/1000;
Ur_wert=U_wert%1000;
Blinkanzeige();
Ziffer=Ur_wert/100;
Blinkanzeige();

Blink_grn_k(); //Zeichen "V" fuer "Volt"
Blink_grn_k(); // mit gruener LED
Blink_grn_k(); //
Blink_grn_L();
_delay_ms(300);
}//end if 2
} // end while(1)
} // end main


Elektronik-Labor  Projekte  AVR  Sparrow Contest