Eine Lösung, die aus der Notwendigkeit enstand, aus einer vorhandenen
Stromversorgung eine zweite, galvanisch getrennte Spannung erzeugen zu
müssen. Sicherlich nicht "das Gelbe vom Ei"; aber für mich mehr als nur
ausreichen. Und vielleicht auch für den einen oder anderen.
Ich muss eingestehen, dass ich das Ganze zuerst mit Berechnungen anging.
Die Resultate waren aber schlichtweg frustierend. Daraufhin schlug ich
den Weg "versuchen geht über studieren" ein und nach ein paar
Blindgaengern war ich mit dem Resultat zufrieden. Der Wirkungsgrad
betraegt so um die 93%.
Der Trafo besteht aus einem E16-Kern (Material ist N27). Kein Lutfspalt.
Die Primaer-Seite: 2 Lagen 0,35mm
Die Sek.-Seite: Je nach Bedarf. Bei mir waren es ebenfalls 2 Lagen mit
0,35mm. Aber Achtung: im Gegensinn wickeln
Bei 25mA Belastung 100mVpp Rippel
Bei 100mA Belastung 200mVpp Rippel
Also eine nachtraegliche Spannungsregulierung ist ein Muss
Alle Komponenten sind unkritisch und muessen den eigenen Anforderung
entsprechend angepasst werden. Nur die Gleichrichter Diode muss ein
Schotky sein und der OptoCoupler sollte nicht eine hohe
Stromverstaerkung haben (CTR 50 - 100%).
1 | #include "includes.h"
|
2 | //************************************
|
3 | // timer.c
|
4 | //************************************
|
5 |
|
6 | #define PWM_MIN 75L
|
7 | #define PWM_MAX 290L
|
8 |
|
9 | //************************************************************************/
|
10 | //* TIMER 1 Overflow wird alle 20uSec aufgerufen
|
11 | //************************************************************************/
|
12 | ISR (TIMER1_OVF_vect)
|
13 | {
|
14 | WORD dat;
|
15 |
|
16 | // sobald mehr als 5V anliegen, liegt ein L-Signal am Eingang PC0.
|
17 | // Ansonsten ein H-Signal.
|
18 | // D.h. bei einem H-Signal muss OCR1A erhoeht werden
|
19 |
|
20 | dat = OCR1A;
|
21 | if (BIT_IS_SET(PINC, 0))
|
22 | { if (dat < PWM_MAX)
|
23 | dat++;
|
24 | }
|
25 | else
|
26 | { if (dat > PWM_MIN)
|
27 | dat--;
|
28 | }
|
29 |
|
30 | OCR1A = dat;
|
31 | }
|
32 |
|
33 | //************************************************************************/
|
34 | //* Compare A Interrupt
|
35 | //************************************************************************/
|
36 | ISR (TIMER1_COMPA_vect)
|
37 | {
|
38 |
|
39 | // compare occured TCNT1=OCR1A
|
40 | }
|
41 |
|
42 |
|
43 | //************************************************************************/
|
44 | // Init Timer 1A Mode 14
|
45 | // ICR1 : (MAX) Der Counter zaehlt bis zu dieser Marke hoch und resetet dann auf 0
|
46 | //
|
47 | // OCR1A: (TOP) Sobald dieser Wert beim Hochzahelen erreicht wurde
|
48 | // wird der Ausgang geflippt.
|
49 | // D.h. mit ICR1 wird die Frequenz eingestellt, mit OCR1A die Periode
|
50 | //
|
51 | //************************************************************************/
|
52 | void Init_Timer_1A( void )
|
53 | {
|
54 | // PWD Mode 14:
|
55 | TCCR1B = 0x00; //stop
|
56 | TCNT1 = 0x0000;
|
57 | ICR1 = 401L; // 400 = 50kHz
|
58 | OCR1A = PWM_MIN;
|
59 | TCCR1A = (1 << COM1A1) | (1 << WGM11);
|
60 | TCCR1B = (1 << CS10) | (1 << WGM12) | (1 << WGM13); //start Timer
|
61 | }
|
Und nicht vergessen: irgendwo in Eurem Program nebst den
Port-Einstellungen auch
eintippen.
MfG aus Istanbul