Spannungs- und Strommessung für Labornetzteil (inkl. Layout)

Hallo,
in diesem Beitrag möchte ich das Ergebnis meines letzten Projektes teilen.
Ich hatte schon seit langem die Leiterplatte eines Labornetzteils rumliegen, mit max 30V und 3A ideal für die meisten Anwendungen.
http://www.conrad.de/ce/de/product/116718/H-Tronic-Univ-Netzteil-1-30-V0-3-A-Baustein-Eingangsspannungs-Bereich-30-VAC-Ausgangsspannung-1-30-V-Ausgangss
Also eigentlich viel zu schade zum vestauben. Leider fehlte mir lange ein geeigneter Trafo, der mir kürzlich (danke Thorsten!) aus einem ausgeschlachteten Diaprojektor in die Hände fiel. Natürlich sollte auch ein Gehäuse her und eine Anzeige für Spannung und Strom. Da auch noch ein 16x2 Display rumlag, lag es nahe das auch zu verwenden.
Nach Recherche und Versuche auf dem Steckbrett entschied ich die Messung des Stromes über einen Shunt (0.1R) im Massezweig (-) zu realisieren. Der Spannungsabfall wird verstärkt und mit einem Atmega8 gemessen. Die Spannung wird nur per Spannungsteiler auf den Eingang des Atmega angepasst. Der Atmega arbeitet mit der internen Referenz von 2,54 Volt.
Das Layout für die Displayplatine stelle ich hier als Eagle Layout gerne zur Verfügung. Mit nur 4 Drahtbrücken lässt sich das auch als einseitige Platine gut selbst fertigen. Wie auf den Fotos zu sehen ist, sind Display und Controller Platine back-to-back zusammen gesetzt. Gleichrichter und Spannungsregler habe ich direkt mit auf die Platine genommen, weil ich die Spannung am Trafo anzapfen konnte. Leider hat es nicht funktioniert, die Beleuchtung des Displays über die Platine zu machen, weil für den geplanten Spannungsregler MCP1702 (250mA) leider die Eingangsspannung zu hoch war und der dann verwendete 78L05 mit 100mA zu schwach dafür war. (Achtung: Pinbelegung vom MCP1702 ist anders als 78L05 !).
Der Atmega8 läuft auf internem 8MHz Takt und wurde über ISP programmiert. Das Programm ist kurz und einfach gehalten. Zu beachten ist, dass aus layout-technischen Gründen die Beschaltung für das Display in der dargestellten Form realisiert wurde.

/*
Programm zur Messung von Spannung und Strom
*/
#define APIN A0
#define UPIN A1

#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

int UValue, AValue, VKorr;
float UmValue, AmValue;
int helper;
 
void setup() 
{ 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Voltm V1");
  lcd.setCursor(0, 1);
  lcd.print("....starting");
  analogReference(INTERNAL);   // 2.56 V on Atmega8
  delay(1000);
} 
void loop() 
{ 
  lcd.clear();
  AValue = analogRead(APIN);            
  AmValue = map(AValue, 0, 1023, 0, 3250);
  VKorr = (AmValue-40)/10;  // Korrekturwert für Spannungsabfall am Shunt und Offsetspannung Opamp
  lcd.setCursor(0, 0);
  lcd.print("Strom    ");
//  lcd.print(AmValue);
  AmValue = AmValue/1000;
  lcd.print(int(AmValue)); 
  lcd.print(".");
  helper=int(100*(AmValue-int(AmValue)));  // Hilfskonstrukt, damit Dezimalstellen korrekt dargestellt werden
  if (helper<10) {
    lcd.print("0");
  }
  lcd.print(helper);

  UValue = analogRead(UPIN);            
  UmValue = map(UValue, 0, 1023, 0, 35510-VKorr);
  UmValue = UmValue/1000;
  lcd.setCursor(0, 1);
  lcd.print("Spannung ");
  lcd.print(int(UmValue)); 
  lcd.print(".");
  helper=int(100*(UmValue-int(UmValue)));
  if (helper<10) {
    lcd.print("0");
  }
  lcd.print(helper);
  delay(500);
}

UI-Mess_eagle.zip (88.7 KB)