Sparrow-Voltmeter von 0 bis 9, 99 V
von Hermann Nieder
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