Für ein Projekt benötigte ich eine einstellbare Gleichspannung von 10-20 Volt, die ursprüngliche Schaltung lief mit 3V 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
|