Nachdem es keine leicht erhältlichen Schaltregler gab, die meinen Anforderungen genügten, nahm ich einfach einen Atmel Tiny 24 (aber nahezu jeder ande Atmel wäre wohl auch gegangen) und bastelte mit meinen Schaltregler selbst.
Da an die Spannung keine hohe Anforderung bezüglich der Regelgenauigkeit bestand, wurde folgendes Funktionsprinzip gewühlt:
Timer 0 erzeugt ein PWM Signal von ca 20uS Dauer, mit ca 5uS Einschalttdauer
Dieses PWM-Signal steuert einen kleinen Transistor an, der wiederum eine 330uH Spule schaltet,
Die Induktionsenergie der Spule wird über eine Diode in einen Elko geführt.
Über einen Spannungsteiler wird die Spannung am Elko gemessen. Steigt sie über einen gewissen Wert, wird Timer0 abgeschaltet. Fällt sie unter einen bestimmten Wert, wird Timer0 wieder eingeschaltet.
Der ADC wird ca 7 mal pro Sekunde ausgelesen, getriggert durch den Timer 1 Interrupt
Das Programm ist relativ einfach, aber es beinhaltet eine Reihe von Codebeispielen, die man auch an anderer Stelle benutzen kann
- PWM zur Signalerzeugung
- Timer Interrupt
- ADC im Free Running Modus
- Sleep Modus
- Techniken zur Energieeinsparung
Dass der Tiny mit einem Quartz betrieben wird, hat den Grund, dass der Quellcode noch erweitert werden soll, so dass per RS232 die Ausgansspannung eingestellt werden kann. Dazu ist ein genauer Takt erforderlich. Ansonsten funktioniert die Schaltung auch mit dem internen RC Oszillator.
Hier der Schaltplan:

Hier der Quellcode
| include "tn24def.inc"
.org $0020 reset: //usi Module OFF
sei
endless:
OVF1Handler: cpi temp1,$80 cpi temp1,$81 rjmp exit_ovf1
rjmp exit_ovf1 turnon:
//Periodendauer in OCR0A //Pulslänge in OCR0B out ocr0b,temp1 //Fast PWM mode //Start Timer in Fast PWM mode //Turn off Timer 0 ret init_timer_1:
//Start Timer in Free Running Mode, Prescaler 8
//internal reference, input auf PA3 out didr0,temp1 //left adjust
in temp1,WDTCSR |
Weitere Informationen,Grundlagen,Bauanleitung,Schaltplan, Links zum Thema
Anzeigen: