Forum: Mikrocontroller und Digitale Elektronik PPS5330 Labor-Netzteil hack


von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich habe mir von ELV das PPS 5330 Labornetzteil als Bausatz gekauft und 
zusammengebaut. Alles hat bestens funktioniert. Nur ein kleiner Fehler 
meinerseits mit der Reflektorscheibe (siehe Link: 
Beitrag "Re: Joy-IT RD6006" ).

Kleines Preview von mir mit falsch eingebauter Reflektorscheibe: 
https://youtu.be/MjL6gLWncd4

2.Video zeigt Temperaturmessung bei großer Last: 
https://youtu.be/GwYWNdFv-LQ

Das Kühlaggregat im Labor-Netzteil kann unter Belastung bis über 80 °C 
heiß werden. Aus diesem Grund möchte ich eine Temperaturanzeige in das 
Netzteil integrieren, die mir die aktuelle Temperatur am Kühlaggregat 
anzeigt. Da es schon eine LCD-Anzeige und einen Temperatursensor an 
geeigneter Stelle gibt, habe ich mir überlegt, dies zu nutzen und die 
Leistungsanzeige auf dem LCD-Display alternierend mit einer 
Temperaturanzeige zu kombinieren (siehe 3.Bild).

Leider gibt es im Internet für den verbauten ATmega88 Mikrocontroller 
von ELV keinen frei verfügbaren Quellcode. Also habe ich mich 
entschlossen die Software neu zu schreiben und eine Temperaturanzeige 
und wenn möglich eine USB Schnittstelle zu integrieren.

Die Hardware
Als erstes habe ich mir den seriellen Datenstrom zum LCD-Controller 
angesehen. Hierbei handelt es sich um eine SPI-Schnittstelle mit 3 
Steuerleitungen (MOSI,MISO und CLK) und einer Taktrate von 500KHz. Über 
die Mosi-Leitung werden syncron zum Takt 8Bit-Daten vom ATmega88 zum LCD 
Controller übertragen. Der LCD Controller signalisiert mit einem 
Low-Pegel auf der MISO Leitung das er bereit ist, Daten vom ATMEGA88 zu 
empfangen. Bei einem High-Pegel stoppt die Übertragung vom 
Mikrocontroller.

Mit meinem Rigol-Scope MSO5104 konnte ich die SPI Daten analysieren. 
Dazu habe ich die Datenleitung (MOSI) vom Mikrocontroller IC200 an den 
1.Kanal angeschlossen und die Taktleitung (CLK) an den 2.Kanal. Die MISO 
Leitung liegt auf Kanal 3. Wie mann im 4.Bild erkennen kann werden für 
die einzelnen Anzeige Elemente zB die Spannung insgesamt 5 Datenbytes 
übertragen. Das 1.Datenbyte (43h) ist das Adressregister für den 
Spannungswert. Die nachfolgenden 4 Datenbytes sind die vier 
Dezimalstellen für den Spannungswert. Die Strom- und Leistungsanzeige 
funktioniert ähnlich. Ein Adressregister gefolgt von 4 Datenbytes für 
den 4stellige Wert.

Gruß Rolf

: Bearbeitet durch User
von Harald W. (wilhelms)


Lesenswert?

Rolf D. schrieb:

> Ich möchte eine Temperaturanzeige in das Netzteil integrieren,

Das geht am einfachsten und vermutlich auch am billigsten
mit einem Fertigthermometer für rund 3 EUR von ebay o.ä.

von merciMerci (Gast)


Lesenswert?

Rolf D. schrieb:
> ELV das PPS 5330

... oh oh, ist die Front von dem Teil hässlich!
Das wäre dann gleich ein Showstopper für mich.

von merciMerci (Gast)


Lesenswert?

Rolf D. schrieb:
> ELV das PPS 5330 Labornetzteil

.. der Bausetz kostet echt 149€?
Warum gibt Mann für 30V/3A soviel aus, was waren da deine Argumente 
dafür?
Für rund 80-100€ bekommst du ein Labornetzteil fertig aufgebaut und dann 
auch nicht so hässlich, allerdings als Schaltnetzteil.

von Harald W. (wilhelms)


Lesenswert?

merciMerci schrieb:

>> ELV das PPS 5330
> ... oh oh, ist die Front von dem Teil hässlich!

Ja, da schadet auch ein zusätzliches Loch für ein Thermometer nicht.

von Rolf D. (rolfdegen)


Lesenswert?

Das Designe und die verbaute Technik finde ich nicht schlecht. Eine 
weitere Anzeige für die Temperatur gefällt mir nicht so gut. Mir gehts 
eigentlich um den Bastelspaß und das Verständnis der Netzteilschaltung.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich habe eine Bitte. Durch einen dummen Fehler am SPI Port des ATmega88 
habe ich die Firmware des PPS 5330 geschrottet. Das Auslesen des 
ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das 
Hexfile binhaltet nur Datenmüll (siehe Anhang). Kann mir vielleicht 
jemand helfen ?

Vorab schon mal vielen Dank!

von Harald W. (wilhelms)


Lesenswert?

Rolf D. schrieb:
> Hallöchen..
>
> Ich habe eine Bitte. Durch einen dummen Fehler am SPI Port des ATmega88
> habe ich die Firmware des PPS 5330 geschrottet. Das Auslesen des
> ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das
> Hexfile binhaltet nur Datenmüll (siehe Anhang). Kann mir vielleicht
> jemand helfen ?

Hast Du schon mal bei ELV nachgefragt?

von Rolf D. (rolfdegen)


Lesenswert?

Vielleicht sollte ich das tun. Aber ob die das machen ist eine andere 
Frage. Denke eher nicht :(

von Harald W. (wilhelms)


Lesenswert?

Rolf D. schrieb:

> Vielleicht sollte ich das tun. Aber ob die das machen ist eine andere
> Frage. Denke eher nicht :(

Insbesondere wenn Du noch die Originalrechnung hast, würde sich
zumindest eine Anfrage lohnen.

von Rolf D. (rolfdegen)


Lesenswert?

Ich arbeite zur Zeit mit einem zweiten ATmega328P "Nano" um das 
LCD-Display anzusteuern. Eigentlich hatte ich vor, die SPI-Daten vom 
ATmega88 über einen 2.Controller zu leiten, dann für die 
Temperaturanzeige abzuändern und dann zum LCD-Controller zu senden. Bei 
dieser ganzen Umsteckerrei am SPI Port und am Programmer ist es dann 
passiert.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

So.. Anfrage bei ELV läuft. Bin gespannt und warte mal ab was die sagen 
:)

von Goran E. (gnom_eb_betrach)


Angehängte Dateien:

Lesenswert?

Hallo Rolf, ich finde Dein Projekt recht spannend, hast Du den 
kompletten Datenstrom zum Display schon 'entschlüsselt'?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Der Weilen versuch ich schon mal den Temperatursensor über den 
speziellen AD-Wandler auszulesen (siehe Bild).

So wie ich das verstehe, wird über einen Integrator IC5 die Aufladezeit 
eines Kondensators C49 ermittelt und daraus der Temperaturwert 
berechnet. Der Messvorgang wird mit Starten eines 16Bit Timers im ATmega 
und dem Setzen von  Eingang 2 oder 3 von Multiplexer IC6 gestartet. 
Vorher wird der Integrator IC5 über den Multiplexer Eingang 5 
zurückgesetzt. Erreicht der Integratorausgang die gleiche Spannung wie 
am Temperatursensor wird Transistor T10 leitend und  ein 
Interrupt-Eingang am ATmega angesteuert. Als Folge stoppt der Timer und 
der Wert kann ausgelesen werden. Danach folgt die Berechnung für den 
Temperaturwert und die Anzeige auf dem Display.

Gruß Rolf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Goran E. schrieb:
> Hallo Rolf, ich finde Dein Projekt recht spannend, hast Du den
> kompletten Datenstrom zum Display schon 'entschlüsselt'?

Fast alle Anzeige Elemente sind entschlüsselt. Weil ich versehentlich 
den eingebauten ATmega88 geflasht habe, fehlen zum Teil aber noch die 
Punkte und Unterstriche (siehe Bilder).

Für Spannungs- und Stromwerte muss zuerst die Element Adresse und 
nachfolgend 4 Bytes für den Nummerischen Wert von 0-9 (50hex - 59hex) 
gesendet werden. 5Fh ist fürs Ausbenden einer Dezimalstelle.

Gruß Rolf

: Bearbeitet durch User
von Lach (Gast)


Lesenswert?

merciMerci schrieb:
> oh oh, ist die Front von dem Teil hässlich!

Dann erleuchte uns doch mal mit einem Beispiel eines tollen 
Frontplattendesigns.
Vor allem bei den von dir vorgeschlagenen Geräten:

merciMerci schrieb:
> Für rund 80-100€ bekommst du ein Labornetzteil fertig aufgebaut

Ach so du bist erst 10 und steht auf bonbonbuntes Chonadesign :-)

SCNR

von Rolf D. (rolfdegen)


Lesenswert?

Harald W. schrieb:
> Rolf D. schrieb:
>> Hallöchen..
>>
>> Ich habe eine Bitte. Durch einen dummen Fehler am SPI Port des ATmega88
>> habe ich die Firmware des PPS 5330 geschrottet. Das Auslesen des
>> ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das
>> Hexfile binhaltet nur Datenmüll (siehe Anhang). Kann mir vielleicht
>> jemand helfen ?
>
> Hast Du schon mal bei ELV nachgefragt?

Hallöchen..

Bezüglich meiner Anfrage an ELV, ob Sie mir die Firmware für das PPS 
5330 zusenden könnten, habe ich leider eine negative Antwort erhalten. 
Das heißt für mich, entweder die Firmware selber schreiben oder hoffen 
und bangen, dass vielleicht ein User die Firmware von seinem Gerät 
auszulesen kann und mir zuschickt.

Gruß Rolf

: Bearbeitet durch User
von Harald W. (wilhelms)


Lesenswert?

Rolf D. schrieb:

> Bezüglich meiner Anfrage an ELV, ob Sie mir die Firmware für das PPS
> 5330 zusenden könnten, habe ich leider eine negative Antwort erhalten.

Das finde ich von einer Firma, die vom Verkauf von eher überteuerter
Ware lebt, mehr als seltsam. Also sollte man wohl in Zukunft eher nicht
mehr bei denen kaufen.

von Rolf D. (rolfdegen)


Lesenswert?

Hallo

Mein Standpunkt ist der von OpenSource auch in meinen Projekten. Ein 
schönes Beispiel sind die Produkte von Mutable instruments 
https://mutable-instruments.net/. Alles OpenSource und trotzdem ist die 
Firma kommerziell erfolgreich.

Mein OpenSource Projekt "DEGENERATOR": 
https://www.sequencer.de/synthesizer/threads/avr-synthesizer-wave-1-de-generator.87599/page-20

Gruß Rolf

: Bearbeitet durch User
von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Lach schrieb:
> merciMerci schrieb:
>> oh oh, ist die Front von dem Teil hässlich!
>
> Dann erleuchte uns doch mal mit einem Beispiel eines tollen
> Frontplattendesigns.

Jepp, die Kritik ist mir auch nicht ganz klar. Sicherlich hätte man 
Strom- und Spannungseinstellung getrennt anbieten können, aber optisch 
finde ich die Netzteile durchaus ok (damals noch für €99 als Bausatz). 
Insbesondere sind das Vollmetallgehäuse.

> Vor allem bei den von dir vorgeschlagenen Geräten:

Wer ernsthaft Schaltnetzteile (mit all ihren Nachteilen) für diesen 
Leistungsbereich und die daraus offenkundigen Anwendungen im Labor 
erwägt, ist nicht wirklich ernstzunehmen.

Für das Geld ist das PPS5330 wirklich ok: Ströme und Spannungen lassen 
sich - messbar - milliampere/-voltgenau einstellen und oft benötigte 
Spannungen speichern.

Was mich etwas stört, ist die lange Anstiegszeit der Spannung beim 
Betrieb aus dem Standby heraus.

Rolf D. schrieb:
> Bezüglich meiner Anfrage an ELV, ob Sie mir die Firmware für das PPS
> 5330 zusenden könnten, habe ich leider eine negative Antwort erhalten.
> Das heißt für mich, entweder die Firmware selber schreiben oder hoffen
> und bangen, dass vielleicht ein User die Firmware von seinem Gerät
> auszulesen kann und mir zuschickt.

Erstmal ein dickes Lob an Dich, dass Du die Dinger selbst programmieren 
möchtest und die Dinge, die Du schon rausgefunden hast.

Ich muss mir mal den Schaltplan zu Gemüte führen und würde mal einen 
Ausleseversuch mit einem originalen avrispmkII starten.

Wie genau hast Du Deinen Controller ausgelesen (nicht dass ich denselben 
Fehler auch mache)?

Ich habe hier zwei Mal Softwareversion 1.1

von Friedhelm (Gast)


Lesenswert?

Kleine OffTopic-Frage: Wie kann man die beiden Bananenbuchsen des 
PPS5330 entfernen? Bekomme das einfach nicht hin. Möchte möglichst wenig 
Gewalt anwenden, da die Frontplatte recht empfindlich ist.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Der Zusammenbau ist schon etwas her, aber ich meine, die wären ganz 
normal von hinten per Mutter verschraubt (so sieht's auch auf den Fotos 
der Anleitung aus).

Also: einfach öffnen und gucken :-)

von Rolf D. (rolfdegen)


Lesenswert?

Ja Rundmutter ist von hinten aufgeschraubt.

von hinz (Gast)


Lesenswert?

Rolf D. schrieb:
> Das Auslesen des
> ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das
> Hexfile binhaltet nur Datenmüll (siehe Anhang).

Da sind wohl schlicht die Lockbits gesetzt, eben damit die Firmware 
nicht ausgelesen werden kann.

von René F. (Gast)


Lesenswert?

Rolf D. schrieb:
> Ja Rundmutter ist von hinten aufgeschraubt.

Gibt sogar ein Spezialwerkzeug dafür, 2 Zangen tuns auch.

von Rolf D. (rolfdegen)


Lesenswert?

hinz schrieb:
> Rolf D. schrieb:
>> Das Auslesen des
>> ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das
>> Hexfile binhaltet nur Datenmüll (siehe Anhang).
>
> Da sind wohl schlicht die Lockbits gesetzt, eben damit die Firmware
> nicht ausgelesen werden kann.

Hallo Hinz,
dann würde der Anfang des Hex-Files nicht mit der Software auf meinem 
ATmega Ersatz-Board übereinstimmen.

Gruß Rolf

: Bearbeitet durch User
von Friedhelm (Gast)


Lesenswert?

Vielen Dank für Tipps :)

Die Buchsen konnte ich mittels 9er Maulschlüssel und Zange gut 
demontieren.

von Udo S. (urschmitt)


Lesenswert?

@Rolf:
Du hast die Frage von Chris gelesen?

Chris D. schrieb:
> ch muss mir mal den Schaltplan zu Gemüte führen und würde mal einen
> Ausleseversuch mit einem originalen avrispmkII starten.
>
> Wie genau hast Du Deinen Controller ausgelesen (nicht dass ich denselben
> Fehler auch mache)?
>
> Ich habe hier zwei Mal Softwareversion 1.1

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo Chris

Der Anschluss für den ISP Programmer sieht so aus (siehe 1.Bild).

2.Bild Anschluss am AVRISPMKII Programmer.

Schon mal vielen Dank für deine Mühe.

Gruß Rolf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich programmiere gerade am Netzteil die PWM-Ansteuerung für Spannung und 
Strom. Könnte jemand mal überprüfen mit welcher PWM-Frequenz die U-Soll 
und I-Soll Anschlüsse im Netzteil angesteuer werden. Laut Rippel auf der 
Ausgangsspannung (siehe Bild) vermute ich so um die 2KHz.

Danke. Gruß Rolf

Beitrag #6323266 wurde von einem Moderator gelöscht.
von Rolf D. (rolfdegen)


Lesenswert?

Mmmm..

Ich habe diesbezüglich hier im Forum noch keine negativen Erfahrungen 
gemacht.

Gruß Rolf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo..

Ich programmiere gerade die PWM-Ansteuerung für Spannung (U-Soll) und 
Strom (I-Soll) im Netzteil. Dafür habe ich die PWM-Ausgänge OCR1A und 
OCR1B im ATmega328 benutzt und diese auf eine Auflösung von 14Bit und 
eine PWM-Frequenz von 1KHz eingestellt. Das PWM-Steuersignal wird im 
Netzteil über einen Tiefpass (R 42, R 43, C 27 sowie R 52, R 53 und C 
34) in eine proportionale Gleichspannungen gewandelt. Der Spannungswert 
für U-Soll ist in mV angegeben. Um eine größere Genauigkeit bei den 
Berechnungen zu erhalten, habe ich die Werte um den Faktor 1000 
skaliert.

Youtube: https://youtu.be/PlK1gVf0LB4

Beispiel für U-Soll
1
{
2
  DDRB |= (1 << DDB1)|(1 << DDB2);
3
  // PB1 and PB2 is now an output
4
5
  ICR1 = 0x3FFF;
6
  // set TOP to 16383 14Bit/1KHz
7
  
8
  // set U-Soll
9
  uint8_t Digi_offset = 67; 
10
  uint16_t Umax = 30000;  // mV
11
  uint32_t Usoll = 20000;  // mV
12
  uint32_t PWM_value = 15540; // 15540 ~ 30.0V
13
  uint16_t OCR_value = 0;
14
  PWM_value = (PWM_value * 1000); 
15
  OCR_value = (uint32_t)(((PWM_value) / Umax) * Usoll) / 1000;
16
  
17
  //set PWM (U-Soll)
18
  OCR1A = Digi_offset + OCR_value;  
19
20
  OCR1B = 16382;  // Ampre
21
  // set PWM for 100% duty cycle @ 16bit
22
23
  TCCR1A |= (1 << COM1A1)|(1 << COM1B1);
24
  // set none-inverting mode
25
26
  TCCR1A |= (1 << WGM11);
27
  TCCR1B |= (1 << WGM12)|(1 << WGM13);
28
  // set Fast PWM mode using ICR1 as TOP
29
  
30
  TCCR1B |= (1 << CS10);
31
  // START the timer with no prescaler
32
  
33
}

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Habe gerade gesehen das man Usoll auch auf 16Bit setzen kann. Das spart 
ein wenig Prozessor Ressourcen ;)

von MaWin (Gast)


Lesenswert?

Rolf D. schrieb:
> Durch einen dummen Fehler am SPI Port des ATmega88 habe ich die Firmware
> des PPS 5330 geschrottet.

Ähm, d.h. du hast für 150 einen Bausatz für ein 40V/3A Netzteil gekauft, 
erfolgreich zusammengebaut und nun bei der Analyse wie du eine 
Temperaturanzeige nachrüsten kannst so geschrottet, dass du ohne 
Firmware dastehst, weil ELV Asi wie immer reagiert.

Da bleibt wohl nur, den Focus deines Bastelprojekts so zu verändern, 
dass du eine neue Firmware schreibst und dann veröffentlichst. Bei der 
kannst du gleich eine Temperaturanzeige einbauen. Obwohl so was bei 
funktionierenden Geräten überflüssig ist, eine galvanisch getrennte USB 
Programmierbarkeit als MODBus Device aber sehr wertsteigernd wäre.

Was ich nicht ganz verstehe, ist der CD4051 aufgebaute A/D Wandler. Die 
haben echt diese ungenaue Schaltung drin, obwohl der ATmega88 8 eigene 
Analogkanäle besitzt ? Die brauchen 4 Pind (ADW und AD0, AD2, AD2) um 4 
Analogwerte zu messen. Da sollte man die Schaltung restlos entsorgen, 
und an 4 Analogeingänge des ATmega legen (den man dafür ggf. 
umverdrahten muss) mit interner Referenz. Die ist zwar um +/-10% 
ungenau, aber ein mal kalibriert bleibt die 1000x stabiler als die 
Versorgungsspannung. Nein, die 10 bit sind nicht zu wenig. Auch wenn 
dein externer Wandler mit 16 bit timer auflöst, ist er erheblich 
unlinearer als 10 bit. Macht bei 30V halt 0.03V Auflösung.

Merkwürdig finde ich, dass beim Display IST und SOLL angezeigt wird, die 
Eingabe neuer SOLL-Werte aber wohl im IST Display gemacht wird. Da hat 
wohl jemand bei ELV sein Gehirn an der Garderobe abgegeben. Ich würde 
die Eingsbe aufs kleine Display verlagern, da dort Unterstriche fehlen 
wohl durch blinkende Ziffer

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hier die Software zum Ansteuer vom Display im PPS 5330 Netzteil. Der 
Code ist noch nicht optimiert. Für die Entwicklung einer eigenen 
Software benutze ich ein ATmega328P "NANO" Board. Dieser besitzt im 
Vergleich zu dem ATmega88 im Netzteil einen größeren Programmspeicher 
und mehr Port-Leitungen. Die serielle Datenleitung (MOSI, MISO, CLK) zum 
Display habe ich über drei Port-leitungen mit dem ATmega328 verbunden 
und steuer diese softwaremäßig an. Die SPI-Schnittstelle im ATmega328 
ist mit dem Programmieradapter verbunden.

1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h>
6
7
#define SOFT_SPI_MOSI_PORT    PORTD
8
#define SOFT_SPI_CLK_PORT    PORTD
9
#define SOFT_SPI_MOSI_DDR    DDRD
10
#define SOFT_SPI_CLK_DDR    DDRD
11
#define SOFT_SPI_MISO_DDR    DDRD
12
#define RESET_DDR            DDRD
13
#define SOFT_SPI_MOSI_BIT   PD4
14
#define SOFT_SPI_MISO_BIT    PD2
15
#define SOFT_SPI_CLK_BIT    PD3
16
#define SOFT_SPI_MISO_PIN   PD2
17
18
19
// Software SPI
20
void SOFT_SPI_init(void){
21
    // MOSI und CLK auf Ausgang setzen
22
    SOFT_SPI_MOSI_DDR |=(1<<SOFT_SPI_MOSI_BIT);
23
    SOFT_SPI_CLK_DDR  |=(1<<SOFT_SPI_CLK_BIT);
24
25
    // MOSI und CLK auf HIGH setzen
26
    SOFT_SPI_MOSI_PORT|=(1<<SOFT_SPI_MOSI_BIT);
27
    SOFT_SPI_CLK_PORT |=(1<<SOFT_SPI_CLK_BIT);
28
29
    // MISO auf Eingang setzen
30
    SOFT_SPI_MISO_DDR &=~(1<<SOFT_SPI_MISO_BIT);
31
    
32
    
33
}
34
35
36
SPI_wr2(unsigned char dataout)
37
{    
38
    uint8_t datain=0;
39
    //das Byte wird Bitweise nacheinander Gesendet MSB zuerst
40
    for (uint8_t a=8; a>0; a--){
41
        datain<<=1;                      //Schieben um das Richtige Bit zusetzen
42
        SOFT_SPI_CLK_PORT &=~(1<<SOFT_SPI_CLK_BIT);     // Clock auf LOW
43
        
44
        if (dataout & 0x80){                //Ist Bit a in Byte gesetzt
45
            SOFT_SPI_MOSI_PORT |=(1<<SOFT_SPI_MOSI_BIT);   //Set Output High
46
        }
47
        else{
48
            SOFT_SPI_MOSI_PORT &=~(1<<SOFT_SPI_MOSI_BIT);   //Set Output Low
49
        }
50
        
51
        _delay_us(1);
52
        if (SOFT_SPI_MISO_PIN & (1<<SOFT_SPI_MISO_BIT))   //Lesen des Pegels
53
        {
54
            datain |= 1;
55
        }
56
        
57
        _delay_us(1);
58
        SOFT_SPI_CLK_PORT |=(1<<SOFT_SPI_CLK_BIT);       // Clock auf High
59
        _delay_us(1);
60
        dataout<<=1;                     //Schiebe um nächstes Bit zusenden
61
    }
62
    _delay_us(100);
63
    while(PIND & (1<<SOFT_SPI_MISO_BIT));    // LCD chip Bussy ?
64
    
65
}
66
67
68
int main(void)
69
{
70
    // Set the PORTD as Output:
71
    DDRD = 0xFF;
72
    PORTD = 0x00;
73
        
74
    SOFT_SPI_init();
75
    
76
    DDRB |= (1<<PB1);
77
    PORTB |= (1<<PB1);
78
    PORTB &= ~(1<<PB1);
79
        
80
    _delay_ms(1000);
81
    SPI_wr2(0xF0);   // Display löschen
82
    _delay_ms(1000);
83
    SPI_wr2(0xC1);  // Beleuchtung einschalten
84
    
85
    SPI_wr2(0x43);    // " 0.00 V"
86
    SPI_wr2(0x50);
87
    SPI_wr2(0x50);
88
    SPI_wr2(0x50);
89
    SPI_wr2(0x5D);
90
    SPI_wr2(0x23);
91
    SPI_wr2(0x05);
92
    SPI_wr2(0x34);
93
    SPI_wr2(0x22);
94
    SPI_wr2(0x09);
95
    SPI_wr2(0x31);
96
    SPI_wr2(0x23);
97
    SPI_wr2(0x06);
98
    SPI_wr2(0x34);
99
    
100
    
101
    SPI_wr2(0x47);    // "0.000 A"
102
    SPI_wr2(0x50);
103
    SPI_wr2(0x50);
104
    SPI_wr2(0x50);
105
    SPI_wr2(0x50);
106
    SPI_wr2(0x27);
107
    SPI_wr2(0x03);
108
    SPI_wr2(0x31);
109
    SPI_wr2(0x27);
110
    SPI_wr2(0x01);
111
    SPI_wr2(0x34);
112
    
113
    SPI_wr2(0x23);    // " 0.00 W"
114
    SPI_wr2(0x03);
115
    SPI_wr2(0x31);
116
    SPI_wr2(0x4B);
117
    SPI_wr2(0x50);
118
    SPI_wr2(0x50);
119
    SPI_wr2(0x50);
120
    SPI_wr2(0x5E);    
121
    
122
    
123
    while(1)
124
    {    
125
        _delay_ms(2000);
126
        SPI_wr2(0x23);    // "W" off
127
        SPI_wr2(0x03);
128
        SPI_wr2(0x10);
129
        SPI_wr2(0x4B);    // "27.5C"
130
        SPI_wr2(0x5C);
131
        SPI_wr2(0x55);
132
        SPI_wr2(0x57);
133
        SPI_wr2(0x52);
134
        SPI_wr2(0x23);
135
        SPI_wr2(0x02);
136
        SPI_wr2(0x31);
137
        OCR0A = 128;
138
        _delay_ms(2000);
139
        SPI_wr2(0x23);    // "W" on
140
        SPI_wr2(0x03);
141
        SPI_wr2(0x31);
142
        SPI_wr2(0x4B);    // "0.000 W"
143
        SPI_wr2(0x50);
144
        SPI_wr2(0x50);
145
        SPI_wr2(0x50);
146
        SPI_wr2(0x5E);
147
        OCR0A = 20;
148
    }
149
150
}

Hab ein kleines Video gemacht: https://youtu.be/u_zMiCXtVsI

Gruß Rolf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

MaWin schrieb:
> Was ich nicht ganz verstehe, ist der CD4051 aufgebaute A/D Wandler. Die
> haben echt diese ungenaue Schaltung drin, obwohl der ATmega88 8 eigene
> Analogkanäle besitzt ? Die brauchen 4 Pind (ADW und AD0, AD2, AD2) um 4
> Analogwerte zu messen. Da sollte man die Schaltung restlos entsorgen,
> und an 4 Analogeingänge des ATmega legen (den man dafür ggf.
> umverdrahten muss) mit interner Referenz. Die ist zwar um +/-10%
> ungenau, aber ein mal kalibriert bleibt die 1000x stabiler als die
> Versorgungsspannung. Nein, die 10 bit sind nicht zu wenig. Auch wenn
> dein externer Wandler mit 16 bit timer auflöst, ist er erheblich
> unlinearer als 10 bit. Macht bei 30V halt 0.03V Auflösung.
>
> Merkwürdig finde ich, dass beim Display IST und SOLL angezeigt wird, die
> Eingabe neuer SOLL-Werte aber wohl im IST Display gemacht wird. Da hat
> wohl jemand bei ELV sein Gehirn an der Garderobe abgegeben. Ich würde
> die Eingsbe aufs kleine Display verlagern, da dort Unterstriche fehlen
> wohl durch blinkende Ziffer


Hi MaWin

Danke für dein Interesse. Der ADC im ATmega88 hat leider nur eine 10Bit 
Auflösung. Das reicht für eine genau Messwert-Analyse für 30V nicht aus.

Beispiel: 10Bit Auflösung 1024 / 30V = 29mV

Aus diesem Grund wurde ein hochauflösender 16Bit Timer benutzt, der die 
Aufladezeit eines Integrator misst. Die gemessene Zeit wird dann in 
einen Spannungswert umgerechnet. Klar das die Umwandlung dann etwas mehr 
Zeit benötigt als bei einem echten AD-Wandler. Als Referenzspannung für 
die Messungen dient hier ein LM385 mit 2.5V D16.

Gruß Rolf

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Rolf D. schrieb:
> Das reicht für eine genau Messwert-Analyse für 30V nicht aus.

Was genau soll denn da nicht ausreichen bei so einem LNG? Das soll ja 
jetzt keine hochgenaue Kiste sein.

OK, mir waren die 10 bit auch etwas zu eng, ich hab deswegen einen 
MCP3208 (12bit ADC) eingesetzt in meinem LNG zum Auswerten der Potis und 
der Ist-Werte des LNGs

von Martin (Gast)


Lesenswert?

M. K. schrieb:
> Rolf D. schrieb:
>> Das reicht für eine genau Messwert-Analyse für 30V nicht aus.
>
> Was genau soll denn da nicht ausreichen bei so einem LNG? Das soll ja
> jetzt keine hochgenaue Kiste sein.

Du stellst eine Frage ...

> OK, mir waren die 10 bit auch etwas zu eng, ich hab deswegen einen
> MCP3208 (12bit ADC) eingesetzt in meinem LNG zum Auswerten der Potis und
> der Ist-Werte des LNGs

... und beantwortest sie selbst. Einfach zu drollig.

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Ich werde Heute versuchen, die Spannungsmessung über den speziellen 
AD-Wandler im Netzteil zu programmieren und bin dann auf die Genauigkeit 
der Messung gespannt.

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ich werde Heute versuchen, die Spannungsmessung

ene Bitte, kannst du auch deinem Rigol mal ein Sinus zeigen fast von der 
unteren Displaykante zur oberen, und dann genau so nach oben oder unten 
rausschieben bitte. Plottet das Rigol am Rand weiter oder nicht?

beide Bilder wären toll
Danke

von MaWin (Gast)


Lesenswert?

Rolf D. schrieb:
> Der ADC im ATmega88 hat leider nur eine 10Bit Auflösung. Das reicht für
> eine genau Messwert-Analyse für 30V nicht aus.

Bloss: der diskret aufgebauter misst nicht genauer. Er erfindet nur ein 
paar bits dazu. Für genauer als 0.1% müssten Widerstände, 
Referenzspannungsquelle, OpAmp-Offsetspannung, Kondensatorkonstanz, 
dielektrische Absorption und Unabhängigkeit der Kapazität von der 
Spannung auch entsprechend genau sein. Das ist alles nicht der Fall.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Joachim B. schrieb:
> Rolf D. schrieb:
>> Ich werde Heute versuchen, die Spannungsmessung
>
> ene Bitte, kannst du auch deinem Rigol mal ein Sinus zeigen fast von der
> unteren Displaykante zur oberen, und dann genau so nach oben oder unten
> rausschieben bitte. Plottet das Rigol am Rand weiter oder nicht?
>
> beide Bilder wären toll
> Danke

Ja kein Problem. Hier meine Pics..

von hinz (Gast)


Lesenswert?

Rolf D. schrieb:
> hinz schrieb:
>> Rolf D. schrieb:
>>> Das Auslesen des
>>> ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das
>>> Hexfile binhaltet nur Datenmüll (siehe Anhang).
>>
>> Da sind wohl schlicht die Lockbits gesetzt, eben damit die Firmware
>> nicht ausgelesen werden kann.
>
> Hallo Hinz,
> dann würde der Anfang des Hex-Files nicht mit der Software auf meinem
> ATmega Ersatz-Board übereinstimmen.

Es gibt mehr als ein einziges Lockbit.

von Olaf (Gast)


Lesenswert?

> Er erfindet nur ein paar bits dazu.

Ist doch egal. Hauptsache es sieht auf der Anzeige huebscher aus. :)

> Für genauer als 0.1% müssten Widerstände,
> Referenzspannungsquelle, OpAmp-Offsetspannung, Kondensatorkonstanz,
> dielektrische Absorption und Unabhängigkeit der Kapazität von der

Ich vermute mal da es ein Bausatz war, hat man auch einen Schaltplan und 
kann dann ganz einfach alle Bauteile verbessern. Ist vielleicht unoetig 
weil man bei Netzteilen mit 0.1V auskommt, aber schadet ja auch nicht.
So kann man dann auch gleich die Anschaffung seines teuren Multimeter 
rechtfertigen das man zum kalibrieren braucht. :-)

Olaf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
>> beide Bilder wären toll
> Ja kein Problem. Hier meine Pics.

danke, so ein tolles Gerät aber das machen sie immer noch falsch, beim 
Sinus ist es ja eindeutig, aber beim Rechteck liest man auf die Schnelle 
mal falsche Vpp ab, das nervt mich.
Ich weiss die Vertikalauflösung ist begrenzt, aber die FW könnte im 
Zweifel das plotten auch sein lassen, TEK kann es ja auch (OK 9 bis 12 
Bit)

Aber ein 7-Bit Anzeige ist mir lieber als eine Falschanzeige.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Das Display hat eine Color Grade Funktion. Darin wird beim Überschreiten 
des Bildschirmrandes die Wafeform rot gezeichnet.

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Da ich auch über so ein PPS5330 verfüge, hier eine kleine Messreihe 
(Herstellerkalibrierung):
1
Einstellung (Volt)   Messung (Volt, Multimeter)
2
3
 3                   3,00
4
 5                   5,00
5
12                  11,99
6
15                  14,99
7
18                  17,99
8
24                  23,98
9
27                  27,98
10
30                  29,97

von Rolf D. (rolfdegen)


Lesenswert?

Wobei die Auflösung laut Anleitung bei 14Bit liegt. Ich habe die 
PWM-Ansteuerung für Strom und Spannung auch auf 14Bit programmiert. 
Damit Beträgt die Spannungsauflösung 1.8mV und beim Strom 181uA.

: Bearbeitet durch User
von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> Da ich auch über so ein PPS5330 verfüge, hier eine kleine Messreihe
> (Herstellerkalibrierung):
>
>
1
> 
2
> Einstellung (Volt)   Messung (Volt, Multimeter)
3
> 
4
>  3                   3,00
5
>  5                   5,00
6
> 12                  11,99
7
> 15                  14,99
8
> 18                  17,99
9
> 24                  23,98
10
> 27                  27,98
11
> 30                  29,97
12
> 
13
>

Ja, ziemlich ähnliche Werte (bis auf die 27,98V ;-) haben wir hier auch 
gemessen (selbst kalibriert). Wie ich schon schrieb: so schlecht scheint 
die A/D-Einheit nicht zu sein - im Gegenteil: auch die Stromregelung ist 
wirklich gut. Wenn ich für einen Sensor 78mA benötige, dann kann ich die 
(messbar) auf +/- 1mA einstellen.

@Rolf: am WE starte ich mal den Ausleseversuch - bis dahin habe ich 
leider noch zu viel zu tun.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

@Martin
Null Problemo. Ich hab Zeit.

Ich habe die Wandlerfunktion für den AD-Wandler im Netzteil 
programmiert. Folgende Zeitwerte für die Spannungsmessung konnte ich am 
Kollektor (ADW-Ausgang) von Transistor T10 messen (Low-Impuls). Der 
Collektor liegt über einen Pullup Widerstand an +5V.

Ausgangsspannung    Zeit
========================
0.1V  =  3.71ms
1.0V  =  1.76ms
2.0V  =  1.24ms
3.0V  =  950us
10V   =  422us
20V   =  246us
30V   =  168us

Jetzt muss ich diesen Zeitwert in einen Spannungswert umwandeln.

Gruß Rolf

von Martin (Gast)


Lesenswert?

Rolf D. schrieb:

> @Martin
> Null Problemo. Ich hab Zeit.
Der Beitrag stammt von Chris.

Deine gemessenen Zeiten überzeugen mich nicht. Erwarte eher einen 
linearen Zusammenhang von t und U. Kannst du das Programm posten?

von Rolf D. (rolfdegen)


Lesenswert?

Die Zeiten habe ich mit dem Scope gemessen.
1
void start_ADC()
2
{
3
  // clear intecrator
4
  PORTC |= (1<<ADC_AD0);
5
  PORTC &= ~(1<<ADC_AD1);
6
  PORTC |= (1<<ADC_AD2);
7
  _delay_ms(1);
8
9
  // Voltage measurement
10
  PORTC &= ~(1<<ADC_AD0);
11
  PORTC &= ~(1<<ADC_AD1);
12
  PORTC &= ~(1<<ADC_AD2);
13
  _delay_ms(10);
14
  
15
  /*
16
  // Temp1 measurement
17
  PORTC |= (1<<ADC_AD0);
18
  PORTC |= (1<<ADC_AD1);
19
  PORTC &= ~(1<<ADC_AD2);
20
  _delay_ms(10);
21
  */
22
}

In der main wird start_ADC() permanent aufgerufen. Das Scope hängt am 
Kollektor von T10.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Ich habe die Spannungsmessung noch mal etwas verändert und starte den 
Mess-vorgang wie folgt:

1. Eingang Nr.5 am Multiplexer IC6 aktivieren um den Integrator IC5d zu 
initialisieren. 5ms warten fürs Entladen von Kondensator C49 und warten 
auf  High-Pegel am ADW-Ausgang von Transistor T10.

2. Eingang Nr.0 am Multiplexer für U-Mess aktivieren und Test-Pin für 
Scope auf High-Pegel setzen.

3. Auf Low-Pegel am ADW-Ausgang von Transistor T10 warten. Danach 
Test-Pin auf Low und kleine Pause von 5ms und neue Messung starten.

Scope Bild: Gelb = ADW-Ausgang, Blau = Test-Pin

Messwerte:

0.1V  =  3.384ms
1.0V  =  1.486ms
2.0V  =  998us
3.0V  =  780us
4.0V  =  653us
5.0V  =  569us
6.0V  =  508us
7.0V  =  461us
8.0V  =  425us
9.0V  =  395us
10.0V =  370us
20.0V =  242us
30.0V =  190us


1
void start_ADC()
2
{
3
  // clear intecrator
4
  PORTC |= (1<<ADC_AD0);
5
  PORTC &= ~(1<<ADC_AD1);
6
  PORTC |= (1<<ADC_AD2);
7
  _delay_ms(5);
8
  while (PINC & (1<<ADC_ADW)); 
9
  
10
  // Voltage measurement
11
  // Reset Timer
12
  PORTC &= ~(1<<ADC_AD0);
13
  PORTC &= ~(1<<ADC_AD1);
14
  PORTC &= ~(1<<ADC_AD2);
15
  PORTC |= (1<<Test_Pin);  // Test_flag = High
16
  while (!(PINC & (1<<ADC_ADW)));
17
  PORTC &= ~(1<<Test_Pin);  // Test_flag = low
18
  _delay_ms(5);
19
  
20
  /*
21
  // Temp1 measurement
22
  PORTC |= (1<<ADC_AD0);
23
  PORTC |= (1<<ADC_AD1);
24
  PORTC &= ~(1<<ADC_AD2);
25
  PORTC |= (1<<Test_flag);  // Test_flag = High
26
  while (!(PINC & (1<<ADC_ADW)));
27
  PORTC &= ~(1<<Test_flag);  // Test_flag = low
28
  _delay_ms(5);
29
  */
30
}

Gruß Rolf

: Bearbeitet durch User
Beitrag #6325017 wurde von einem Moderator gelöscht.
von Martin (Gast)


Angehängte Dateien:

Lesenswert?

1
Grün - Eingang Integrator
2
Blau - ADW-Ausgang
3
Rot  - Ausgang Integrator
4
5
1. Phase (Ch. 5) - zurücksetzen des Integrators (ca. 0 V, 1 ms).
6
2. Phase (Ch. 0) - Messspannung anlegen (x V, Dauer: 19 ms).
7
3. Phase (Ch. 4) - Referenzspannung anlegen (-2,5 V bis Komparator High, Dauer 38 ms).
8
9
x = 38 ms / 19 ms * 2,5 V = 5 V

Gehe nach dem obigen Muster vor und liste die Spannungen/Zeiten auf. 
Eventuell die Wahl des Kanals (Ch.) in einem Befehl zusammenfassen und 
nicht auf mehrere verteilen.

Die Zeiten und Spannungen im Bild sind "erfunden" und stimmen nicht mit 
dem PPS5330 überein.

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Martin

Vielen Dank für die tolle Erklärung. Ich hatte die Schaltung des 
AD-Wandlers falsch verstanden und gedacht, dass es sich bei der 
AD-Wandlung um ein Single-Slope Verfahren handelt. Aus diesem Grund habe 
ich nur die Aufladezeit des Kondensators gemessen statt die Entladezeit 
über Uref. Das war natürlich falsch.

Der AD-Wandler im Netzteil arbeitet im Dual-Slope Verfahren. Hatte mich 
schon gewundert, was die negative Referenzspannung von -2.5V am 
Multiplexer bewirken soll.

Link: http://www.vias.org/mikroelektronik/adc_dualslope.html

Vielen Dank nochmals. Man lernt doch nie aus ;)

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Ja suppi.. Es hat funktioniert :)

Die Messsung von U-Mess hat jetzt funktioniert. Die Messwerte am Scope 
haben jetzt einen linearen Zusammenhang von t und U (siehe Tabelle).

Spannung   Zeit
===============
1.0V   =   824us
2.0V   =   1.334ms
3.0V   =   1.845ms
4.0V   =   2.355ms
5.0V   =   2.866ms
6.0V   =   3.376ms
7.0V   =   3.887ms
8.0V   =   4.398ms
9.0V   =   4.908ms
10.0V  =   5.419ms
20.0V  =   10.527ms
30.0V  =   15.639ms

Die Zeit-Differenz für 1.0V beträgt genau 511us.
Es gibt einen positiven Offset den man bei 1V abziehen muss um auf einen 
linearen Zusammenhang zwischen den Messwerten zu kommen. Dieser Offset 
beträgt 824us - 511us = 313us

Beispiel: 30 x 0.511 = 15.330 + 0.313 = 15.64ms

1
void start_ADC()
2
{
3
  // clear ADC
4
  PORTC |= (1 << ADC_AD0) | (1 << ADC_AD2);
5
  PORTC &= ~(1<<ADC_AD1);
6
  _delay_ms(50);
7
  
8
  // set U-Mess for measurement
9
  PORTC &= ~((1 << ADC_AD0) | (1<<ADC_AD1) | (1<<ADC_AD2));
10
  _delay_ms(19);
11
  
12
  // start with measurment
13
  PORTC |= (1 << ADC_AD2) | (1 << Test_Pin);
14
  while (PINC & (1<<ADC_ADW));  // wait until ADW-Signal is low (end of measurment)
15
  PORTC &= ~(1<<Test_Pin);    // clear Test-Pin
16
  _delay_ms(38);
17
}

Gruß Rolf

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Well done!

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Jetzt gibt es noch ein kleines Problemchen mit der Timer Einstellung.

Die Auflösung der Messspannung liegt bei 10mV. Das sind 511us/100 = 
5,1us. Bei 30V wären das 511us x 30 = 15.330us. Der Timer1 läuft bei 
16Mhz MCU Takt und einem Vorteiler von 8 mit einer Frequenz von 2MHz ~ 
0,5us. Die maximale Messzeit beträgt damit 32,767ms.

Da ich den Timer1 schon für die 16Bit PWM Spannung- und Stromsteuerung 
verwendet habe, muss ich die Messung mit Timer0 bewerkstelligen. Der 
Timer0 hat aber nur ein 8Bit Zählregister. Das reicht für eine Messung 
im gesamten Spannungsbereich von 0-30V leider nicht aus. Also muss ich 
ein zweites Speicherregister erstellen, in dem der Timerüberlauf von 
Timer1 gezählt wird.

Durch einen externen Interrupt vom ADW-Signal (T10) stoppt der Timer0 
und ich kann die beiden Register (Timer1 und Speicherregister) auslesen. 
Die 16Bit Zahl ergibt dann meine Messzeit.

Mal schaun ob ich das so umsetzen kann.. Ideen und Anregungen nehme ich 
gerne an.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

So.. habs hinbekommen. Muss die Software aber noch etwas optimieren.

Auf dem Display wird jetzt die Messzeit für die Spannung in 
Mikrosekunden angegeben. Da die ober Zeile nur 4stellig ist und das 
Messergebnis aber 5stellig, habe ich die 5.Zahlenstelle in die 2.Reihe 
verschoben.

Kleines Video (Messspannung 5V): https://youtu.be/6rm5Og6tHkc

Spannung   Zeit
===============
1.0V   =   824us
2.0V   =   1.334ms
3.0V   =   1.845ms
4.0V   =   2.355ms
5.0V   =   2.866ms
6.0V   =   3.376ms
7.0V   =   3.887ms
8.0V   =   4.398ms
9.0V   =   4.908ms
10.0V  =   5.419ms
20.0V  =   10.527ms
30.0V  =   15.639ms

Jetzt muss ich die Zeitwerte nur noch in Spannungswerte umsetzen :)

Gruß Rolf

: Bearbeitet durch User
Beitrag #6327112 wurde von einem Moderator gelöscht.
Beitrag #6327129 wurde von einem Moderator gelöscht.
Beitrag #6327198 wurde von einem Moderator gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich habe jetzt die Spannungs-, Strom- und Temperaturanzeige programmiert 
(siehe Video). Ein wenig muss ich die Anzeigewerte noch korrigieren.

Der Lüfter wird in Abhängigkeit von der Temperatur am Kühlkörper über 
den PWM-Ausgang von Timer2 gesteuert. Bei 70 Grad leuchtet die 
Warnmeldung "Overtemp." auf und der Lüfter wird mit voller Drehzahl 
angesteuert. Die Abschaltung bei 80 Grad muss ich noch programmieren.

Jetzt folgt die Spannungs- und Stromeinstellung über den Encoder und die 
Anzeige auf der rechten Seite des Displays.

Kleines Video: https://youtu.be/rZ79zxSLXU4


Berechnung von U-Mess aus den Timerwert
1
void U_measurement ()
2
{
3
    mess_flag = 1;
4
    start_Measurement(U_Mess);
5
    
6
    while(mess_flag == 1){}      // wait until measuring time ends
7
  
8
    uint16_t mess_x = (mess_time - 156);  // offset bei 0.0 Volt
9
    float result = (((float)mess_x * 148.9) / 50000);
10
    
11
    char buf[6];
12
    sprintf(buf,"%2.2f\n",result);  // format result in string
13
    
14
    SPI_wr2(0x43);          // print voltage "xx.xx"
15
    
16
    if (buf[2] == 46)        // bei der Anzeige Kommastelle (ASCII-Zeichen 46) in result beachten
17
    {
18
      SPI_wr2(buf[4]+32);
19
      SPI_wr2(buf[3]+32);
20
      SPI_wr2(buf[1]+32);
21
      SPI_wr2(buf[0]+32);
22
    }
23
    else
24
    {
25
      SPI_wr2(buf[3]+32);
26
      SPI_wr2(buf[2]+32);
27
      SPI_wr2(buf[0]+32);
28
      SPI_wr2(0x5D);
29
    }
30
    mess_time = 0;
31
    mess_flag = 0;
32
}

Berechnung von I-Mess aus den Timerwert
1
void I_measurement ()
2
{
3
  mess_flag = 1;
4
  start_Measurement(I_Mess);
5
  
6
  while(mess_flag == 1){}      // wait until measuring time ends
7
  
8
  uint16_t i_mess = mess_time - 145;  // Offset bei 0 Ampere
9
  
10
  float result = ((float)i_mess / 4.224666)/1000;
11
  
12
  char buf[6];
13
  sprintf(buf,"%1.3f\n",result);  // format result in string
14
  
15
  SPI_wr2(0x47);          // print ampere "x.xxx"
16
  SPI_wr2(buf[4]+32);
17
  SPI_wr2(buf[3]+32);
18
  SPI_wr2(buf[2]+32);
19
  SPI_wr2(buf[0]+32);
20
21
  mess_time = 0;
22
  mess_flag = 0;
23
}

Berechnung der Temperatur T1 und PWM für den Fan aus dem Timerwert
1
void T1_measurement()
2
{
3
    mess_flag = 1;
4
    start_Measurement(T1_Mess);
5
    
6
    while(mess_flag == 1){}      // wait until measuring time ends
7
      
8
    mess_time -= 5800;        // = offset bei 0.0 Grad
9
    float result = ((float)mess_time / 34.5);
10
    
11
    char buf[5];
12
    sprintf(buf,"%2.1f\n",result);  // format result in string
13
    SPI_wr2(0x4B);          // print temp "xx.xC"
14
    SPI_wr2(0x5C);
15
    SPI_wr2(buf[3]+32);
16
    SPI_wr2(buf[1]+32);
17
    SPI_wr2(buf[0]+32);
18
    
19
    
20
    
21
    // heat alert
22
    if (result >= 70.0)
23
    {
24
      SPI_wr2(0x22);  // overtemp on
25
      SPI_wr2(0x01);
26
      SPI_wr2(0x34);
27
      OCR2B = 255;
28
    }
29
    else if (result < 69)
30
    {
31
      SPI_wr2(0x22);  // overtemp off
32
      SPI_wr2(0x01);
33
      SPI_wr2(0x10);
34
      
35
      int fan_PWM = ((float)(result-29) * 4.5);  // Fan "log" cuve
36
      
37
      if (result <= 35)
38
      {
39
        fan_PWM = 0;
40
      }
41
            
42
      if (fan_PWM >= 255)
43
      {
44
        fan_PWM = 255;
45
      }
46
      OCR2B = fan_PWM;
47
    }
48
    mess_time = 0;
49
    mess_flag = 0;    // nächste Messung freigeben
50
51
}

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ich habe jetzt die Spannungs-, Strom- und Temperaturanzeige programmiert
> (siehe Video)

und die Sollwertvorgabe auf die kleine Schrift unter Limit und die 
Ist-Werte auf die große Schrift!

https://www.mikrocontroller.net/attachment/102808/IMAG0113.jpg

von Rolf D. (rolfdegen)


Lesenswert?

Ja genauso hab ich mir das vorgestellt :)

Nachdem die Sollwertvorgabe eingestellt wurde, werde ich einige Sekunden 
abwarten und prüfen ob sich die Werte nicht geändert haben und falls 
nicht dann werden sie ins EEPROM geschrieben.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Nachdem die Sollwertvorgabe eingestellt wurde, werde ich einige Sekunden
> abwarten und prüfen ob sich die Werte nicht geändert haben und falls
> nicht dann werden sie ins EEPROM geschrieben.

das habe ich auch geade in meiner 328p Kombi mit I2C EEprom gemacht, 
wenn ich die HG Beleuchtung LCD5110 ändere, man muss nicht sofort 
schreiben wenn man noch am Einstellen ist.

von Rolf D. (rolfdegen)


Lesenswert?

Mmm.. Gerade gemerkt. Es gibt rechts keine Unterstriche für die 
Markierung der Dezimalstellen !?

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Gerade gemerkt. Es gibt rechts keine Unterstriche für die
> Markierung der Dezimalstellen !?

sieht so aus, braucht man das?

wenn ja stellt man an den großen Ziffern ein und übernimmt es zu der 
kleinen Anzeige nach der Speicherung!

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Ich habe fast alle Steuercodes für die Anzeigen-Elemente auf dem Display 
identifizieren können.

Eine Liste folgt später.

Gruß Rolf

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Rolf D. schrieb:
> Ich habe fast alle Steuercodes für die Anzeigen-Elemente auf dem Display
> identifizieren können.
>
> Eine Liste folgt später.

dann lasse doch mal alle anzeigen

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich habe ein kleines Problem und weis nicht woran es liegen kann.

Immer wenn ein Temperaturwert von 45.8 Grad erreicht wird, bekomme ich 
falsche Spannungs- und Temperaturwerte angezeigt. Ist die Temperatur 
niedriger oder höher stimmen wieder die Werte.


Test Video: https://youtu.be/Wciua-4qkgg


Der Counterwert für die Berechnung der Temperatur wird für Testzwecke 
auf der rechten Seite unter U-Limit und I-Limit angezeigt.

Ein Berechnungsfehler in der Temperaturanzeige kann es nicht sein, da 
ich die Counterwert von 7420 - 7430 für einen Test, als const Variablen 
vorgegeben und überprüft habe.

Hab mal mein Code hochgeladen.

Timer-Funktionen im ATmega328
-----------------------------
Timer1a und Timer1b erzeugen 14Bit PWM für die Spannungs- und 
Stromsteuerung
Timer0 ist für die Zeitmessung des AD-Wandlers zuständig
Timer2 erzeugt 8Bit PWM für den Fan.
INT0 Interrupt wird vom ADC gesteuert wenn Messung beendet

Vielleicht weis ja einer von euch einen Rat. Vorab schon mal ein 
Dankeschön.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Es scheint wohl ein systembedingter Fehler in meiner Software zu sein, 
denn ich habe noch weitere Stellen gefunden wo die Werte plötzlich 
verrückt spielen.

Bei Counterwert 8190, 7678 und 7424 !?

: Bearbeitet durch User
von Nachtgespenst (Gast)


Lesenswert?

8190 = 1FFE
7678 = 1DFE
7424 = 1D00 vermutlich eher 7422 = 1CFE
alle enden auf FE
schau mal in ISR (TIMER0_OVF_vect), ob Du dort nicht das Flag 
zurücksetzen musst. Sonst wird die Routine öfters aufgerufen.

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Nachtgespenst. Danke für deinen Tip.

In Atmega Handbuch steht folgendes:

"Das Bit TOV0 wird gesetzt, wenn in Timer / Counter0 ein Überlauf 
auftritt. TOV0 wird bei der Ausführung von von der Hardware gelöscht
entsprechender Interrupt-Behandlungsvektor. Alternativ wird TOV0 
gelöscht, indem eine logische Eins in das Flag geschrieben wird. Wenn 
der
SREG I-Bit, TOIE0 (Timer / Counter0 Overflow Interrupt Enable) und TOV0 
sind gesetzt, der Timer / Counter0 Overflow Interrupt ist
hingerichtet."

Hab das Bit aber trotzdem mal mit TIFR0 |= (1<<TOV0) zurückgesetzt. 
Leider ohne Erfolg. Die Fehler treten immer an den gleichen Stellen auf.

Aber dies ist schon mal ein guter Hinweis von dir. Danke :)

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Problem gelöst :)

In der Interrupt-Routine für den externen Interrupt_0 (ADW-Pin) hatte 
ich den Timer_0 gesperrt und das busy_flag für das Messzeitende gesetzt. 
Das hat vermutlich zu den Problemen mit dem Timer0-Overflow Interrupt 
geführt und letztendlich zu falschen Zählerwerten.

Lösung: Wenn jetzt der externe Interrupt_0 auslöst, wird nur das 
busy_flag gesetzt. Der Timer_0 wird jetzt außerhalb der 
Interrupt-Routine gesperrt.

Als High-Byte für den 16Bit Zähler habe ich das unbenutzte OCR0B 
Register im Timer_0 benutzt.

1
// Timer 0 Overflow interrupt for meassurments
2
ISR (TIMER0_OVF_vect)
3
{   
4
  OCR0B++;
5
}
6
7
// interrupt 0 from ADW-Pin 
8
ISR(INT0_vect)
9
{
10
  busy_flag = 1;
11
}
12
13
uint16_t start_Measurement(uint8_t mess_ch)
14
{
15
  // clear ADC
16
  PORTC |= (1 << ADC_AD0) | (1 << ADC_AD2);
17
  PORTC &= ~(1<<ADC_AD1);
18
  _delay_ms(20);
19
  
20
  // set U-Mess measurement
21
  if (mess_ch == U_Mess)
22
  {
23
    PORTC &= ~((1 << ADC_AD0) | (1<<ADC_AD1) | (1<<ADC_AD2));
24
    _delay_ms(50);
25
  }
26
  
27
  // set I-Mess measurement
28
  if (mess_ch == I_Mess)
29
  {
30
    PORTC &= ~((1 << ADC_AD1) | (1<<ADC_AD2));
31
    PORTC |= (1 << ADC_AD0);
32
    _delay_ms(50);
33
  }
34
  
35
  // set Temp1 for measurement
36
  if (mess_ch == T1_Mess)
37
  {
38
    PORTC &= ~(1<<ADC_AD2);
39
    PORTC |= (1 << ADC_AD0) | (1<<ADC_AD1);
40
    _delay_ms(50);
41
  }
42
  
43
  // set Temp2 for measurement
44
  if (mess_ch == T2_Mess)
45
  {
46
    PORTC &= ~((1<<ADC_AD0) | (1<<ADC_AD2));
47
    PORTC |= (1<<ADC_AD1);
48
    _delay_ms(50);
49
  }
50
  
51
  // start ADC measurment
52
  PORTC |= (1 << ADC_AD2);
53
  PORTC &= ~((1 << ADC_AD0) | (1<<ADC_AD1));
54
  
55
  // set busy for measurement
56
  busy_flag = 0;  
57
  
58
  // clear timer register
59
  //counter_h = 0;
60
  OCR0B = 0;
61
  TCNT0 = 0;
62
  
63
  
64
  TIFR0 |= (1<<TOV0);  
65
  
66
  // Overflow Interrupt erlauben
67
  TIMSK0 |= (1<<TOIE0);
68
  
69
  // start Timer 0
70
  TCCR0B |= (1<<CS00)| (1<<CS01);
71
  
72
  // INT0 enabled
73
  EIMSK |= (1<<INT0);  
74
  
75
  // wait until measuring ends
76
  while(busy_flag == 0){}  
77
  
78
  // stop Timer 0 
79
  TCCR0B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02));  
80
  
81
  // read timer value for measurements
82
  uint16_t mess_time = ((OCR0B << 8) | TCNT0);
83
  
84
  return mess_time;        
85
}

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Misst zu früh gefreut :(

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hier noch einmal der komplette Code.

Gruß Rolf

von Rolf D. (rolfdegen)


Lesenswert?

2.Lösungsversuch

Es kann passieren, dass zur fast gleichen Zeit, indem das externen 
Interrupt-Flag INT0 vom ADW-Pin gesetzt wird, dass Overflow-Flag TOV0 
von Timer_0 gesetzt wird und der OCR0-Wert von Timer_0 nicht mehr 
berücksichtigt wird. Das führt dann zu falschen Messergebnissen.

Aus diesem Grund habe nach der Abfrage des ext. Interrupt-Flags INT0 
noch eine Abfrage des Overflow-Flags TOV0 von Timer_0 programmiert und 
den OCR0 Wert inkrementiert wenn das TOV0 Flag gesetzt ist.

Code
1
// init extern Interrupt_0
2
init_Interrupt()
3
{
4
  EICRA |= (1<<ISC01);  // set Int0 to falling edge
5
  sei();          // enable Global Interrupts 
6
}
7
8
9
void init_Timer0()
10
{  
11
  // Timer0B konfigurieren
12
  TCCR0B |= (1<<CS00) | (1<<CS01); // Prescaler 8
13
}
14
15
16
// Timer2B für Fan PWM konfigurieren
17
void init_Timer2()
18
{
19
  TCCR2B |= (1<<CS21)|(1<<CS22);            // prescaler 64
20
  TCCR2A |= (1<<COM2B1) | (1<<WGM21) | (1<<WGM20);  // Set OC2B at bottom, clear OC2B
21
  OCR2B = 255;                    // 100% Fan-PWM
22
  GTCCR &= ~(1 << TSM); 
23
}
24
25
26
// Timer 0 Overflow interrupt for meassurments
27
ISR (TIMER0_OVF_vect)
28
{   
29
  OCR0B++;
30
}
31
32
33
uint16_t start_Measurement(uint8_t mess_ch)
34
{
35
  // clear ADC
36
  PORTC |= (1 << ADC_AD0) | (1 << ADC_AD2);
37
  PORTC &= ~(1<<ADC_AD1);
38
  _delay_ms(20);
39
  
40
  // set U-Mess measurement
41
  if (mess_ch == U_Mess)
42
  {
43
    PORTC &= ~((1 << ADC_AD0) | (1<<ADC_AD1) | (1<<ADC_AD2));
44
    _delay_ms(50);
45
  }
46
  
47
  // set I-Mess measurement
48
  if (mess_ch == I_Mess)
49
  {
50
    PORTC &= ~((1 << ADC_AD1) | (1<<ADC_AD2));
51
    PORTC |= (1 << ADC_AD0);
52
    _delay_ms(50);
53
  }
54
  
55
  // set Temp1 for measurement
56
  if (mess_ch == T1_Mess)
57
  {
58
    PORTC &= ~(1<<ADC_AD2);
59
    PORTC |= (1 << ADC_AD0) | (1<<ADC_AD1);
60
    _delay_ms(50);
61
  }
62
  
63
  // set Temp2 for measurement
64
  if (mess_ch == T2_Mess)
65
  {
66
    PORTC &= ~((1<<ADC_AD0) | (1<<ADC_AD2));
67
    PORTC |= (1<<ADC_AD1);
68
    _delay_ms(50);
69
  }
70
  
71
  // start ADC measurment
72
  PORTC |= (1 << ADC_AD2);
73
  PORTC &= ~((1 << ADC_AD0) | (1<<ADC_AD1));
74
  
75
  // clear timer register
76
  OCR0B = 0;
77
  TCNT0 = 0;
78
79
  // Overflow Interrupt erlauben
80
  TIMSK0 |= (1<<TOIE0);
81
  
82
  // clear Timer_0 overflow_flag
83
  TIFR0 |= (1<<TOV0);
84
  
85
  // clear extern INT0 Flag
86
  EIFR |= (1<<INTF0);
87
  
88
  // start Timer 0
89
  TCCR0B |= (1<<CS00)| (1<<CS01);
90
  
91
  sei();
92
  
93
  // wait until measuring ends
94
  while(!(EIFR & (1<<INTF0)));
95
  
96
  cli();
97
    
98
  // stop Timer 0 
99
  TCCR0B &= ~((1<<CS00) | (1<<CS01));  
100
  
101
  // Hat wärend des Anhaltens von Timer_0 
102
  // noch ein Überlauf statt gefunden dann OCR0B inc
103
  if(TIFR0 & (1<<TOV0))
104
  {
105
    OCR0B++;
106
  }
107
  
108
  // read timer value for measurements
109
  uint16_t mess_time = ((OCR0B << 8) | TCNT0);
110
    
111
  return mess_time;        
112
}

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Joachim B. schrieb:
> Rolf D. schrieb:
>> Ich habe fast alle Steuercodes für die Anzeigen-Elemente auf dem Display
>> identifizieren können.
>>
>> Eine Liste folgt später.
>
> dann lasse doch mal alle anzeigen


Wie gewünscht noch einmal alle Elemente auf der Anzeige. LCD Codes im 
Anhang.

Die zwei Steuersignale vom LCD-Controller für das Relais 
(Trafo-Umschaltung) und Standby-Funktion muss ich noch herausfinden. 
Sollte aber kein großes Problem sein.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Kleines Video mit fehlerfreie Temperaturanzeige.

Video: https://youtu.be/gGeBTyVvD-4

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> mit fehlerfreie Temperaturanzeige.

OK, mich stört (persönlich nur) dein großes 'C' für Celsius, sieht 
komisch aus, ich könnte mir vorstellen nur oben die 'C' Segmente als 
"Kreis" zu schliessen für 45,7° gefühlt sieht das besser aus als 45,7C

Zwischen 4 & q (falls das überhaupt möglich ist!)

https://www.fontpapa.com/wp-content/uploads/2018/09/d043a33eae4c4fb1a931e7fb7d8c131e.gif

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Ja eigentlich eine gute Idee. Mal schaun ob ich die einzelnen Segmente 
im LCD Controller ansprechen kann. Ich habe leider kein Datenblatt, was 
die Ansteuerung wesentlich erleichtern würde. Um zB einzelne Segmente zu 
finden verwende ich Programmierschleifen und probiere darin 
Parametergruppen aus. Finde ich Segmente, dann grenze ich die Parameter 
in der Schleife weiter ein, bis ich die Steuersequenz gefunden habe.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ja eigentlich eine gute Idee

oh oh, wer eigentlich verwendet.....aber schaun mer mal....

Rolf D. schrieb:
> ob ich die einzelnen Segmente
> im LCD Controller ansprechen kann

von Rolf D. (rolfdegen)


Lesenswert?

Der LCD Controller ist auf meiner Platine vergossen. Im INet habe ich 
andere Platinen gesehen und einen Schriftzug von Samsung erkannt. Müsste 
ein 100poliger Controller Typ so ähnlich wie der KS0073 von Samsung 
sein. Die Pinbelegung stimmt aber nicht überein.

von Joachim B. (jar)


Lesenswert?

OK einverstanden, war nur eine Idee, es sah so aus als wenn man an ALLE 
Segmente rankommt!

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Rolf D. schrieb:
> 2.Lösungsversuch
>
> Es kann passieren, dass zur fast gleichen Zeit, indem das externen
> Interrupt-Flag INT0 vom ADW-Pin gesetzt wird, dass Overflow-Flag TOV0
> von Timer_0 gesetzt wird und der OCR0-Wert von Timer_0 nicht mehr
> berücksichtigt wird. Das führt dann zu falschen Messergebnissen.
>
> Aus diesem Grund habe nach der Abfrage des ext. Interrupt-Flags INT0
> noch eine Abfrage des Overflow-Flags TOV0 von Timer_0 programmiert und
> den OCR0 Wert inkrementiert wenn das TOV0 Flag gesetzt ist.


Ich habe eine bessere Lösung gefunden um den korrekten OCR0-Wert vom 
Timer_0 bei einem Interrupt auszulesen.

Ist die Integration im AD-Wandler beendet wird durch eine negative 
Flanke am INT0 Eingang vom Mikrocontroller ein Interrupt ausgelöst 
(Messzeitende). In der Interrupt-Routine von INT0 wird der Timer_0 durch 
das setzen der CS00 und CS01 Bits im TCCR0B Register gestoppt.  Jetzt 
kann ich in aller Selen Ruhe und ohne viel Hektik den OCR0 Wert und 
TCNT0 Wert von Timer_0 auslesen und zu einem 16Bit Messzeitwert zusammen 
fügen.

Code
1
// Timer 0 Overflow interrupt for meassurments
2
ISR (TIMER0_OVF_vect)
3
{   
4
  OCR0B++;
5
}
6
7
8
// interrupt 0 from ADW-Pin
9
ISR(INT0_vect)
10
{
11
  // stop Timer 0
12
  TCCR0B &= ~((1<<CS00) | (1<<CS01));
13
}

Gruß Rolf

: Bearbeitet durch User
von Misopene (Gast)


Lesenswert?

> In der Interrupt-Routine von INT0 wird der Timer_0 durch
> das setzen der CS00 und CS01 Bits im TCCR0B Register gestoppt.

Das Rücksetzen stoppt den Timer (siehe deinen Code-Asusschnitt) :)

von Rolf D. (rolfdegen)


Lesenswert?

Danke für den Hinweis.

Ja.. Du hast recht. Kleiner Fehler von mir. Um den Timer_0 zu stoppen, 
müssen die Bits CS00 und CS01 im TCCR0B Register natürlich gelöscht 
werden.

Noch eine andere Frage zum Timer: Kann man einen Compare Match Interrupt 
von Timer_0 auslösen wenn der OCR0B-Wert in der  TIMER0_OVF Interrupt 
Routine incrementiert wird.

Es geht darum den 16Bit Wert des Timers_0 als Messzeit vorzugeben und 
nicht die _delay Funktion zu benutzen.

1
// Timer 0 Overflow interrupt for meassurments
2
ISR (TIMER0_OVF_vect)
3
{   
4
  OCR0B++;
5
}

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Rolf D. schrieb:
> Noch eine andere Frage zum Timer: Kann man einen Compare Match Interrupt
> von Timer_0 auslösen wenn der OCR0B-Wert in der  TIMER0_OVF Interrupt
> Routine incrementiert wird.

Ja, kann man. Das System merkt sich den Compare Match und würde ihn 
direkt danach anspringen.

von Rolf D. (rolfdegen)


Lesenswert?

Ok. Vielen Dank für die Info.

Damit wären die _delay() Pausen für die Messungen vermeidbar und ich 
hätte Zeit um zum Beispiel den Encoder und die Taster abzufragen.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo..

Hier ein grober Ablaufplan der Software (Bild).

Das mit dem Compare Match Interrupt von Timer0 war kein guter 
Lösungsansatz, da dieser nur den 8Bit Wert im Timer0 vergleicht und bei 
Gleichstand einen Interrupt auslöst. Der Timer0-Überlauf wird dabei 
nicht berücksichtigt.

Ich habe eine andere Lösung gefunden. In der Overflow Interrupt Routine 
von Timer0 vergleiche ich die Anzahl der Überläufe im OCR0B-Register mit 
einer Variable und stoppe den Timer0 bei Gleichstand.

1
// Timer0 Overflow interrupt
2
ISR (TIMER0_OVF_vect)
3
{
4
  OCR0B++;
5
  
6
  if (OCR0B == Time_max)
7
  {
8
    TCCR0B &= ~((1<<CS00) | (1<<CS01));
9
  }
10
}

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Frage: Weis vielleicht jemand wofür der Regler Anschluss im PPS5330 
Netzteil notwendig ist (siehe Bild).

Größeres Bild: https://i.ibb.co/B37WYXQ/ELV-Power-02.jpg

Im Voraus schon mal vielen Dank für die Hilfe :)

Gruß Rolf

: Bearbeitet durch User
von Dieter W. (dds5)


Lesenswert?

Über diesen Anschluss wird dem Controller signalisiert ob der Spannungs- 
oder der Stromregler gerade aktiv ist.

von Rolf D. (rolfdegen)


Lesenswert?

Ja super. Danke.

Da es sich um einen Komperator-Ausgang (Pin14 an IC4) handelt, kann ich 
also damit die "Active" Anzeige für Spannung oder Strom im Display 
steuern.

Ist der Pin14 von IC4 +5V so müsste der Strom "Aktive" sein. Ist der 
Pin14 -5V dann ist die Spannung "Aktive" !?

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Ich habe das gerade mal überprüft. Strombegrenzung im Netzteil auf 100mA 
eingestellt und den Laststrom auf 200mA. Beim Einschalten der Last sinkt 
die Spannung von 30V auf 0.36V und der Strom bleibt stabil bei 100mA. 
Der Pin14 von IC4 wird high.

: Bearbeitet durch User
von M. K. (sylaina)


Angehängte Dateien:

Lesenswert?

Rolf D. schrieb:
> Hier ein grober Ablaufplan der Software (Bild).

Da ist nen Fehler im Ablaufplan: Wenn die Messphase noch läuft würde ich 
nach Tastenabfrage und Co nicht vor die U/I/T Messung zurückspringen 
sondern dahinter einsteigen, vgl. Bild.
Ist das wirklich so bei dir umgesetzt? Könnte den ein und anderen Effekt 
erklären, denk da noch mal über den Ablauf nach ;)

von H. Buchwald (Gast)


Lesenswert?

@ Rolf

Wie ist der Stand der Software? Wirst du sie veröffentlichen?

von Rolf D. (rolfdegen)


Lesenswert?

Hi

Wenn die Software fertig ist dann werde ich sie hier posten. Bin jetzt 
dabei die Software auf dem Mega88 der im Netzteil verbaut ist 
anzupassen. Im Moment läuft sie noch auf meinem Nano-Board.

Wird aber noch ein Weilchen dauern, da ich gerade mit meinem Fahrrad in 
Urlaub bin :)

Gruß Rolf

: Bearbeitet durch User
von Dieter W. (dds5)


Lesenswert?

Rolf D. schrieb:
> Wird aber noch ein Weilchen dauern, da ich gerade mit meinem Fahrrad in
> Urlaub bin :)

Na dann schönen Urlaub und immer ein wenig Rückenwind oder Gefälle auf 
der Strecke damit es sich leichter tritt. ;-))

von Rolf D. (rolfdegen)


Lesenswert?


von Klaus R. (klaus2)


Lesenswert?

"Entladeschlussspannung bei Silitium-Ionen Akkus bei 2.5V. "

Ist das Humor?

Klaus.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Mein Urlaub ist schon wieder vorbei. Pedelec fahren macht tierisch viel 
Spaß. Aber jetzt gehts weiter..

Ich habe die Code-Liste für den LCD-Controller noch ein wenig ergänzt. 
Die Ansteuerung der beiden Port-Pins für das Relais und Standby-Funktion 
sind jetzt bekannt.

Die Spannungseinstellung mit Encoder funktioniert auch schon. Bei der 
Tastenabfrage gibts noch ein kleines Problem. Da funktioniert das 
Entprellen noch nicht so richtig. Aber das sollte keine große Problem 
sein.

Werde am Wochenende mal ein Video machen. Bis denn..

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Hab mal ein Video gemacht und auf Youtube hochgeladen. Die Probleme mit 
dem Tasten-Prellen habe ich gelöst. Ferner funktioniert im Menü die 
Spannungs- und Stromeinstellung schon. Die Werte von 
Spannungseinstellung und Strombegrenzung stimmen leider noch nicht so 
ganz mit der Ausgangsspannung überein. Das liegt vermutlich an der 
falschen Berechnung der Linearisierungskurve.

Ich habe mal den Code hochgeladen. Diesen muss ich aber noch optimieren 
und einige Fehler beseitigen. Der Code läuft z.Zt auf einem ATmwega328 
Nano und muss noch für den ATmega88 im PPS5330 angepasst werden.

Link zum Video: https://youtu.be/7m1KzoA-EqY

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Hab mal ein Video gemacht und auf Youtube hochgeladen. Die Probleme mit
> dem Tasten-Prellen habe ich gelöst

was mich wundert du kannst 31,2C anzeigen lassen aber 31,2° nicht?
also nur die obersten 4 Segmente vom 'C' geschlossen?
würde IMHO besser aussehen

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Joachim..

Ich gebe dir Recht, dass würde besser aussehen. Leider sind nicht alle 
LCD-Segmente einzeln ansteuerbar. Muss mal schaun ob ich das noch 
hinbekomme.

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Leider sind nicht alle
> LCD-Segmente einzeln ansteuerbar

wie hast du dann das C hinbekommen, ist ja auch keine Zahl!

von Rolf D. (rolfdegen)


Lesenswert?

Ausschnitt aus dem Code für die Display Initialisierung
1
//*************************************************************************
2
// init LCD
3
//*************************************************************************
4
void init_LCD (void)
5
{
6
  _delay_ms(1000);
7
  SPI_wr2(0xF0);            // clear LCD
8
  _delay_ms(100);
9
  SPI_wr2(0xC1);            // LCD-Backlight on
10
  _delay_ms(100);
11
  SPI_wr2(0xB0);            // Relais off  VCC 24.0V
12
  
13
  SPI_wr2(0xA1);            // Stanby on
14
  wr_SPI_buffer3(0x22,0x03,0x31);    // print "Standby"
15
  Standby_flag = 1;
16
  
17
  wr_SPI_buffer3(0x20,0x05,0x1D);    // clear "Aktiv" (V)
18
  wr_SPI_buffer3(0x27,0x03,0x1D);    // clear "Aktiv" (A)
19
  
20
  
21
  print_value(0x43,0);        // print " 0.00 V"
22
  wr_SPI_buffer3(0x23,0x05,0x34);
23
  wr_SPI_buffer3(0x23,0x06,0x34);
24
  
25
  print_value(0x47,0);        // print "0.000 A"
26
  wr_SPI_buffer3(0x27,0x03,0x31);
27
  wr_SPI_buffer3(0x27,0x01,0x34);
28
  
29
  print_value(0x4B,0);        // print "0.00 C"
30
  wr_SPI_buffer3(0x23,0x02,0x31);
31
  
32
  print_value(0x63,0);        // print "0.00 V" (V-Limit)
33
  wr_SPI_buffer3(0x00,0x23,0x38);    // print "x.xx" (Punkt)
34
  wr_SPI_buffer3(0x04,0x20,0x38);    // print "U-Limit"
35
  wr_SPI_buffer3(0x04,0x21,0x38);    // print "V"
36
  
37
  print_value(0x67,0);        // print "0.000 I" (I-Limit)
38
  wr_SPI_buffer3(0x04,0x27,0x34);    // print "x.xxx" (Punkt)
39
  wr_SPI_buffer3(0x23,0x05,0x31);    // print "I-Limit"
40
  wr_SPI_buffer3(0x27,0x05,0x31);    // print "A"
41
}

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> print_value(0x4B,0);        // print "0.00 C"
>   wr_SPI_buffer3(0x23,0x02,0x31);

scheint mir wie eine Command Übertragung zu sein

da hilft es nur wohl mal testweise als äussere Schleife

alle print_value(0x00,0); bis print_value(0xFF,0);

laufen zu lassen
und als 3 innere Schleifen

von wr_SPI_buffer3(0x00,0x00,0x00); bis wr_SPI_buffer3(0xFF,0xFF,0xFF);

wenn dann irgendwann das '°' auftaucht weisst du es

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Ja. So ähnlich habe ich die einzelnen Segmente analysiert.

Wie gesagt. Man kann leider nicht jedes LCD-Segment direkt ansteuern. 
Mit einem kleinen Trick konnte ich das Grad Symbol doch noch 
realisieren. Dazu musste ich auf die entsprechende Position im Display 
eine "2" schreiben und zwei Segmente löschen sowie ein Segment setzen 
(siehe Bild).

Das Grad Symbol muss beim Aktualisieren des Temperaturwertes immer 
wieder neu geschrieben werden, da es von dem 4stelligen Anzeigewert im 
LCD-Controller überschrieben wird. Macht aber nix, denn die Übertragung 
ist super schnell.

1
//*************************************************************************
2
// print T1_measurement result
3
//*************************************************************************
4
void print_T1_result(uint16_t mess_time)
5
{
6
  if (mess_time <= 5845) {
7
    mess_time = 5845;
8
  }
9
  
10
  mess_time -= 5845;        // = offset bei 0.0 Grad
11
  
12
  float result = ((float)mess_time / 34.5);
13
  
14
  //--------------------------------------------------------------------
15
  char buf[4];
16
  sprintf(buf,"%2.1f\n",result);  // format result in string
17
  SPI_wr2(0x4B);          // print temp "xx.x"
18
  SPI_wr2(0x52);          // 4.Digit (Platzhalter für Grad symbol)
19
  SPI_wr2(buf[3]+32);
20
  SPI_wr2(buf[1]+32);
21
  SPI_wr2(buf[0]+32);
22
  
23
  // print Degrees symbol
24
  wr_SPI_buffer3(0x23,0x02,0x31);
25
  wr_SPI_buffer3(0x30,0x17,0x20);
26
  wr_SPI_buffer3(0x30,0x26,0x38);
27
  wr_SPI_buffer3(0x30,0x24,0x17);
28
  
29
  // heat alert
30
  if (result >= 75)
31
  {
32
    SPI_wr2(0xA1);  // Stanby on
33
    SPI_wr2(0x22);  // set "Standby"
34
    SPI_wr2(0x03);
35
    SPI_wr2(0x31);
36
    Standby_flag = 1;
37
    return;
38
  }
39
  else if (result >= 70.0)
40
  {
41
    SPI_wr2(0x22);    // overtemp on
42
    SPI_wr2(0x01);
43
    SPI_wr2(0x34);
44
    OCR2B = 255;    // set max Fan PWM
45
    return;
46
  }
47
  else if (result < 69)
48
  {
49
    SPI_wr2(0x22);    // overtemp off
50
    SPI_wr2(0x01);
51
    SPI_wr2(0x11);
52
    
53
    if (result <= 35)
54
    {
55
      OCR2B = 20;    // set min Fan PWM
56
    }
57
    else
58
    {
59
      uint8_t fan_speed = ((result-31) * 5.0);  // calc fan_speed
60
      OCR2B = fan_speed;
61
    }
62
  }
63
}

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Rolf D. schrieb:
> Kleines Preview von mir mit falsch eingebauter Reflektorscheibe:
> Youtube-Video "ELV PPS 5330"

Jetzt müsstest du nur noch erzählen, was du da rumdrückst.

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ja. So ähnlich habe ich die einzelnen Segmente analysiert.
>
> Wie gesagt. Man kann leider nicht jedes LCD-Segment direkt ansteuern.
> Mit einem kleinen Trick konnte ich das Grad Symbol doch noch
> realisieren. Dazu musste ich auf die entsprechende Position im Display
> eine "2" schreiben und zwei Segmente löschen sowie ein Segment setzen
> (siehe Bild).

gefällt mir, auf jeden Fall besser als das 'C'

von Rolf D. (rolfdegen)


Lesenswert?

Im Video:
Das Gerät oberhalb des Netzteils ist eine Elektronische Last. Hab das 
nur um den Laststrom für das Netzteil einzustellen und die Spannung zu 
kontrollieren.
Wie gesagt. Die Spannungswerte stimmen noch nicht ganz. Beim Strom sieht 
es aber schon ganz gut aus :)

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Ich bin gerade dabei meinen Programm Code etwas zu verkleinern, damit er 
in den Flash des ATmega88 passt. Aus diesem Grund habe ich die meisten 
LCD Kommandos in Tabellen im Programmspeicher hinterlegt.

Leider klappt der Tabellenzugriff per send_LCD_commands(Standby_on) 
Funktion nicht. Hab da irgendwie Problemchen mit Pointern und Zeiger.

Im Voraus schon mal vielen Dank für eure Unterstützung.

Gruß Rolf

Programm Code
1
//Command tables
2
const uint8_t clr_Digit_Lines[] PROGMEM = {0x24,0x07,0x1D,0x24,0x06,0x15,
3
  0x24,0x06,0x1D,0x24,0x05,0x15,0x27,0x01,0x1D,0x27,0x01,0x15,0x27,0x02,
4
  0x1D,0x27,0x02,0x15};
5
  
6
const uint8_t Standby_on[] PROGMEM = {0xA1,0x22,0x03,0x31,0x20,0x05,
7
  0x1D,0x27,0x03,0x1D};
8
  
9
const uint8_t Standby_off[] PROGMEM = {0xA0,0x22,0x03,0x1E,0x20,0x05,0x32,
10
  0x27,0x03,0x1D};
11
12
13
//*************************************************************************
14
// send LCD commands
15
//*************************************************************************
16
void send_LCD_commands (const int * Com_Adr)
17
{
18
  for (uint8_t i = 0; i < 10; i++)
19
  {
20
    SPI_wr2(pgm_read_byte (Com_Adr + i));
21
  }
22
}
23
24
25
Funktionsaufruf im Programm
26
27
send_LCD_commands(Standby_on);

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

1
void send_LCD_commands (const uint8_t Com_Adr[])

von Rolf D. (rolfdegen)


Lesenswert?

Ja super. Hat funktioniert :)

Vielen Dank Martin.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich habe den Programmcode jetzt soweit optimiert und liege mit 7964 
Bytes knapp unter der Programmspeichergrenze von 8192 Bytes des ATmega88 
(siehe Code).

Was ich noch optimieren könnte, wäre einige Fließkomma-Berechnung für 
die Ist- und Soll-Werte auf Festkomma-Berechnung mit Integer-Zahlen 
umzustellen. Ferne die prinf-Funktion für die String-Umwandlung zu 
vermeiden. Das kostet bekanntlich immer viel Speicherplatz im Flash.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Hab jetzt die ganzen Fließkommaberechnungen entfernt und auf 
Festkommaarithmetik mit Integerzahlen umgestellt. Ferner habe ich alle 
printf Anweisungen entfernt und auf eine eigene Ausgabefunktion 
umgestellt.

Der Artikel "Festkommaarithmetik" hier auf Mikrocontroller.net war mir 
eine große Hilfe. So konnte ich die Code-Größe im Flash auf 7054 Byte 
kürzen.

Link: https://www.mikrocontroller.net/articles/Festkommaarithmetik

Was noch fehlt ist das Speichern und Aufrufen von Sollwert-Vorgaben mit 
der Recall-Taste und die Anpassung an den Mega88 im Netzteil.

Im Anhang der Quellcode.

Gruß Rolf

: Bearbeitet durch User
von P. Zuger (Gast)


Lesenswert?

Wie lang ist das kompilierte Programm jetzt?

Anregung.

Alle magischen Zahlen (Konstanten) durch sprechende Bezeichner/defines 
ersetzen (gegebenenfalls mit Kommentar).
1
uint16_t Value = (((uint32_t)(521 * Usoll) * 100) / 100950);

von Rolf D. (rolfdegen)


Lesenswert?

Danke für den Tip!

Die Programmlänge beträgt 7162 Bytes im Flash und 28 Byte im SRAM. Ich 
programmiere mit Atmel Studio 7.0 und habe die Compiler Optimierung auf 
"Os" stehen.

Ein kleines Problem ist die Linearisierung der Ausgangsspannung. Die 
stimmt noch nicht so ganz. Die Abweichung beträgt bei Vorgabe von 1.00V 
= 1.09V und bei 30.00V = 29.81V.

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ein kleines Problem ist die Linearisierung der Ausgangsspannung. Die
> stimmt noch nicht so ganz. Die Abweichung beträgt bei Vorgabe von 1.00V
> = 1.09V und bei 30.00V = 29.81V.

hast du Steigung m und Offset b berechnet?

ich rechne das immer aus mit 2 Wertepaare in y/x

du weisst doch noch aus dem Mathematikunterricht:

y = m * x + b

und mit
y1 = m * x1 + b
und
y2 = m * x2 + b

kannst du m & b ermitteln

natürlich gibt es da immer noch Unlinearitäten und du kannst die 
Intervalle auch verkleinern und mehrere nutzen.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallo Joachim

Vielen Dank. Mit Mathe tuh ich mich allerdings immer etwas schwer. Aber 
ich denke das werde ich noch hinbekommen :)

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Aber
> ich denke das werde ich noch hinbekommen :)

wenn du noch Hilfe brauchst melde dich

der Weg sollte klar sein, am ADC in eine Spannung einstellen vom 
Labornetzteil oder Poti

Spannung1 messen und notieren adc Wert1 notieren
Spannung2 messen und notieren adc Wert2 notieren

m = dy/dx

mit x = adc Wert
und y = Spannung

weil ja immer x der unabhängige Wert ist und y der Abhängige ist

somit ergibt sich y = m * x + b automatisch.

: Bearbeitet durch User
von Rolfdegen@hotmail.com (Gast)


Lesenswert?

Super vielen Dank.

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Joachim..

Bräuchte doch etwas Hilfestellung von Dir.

In der Berechnung treten leider Fehler auf. Bei Vorgabe von 1.000mV 
stimmt der Wert annähernd. Aber bei kleineren oder größeren Werten 
leider nicht. Was mache ich falsch ? Die Usoll Vorgabe ist in mV.
1
//*************************************************************************
2
// set Usoll
3
//*************************************************************************
4
void set_Usoll (int32_t Usoll)  // Usoll in mV
5
{
6
  Usoll = 1000;  // Test! Usoll in mV
7
  
8
  // offset = 5
9
  // 539   =  1.000mV
10
  // 5210  = 10.000mV
11
  // 10395 = 20.000mV
12
  // 15580 = 30.000mV
13
  
14
  
15
  
16
  uint16_t m = 0; 
17
  uint8_t b = 5;
18
  uint16_t x1 = 539;
19
  uint16_t y1 = 1000;
20
  uint16_t x2 = 15580;
21
  uint16_t y2 = 30000;
22
  
23
  m = ((uint32_t)Usoll / 539);
24
  
25
  uint16_t y = ((uint32_t)m * 539 + b);
26
  
27
  OCR1A = (y);
28
}

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

m ist delta y / delta x

also m = (y1 - y2) / (x1 - x2)

https://de.wikipedia.org/wiki/Geradengleichung

und in der Nähe 0 ist JEDES Messgerät unsauber!

Gilt für alle ADC (auch in DMM) oder analoge Meßgeräte!

also besser den Wert m aus der möglichst besten Geraden nehmen

wenn du mit den Fehlern im unteren Bereich nicht leben kannst, dann 
erstelle eine Tabelle für die unteren ADC Wert = x.xxx mV
oder generiere die für jeden ADC Bereich von bis eigene m und b

: Bearbeitet durch User
von Richard (Gast)


Lesenswert?

Du könntest interpolieren und für bestimmte Bereiche mit anderen 
Faktoren arbeiten.

von Rolf D. (rolfdegen)


Lesenswert?

Ich habe das jetzt wie folgt gemacht. Ich habe Usoll auf 30.00V 
eingestellt und eine Ausgangsspannung von 30.16V gemessen. Der 
errechnete Steigungsfaktor wäre (30160mV / 30000mV) = 1.0053.
1
//*************************************************************************
2
// set Usoll
3
//*************************************************************************
4
void set_Usoll (int32_t Usoll)  // Usoll in mV
5
{
6
  const uint8_t offset = 38;
7
  
8
  // OCR1A 539   =  1.000mV
9
  // OCR1A 5210  = 10.000mV
10
  // OCR1A 10395 = 20.000mV
11
  // OCR1A 15580 = 30.000mV
12
  
13
  // m = (30160mV / 30000mV) = (1 / 1.0053) = 0.9947 Fließkomma
14
  // m = (30160mV / 30000mV) = (1.0053 * 10000) = 10053 Festkomma
15
  
16
  uint16_t m = 10053;
17
  
18
  //uint16_t y = ((uint32_t)521 * Usoll / 1000);        // ohne Linearisierung
19
  //uint16_t y = (((uint32_t)521 * Usoll / 1000) * m);    // mit Linearisierung (Fließkomma)
20
  uint16_t y = (((uint32_t)(521 * Usoll) * 10) / m);      // mit Linearisierung (Festkomma)
21
  
22
  OCR1A = (y + offset);
23
}

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ich habe das jetzt wie folgt gemacht. Ich habe Usoll auf 30.00V
> eingestellt und eine Ausgangsspannung von 30.16V gemessen. Der
> errechnete Steigungsfaktor wäre (30160mV / 30000mV) = 1.0053.

du hast es leider immer noch nicht verstanden

du musst 2 Wertepaare (=4 Werte) erstellen!

wie oft soll ich das noch posten?

Joachim B. schrieb:
> m = (y1 - y2) / (x1 - x2)

also 2 Spannungen und dazu passend 2 ADC Werte!

und natürlich nicht so nah beieinander es muss schon möglichst viel vom 
Messbereich erfassen der in der Geraden liegt, den Link zu Wiki hatte 
ich auch schon gezeigt
https://de.wikipedia.org/wiki/Geradengleichung

und wenn das nicht hilft
https://wiki.zum.de/wiki/Geraden

es sind immer Wertepaare 2  x und dazu gehörig 2  y

Du wirst auch feststellen das bei 0V der ADC nicht 0 ist, was am Offset 
liegt und an der Nichtlinearität um NULL

: Bearbeitet durch User
von Lustiges Reptil (Gast)


Lesenswert?

Joachim B. schrieb:

> wie oft soll ich das noch posten?

Mindestens noch zweimal. Nur dadurch ist die erforderliche Linearität 
gewährleistet.

von Rolf D. (rolfdegen)


Lesenswert?

Danke für deine Geduld :)

Mein Problem ist der fehlende OCR1A Wert in der Berechnung ?
Diesen Wert muss erst kennen !?

Die Funktion übergibt für die Berechnung nur einen Usoll Wert in mV. 
Daraus muss ich einen OCR Wert für den PWM-Ausgang berechnen der dann 
die Ausgangsspannung steuert.

Gruß Rolf

: Bearbeitet durch User
Beitrag #6389383 wurde vom Autor gelöscht.
Beitrag #6389385 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Die Software Portierung vom externen ATmega328 Nano Board auf den im 
Netzteil sitzenden ATmega88 Mikrocontroller hat problemlos funktioniert. 
Für weitere Softwareänderungen habe ich eine Verbindungsleitung für 
einen ISP-Programmer an die Platine gelötet. Die Anschlüsse dafür waren 
ja schon vorhanden.

Nächster Schritt ist das Programmieren einer Abgleichfunktion 
(Setup-Menü) für die Ausgangsspannung und Strom. Diesbezüglich hat mir 
Joachim aus dem Forum eine sehr gute Hilfestellung gegeben. Ferner fehlt 
noch die Memory Funktion für die Sollwertvorgaben für Spannung und 
Strom.

Ich denke, das sollte noch in den Flash-Speicher passen. Aktuell ist 
noch ca. 1.4KB frei.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hier noch einmal der Anschlussplan für den ISP Programmer am PPS5330.

Gruß Rolf

von Melchior (Gast)


Lesenswert?

Habe zwei Fragen zu deinem interessanten Projekt.

- Konntest du die Originalfirmware auslesen und sichern?

- Ist es (einfach) möglich den 88er auszulöten und durch einen 328er zu 
ersetzen?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo Melchior..

Die Original Firmware konnte ich leider nicht auslesen. Durch einen 
Fehler meinerseits habe ich die Firmware versehentlich gelöscht.

Der ATmega88 hat die gleiche Anschlussbelegung wie der ATmega328.

Gruß Rolf

von Rolf D. (rolfdegen)


Lesenswert?

Joachim B. schrieb:
> m ist delta y / delta x
>
> also m = (y1 - y2) / (x1 - x2)
>
> https://de.wikipedia.org/wiki/Geradengleichung


Idee zum Abgleich per Software:

1. Um in das Abgleich-Menü zu gelangen müssen beide Pfeiltasten 
gleichzeitig 2s lang gedrückt werden.

2. Das Abgleich-Menü zeigt 1.00V an. Automatisch wird der 
1.Spannungswert (y1) und der 1.OCR-Wert (x1) gespeichert.

3. Mit dem Dehgeber (Encoder) wird jetzt die Ausgangsspannung auf 1.00V 
genau eingestellt.

4. Mit der Enter-Taste wird der 2.Spannungwert (y2) und 2.OCR-Wert (x2) 
gespeichert.

Damit hätte ich für die Berechnung  m = (y1 - y2) / (x1 - x2) die 
entsprechenden Werte. Das ganze kann man dann noch für eine 2.Spannung 
zB 27V machen.

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Idee zum Abgleich per Software:

OK ich bin gespannt ob und wie es ausgeht!

drücke dir die Daumen für "akzeptable geringe Fehler"

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

Hallo Rolf, der Fixpoint-Artikel ist viel zu dezimallastig.
Man muss wie der µC binär denken, also z.B. nicht mit 100, sondern mit 
128 oder 256, nicht mit 1000, sondern mit 1024 rechnen, das sind nur ein 
paar shifts.  Statt dividieren lieber mit dem Kehrwert multiplizieren.

Sauberes Projekt, vielen Dank!

von Rolf D. (rolfdegen)


Lesenswert?

Danke für die Tips. Muss die Berechnung in der Praxis erst einmal 
hinbekommen. Dann sehn wir weiter ;)

von Rolf D. (rolfdegen)


Lesenswert?

eProfi schrieb:
> Hallo Rolf, der Fixpoint-Artikel ist viel zu dezimallastig.
> Man muss wie der µC binär denken, also z.B. nicht mit 100, sondern mit
> 128 oder 256, nicht mit 1000, sondern mit 1024 rechnen, das sind nur ein
> paar shifts.  Statt dividieren lieber mit dem Kehrwert multiplizieren.
>
> Sauberes Projekt, vielen Dank!

Also etwa so:
1
int32_t a,b;
2
3
a = b / 0.5432;         // direkte Formel, Division durch Konstante
4
                        // mit Fließkommaarithmetik
5
a = b * 1,8409;         // Multiplikation mit 1/x
6
                        // mit Fließkommaarithmetik
7
a = b * 18409 / 10000;  // Umformung in Kehrwert und Festkommaarthimetik
8
                        // mit Zehnerpotenzen
9
a = b * 15081 / 8192;   // Festkommaarithmetik mit Zweierpotenzen.
10
a = (b * 15081) >> 13;  // Division explizit ausgeführt als Schiebeoperation
11
                        // für nicht so schlaue Compiler

von eProfi (Gast)


Lesenswert?

gut erkannt, z.B. so:
1
void set_Usoll (int32_t Usoll){
2
  #define Digi_offset  43  // Offset 0.00V
3
  #define counts_per_10v  5161
4
  #define u_factor (0.5 + counts_per_10v * 65536 / 10000) //33823.6296
5
  OCR1A = Digi_offset + ((Usoll * u_factor) >> 16);
6
    //43+30000*33823/65536=15525.940673
7
}
8
9
//*************************************************************************
10
// set Isoll
11
//*************************************************************************
12
void set_Isoll (int Isoll){
13
  const uint32_t i_factor = 0.5+530/100*65536; //347341.3
14
  OCR1B = (Isoll * i_factor) >> 16;
15
}
Syntax nicht überprüft

von eProfi (Gast)


Lesenswert?

hier muss man aufpassen, dass der Compiler nicht 5 * 65536 = 327680 
ausrechnet, weil er 530 / 100 = 5 rechnet:
0.5+530/100*65536
Lieber (uint32_t)(0.5+530.0/100.0*65536)

statt
  #define counts_per_10v  5161
  #define u_factor (0.5 + counts_per_10v * 65536 / 10000) //33823.6296
ginge auch
  #define counts_per_30v  15483
  #define u_factor (0.5 + counts_per_30v * 65536 / 30000) //33823.6296

von Rolf D. (rolfdegen)


Lesenswert?

eProfi schrieb:
> hier muss man aufpassen, dass der Compiler nicht 5 * 65536 = 327680
> ausrechnet, weil er 530 / 100 = 5 rechnet:
> 0.5+530/100*65536
> Lieber (uint32_t)(0.5+530.0/100.0*65536)
>
> statt
>   #define counts_per_10v  5161
>   #define u_factor (0.5 + counts_per_10v * 65536 / 10000) //33823.6296
> ginge auch
>   #define counts_per_30v  15483
>   #define u_factor (0.5 + counts_per_30v * 65536 / 30000) //33823.6296


So funktioniert es. Ich hab den Digit_offset und die counts_per_30v noch 
etwas anpassen müssen. Den u_factor habe ich von #define in eine 32bit 
integer Variable umgestellt. Spart einiges an Speicherplatz im Flash.

1
//*************************************************************************
2
// set Usoll (0 - 30.000mV)
3
//*************************************************************************
4
void set_Usoll (uint16_t Usoll)
5
{
6
  #define Digi_offset  133
7
  #define counts_per_30v 15406
8
  #define Umax 30000
9
  uint32_t u_factor = (0.5 + counts_per_30v * 65536 / Umax);
10
  OCR1A = Digi_offset + (((uint32_t)Usoll * u_factor) >> 16);
11
}

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Den u_factor habe ich von #define in eine 32bit
> integer Variable umgestellt. Spart einiges an Speicherplatz im Flash.

und den 328p einlöten magst du nicht? :)

wie sind denn nun die aktuellen Werte m & b für ADV und mV

ist es dir gerade genug?

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallo Joachim..

Ein Austausch des ATmega88 ist aus meiner Sicht nicht erforderlich, da 
ich im Flash noch 1.8 KB freien Speicher habe. Das sollte für die 
Abgleich- und Memory-Funktion ausreichen. Zur Zeit belegt das Programm 
6304 Byte im Flash.

Der Vorschlag von eProfil funktioniert in so fern, weil ich den Wert für 
counts_per_30v 15406 manuell ermittelt habe. Also ohne berechneten 
Abgleich. Die Abgleich-Funktion programmiere ich gerade.

Wofür steht eigentlich die 0.5 in der Berechnung. Wenn ich die weglasse, 
dann ändert sich am Ergebnis nichts.
1
uint32_t u_factor = (0.5 + counts_per_30v * 65536 / Umax);

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Wofür steht eigentlich die 0.5 in der Berechnung. Wenn ich die weglasse,
> dann ändert sich am Ergebnis nichts.

ist eine pfiffige Aufrundung, wie wir in der Schule lernten, alles 
gleich oder über 0,5 wird aufgerundet, unter eben abgerundet.

Wenn natürlich der Wert 0,4 ist ist ändert sich nichts, ist der Wert 
gleich oder über 0,5 wird auf die nächste gradzahlige aufgerundet!

Rolf D. schrieb:
> (0.5 + counts_per_30v * 65536 / Umax)

macht schon per #define der Preprocessor

Rolf D. schrieb:
> uint32_t u_factor = (0.5 + counts_per_30v * 65536 / Umax);

mit uint32_t wird dann das Rechenergebnis als INT eingesetzt sonst würde 
alles was 0.5 hat zu Fliesskomma im Code übersetzt und vorbei wäre es 
mit dem Verzicht auf floating point Berechnung!

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

> ist eine pfiffige Aufrundung, wie wir in der Schule lernten,
> alles gleich oder über 0,5 wird aufgerundet, unter eben abgerundet.
Ohne das 0.5 würde er die Nachkommastellen nur abschneiden.

Damit das funktioniert, muss der Präprozessor aber Float rechnen, dazu 
eine der Konstanten in der Multiplikation als Float angeben, oder 
(float) davorschreiben, das habe ich vergessen.
Die Berechnung im µC findet dennoch platzsparend in Integern statt.

Man könnte auch bei der Berechnung noch runden:
OCR1A = Digi_offset + (((uint32_t)Usoll * u_factor) >> 16);
--->
OCR1A = Digi_offset + (((uint32_t)Usoll * u_factor) >> 16) +
                      (((uint32_t)Usoll * u_factor) >> 15) & 1;

Zum Speicherplatz: wollten wir nicht noch eine USB / Serielle 
spendieren, damit man das Gerät zum Erstellen von Messreihen an einen PC 
hängen kann?
Wenn das auch noch im 88er Platz haben soll, müssen wir evtl. weiter 
"entschlacken".  Da sehe ich noch Potential ;-)

Was spricht dagegen, den Nano drinzulassen?
Dann hat man gleich die Schnittstelle dran.

von Rolf D. (rolfdegen)


Lesenswert?

Habe noch eine andere Idee ausprobiert. Die Ausgangsspannung wird mit 
der Soll-Spannung verglichen und automatisch abgeglichen.
1
//*************************************************************************
2
// set Usoll (0 - 30.000mV)
3
//*************************************************************************
4
void set_Usoll (uint16_t Usoll)
5
{
6
  #define Digi_offset  133
7
  #define Umax 30000
8
  static uint32_t counts_per_30v = 15406; 
9
10
  uint32_t u_factor = (0.5 + counts_per_30v * 65536 / Umax);
11
  OCR1A = Digi_offset + (((uint32_t)Usoll * u_factor) >> 16);
12
  
13
  // automatic adjustment
14
  if (Usoll < Ulimit)  
15
  {
16
    counts_per_30v++;
17
  }
18
  else if (Usoll > Ulimit)
19
  {
20
    counts_per_30v--;
21
  }
22
}

Das Ganze funktioniert Millivolt genau :)

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

1
OCR1A = Digi_offset + (((uint32_t)Usoll * u_factor) >> 16) +
2
  (((uint32_t)Usoll * u_factor) >> 15) & 1;

Da stimmt was nicht. Das Ergebnis ist immer 0 ?


Hab mal ein Video gemacht: https://youtu.be/_QoG5D6Xaf8

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Das Ganze funktioniert Millivolt genau :)

Rolf D. schrieb:
> Da stimmt was nicht. Das Ergebnis ist immer 0 ?

ja was denn nun, so kommen wir nicht weiter und man soll auch nicht 
"plenken"

Du postest viel aber immer zu knapp, wer der nicht deine Gedanken kennt 
soll dir folgen, stelle dir einfach vor du zeigst deine letzten 2 beiden 
Postings jemand anderen, glaubst du er weiss wovon die Rede ist?

von Rolf D. (rolfdegen)


Lesenswert?

Ja.. Du hast da vielleicht Recht. In der Ruhe liegt die Karft ;)

Was bedeutet "plenken" ?

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Du hast da vielleicht Recht

wieso vielleicht?
an welcher Stelle in meinem Post könnte ich unrecht haben?

von Rolf D. (rolfdegen)


Lesenswert?

Joachim B. schrieb:

> Du postest viel aber immer zu knapp, wer der nicht deine Gedanken kennt
> soll dir folgen, stelle dir einfach vor du zeigst deine letzten 2 beiden
> Postings jemand anderen, glaubst du er weiss wovon die Rede ist?


Ich meine diesen Beitrag.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Auf das hier.

ja und wo ist MEIN Fehler auf dem ich nur vielleicht Recht habe?
was ja impliziert das ich doch nicht Recht habe.

von Rolf D. (rolfdegen)


Lesenswert?

Ich trink jetzt mal ein Käffchen und schau mir Alles in Ruhe noch mal an 
:)

Was bedeutet denn jetz "plenken" ?

Übrigens.. Nachmals vielen Dank für deine gute Ünterstützung und Tipps. 
Das gleiche gilt auch für die anderen User hier aus dem Forum.

Man lernt doch nie aus ;)

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Was bedeutet denn jetz "plenken" ?

findet man auch wo anders

> Übrigens.. Nachmals vielen Dank für deine gute Ünterstützung und Tipps.

und ich kassiere wie immer darauf MINUS, oh man das Bewertungssystem ist 
echt sooo bescheuert, aber viel Feind, viel Ehr!

OK ich sollte alles NEGATIVE stets nur noch invertieren

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Rolf D. schrieb:
> Was bedeutet "plenken" ?
Ein Leerzeichen vor einem Satzzeichen nennt man 'Plenken'.

Dein Projekt finde ich übrigens spannend. Die ELV-Hardware wäre eine 
interessante Grundlage für einen Eigen(nach)bau eines Labornetzteils.
Bei Netzteilen ist es ja ein bisschen wie mit Geld: Wann hat man schon 
zu viel davon?

@Joachim
Etwas mehr Konzilianz würde evtl. weniger Minüsse nach sich ziehen...

von Joachim B. (jar)


Lesenswert?

Erwin E. schrieb:
> @Joachim
> Etwas mehr Konzilianz würde evtl. weniger Minüsse nach sich ziehen..

ich bin kon­zi­li­ant, nur wenn ich als Doofi hingestellt und ignoriert 
werde juckt es mich gelegentlich schon!

siehe...ach egal!
Rolf D. schrieb:
> Ja.. Du hast da vielleicht Recht.

ich habe Recht, nicht nur vielleicht!

und hier?
Beitrag "Re: einfache USB-Fernbedienung"

IRMP ist geil, auch ohne 433MHz Empfänger weil es nur Software ist die 
auch ohne 433MHz Empfänger arbeitet.

Da kann man schon mal aus der Haut fahren!

Joachim B. schrieb:
> Du postest viel aber immer zu knapp,

zu dem stehe ich absolut und muss man wirklich "plenken" hier erfragen 
und beantworten?
Kann ein TO nicht mal selber nachschauen?

Warum sind wir hier schon bei 160 Beiträge?
Warum stehen alle notwendigen Infos so verteilt?

oder dieser Thread
Beitrag "ESP32 Dev Kit Betriebsspannung"

warum wird über die Eingangsspannung diskutiert, 12V hat der Regler so 
verbaut mit dem Strom und der Leistung nicht verkraftet!

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Erwin E. schrieb:

> Dein Projekt finde ich übrigens spannend.

Sehe ich genauso und schaue deshalb hin & wieder rein.

> @Joachim

> Etwas mehr Konzilianz ...

Ist immer anzuraten.

Hier ist ein ruhiger Thread und so sollte es auch bleiben.

von eProfi (Gast)


Lesenswert?

> OCR1A = Digi_offset + (((uint32_t)Usoll * u_factor) >> 16) +
>  (((uint32_t)Usoll * u_factor) >> 15) & 1;
Da brauchen wir noch mehr Klammern, und das (uint32_t) kann weg:
  OCR1A = Digi_offset + ((Usoll * u_factor) >> 16) +
          (((Usoll * u_factor) >> 15) & 1);
Die Idee ist genau wie oben: das um 15 nach rechts geschobene Bit hat 
die Wertigkeit 0,5.
Wenn das gesetzt ist, addieren wir noch eine Eins "das Bit eben" dazu.

Evtl. kann es schneller sein, das Bit direkt abzufragen:
merk32 = Usoll * u_factor;
round8 = ((uint16_t)(merk32) & 0x8000)?1:0;
OCR1A  = Digi_offset + (uint16_t)(merk32 >> 16) + round8;

Ich würde ja die 32-Bit-Variablen als Struct definieren und auf die 
einzelnen Bytes direkt zugreifen, auch weil wir ja nie 
32x32-Bit-Multiplikationen brauchen. Für 16x16-->32 Mult braucht man nur 
4 Bytes miteinander multiplizieren. So ähnlich wie ich es hier gemacht 
habe:
Beitrag "Rechnen mit AVR"
Ich weiß nicht, welcher Compiler so schlau ist und das berücksichtigt.

von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> Ich weiß nicht, welcher Compiler so schlau ist

bis jetzt konnte man den GCC eigentlich vertrauen, aber natürlich kann 
man mit pure ASM noch einiges rausholen, fragt mal c-hater :)
Ich frage mich manchmal auch warum immer alle Register auf den Stacl 
gesichert werden obwohl ich vielleicht gerade keine nun davon nutze, 
aber ich bin ja nicht so tief im System und musste mich bis jetzt nie 
mehr auf ASM Ebene begeben, früher (TM) musste man öfter als Platz noch 
knapper war und Compiler mies waren.

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen.. Da bin ich wieder :)

Meine sportliche Übung für Heute ist geschafft (45KM Rad gefahren). Mit 
60 muss man was für die Figur tun ;)

Danke für das Interesse an meinem Projekt. Ich bemühe mich immer wieder, 
ein Thema interessant zu gestalten. Ab und an geraten die Dinge bei mir 
mal etwas durcheinander, weil man viele Infos bekommt und es gleich 
ausprobieren möchte. Aber aus Problemen und Lösungen lerne ich immer 
wieder und vielleicht hat es für den Einen oder Anderen auch etwas 
geistigen Nährwert.

Martin schrieb:
> Hier ist ein ruhiger Thread und so sollte es auch bleiben.

Ich bin ein friedlicher und ruhiger Mensch ;)

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Neuer Tag, neues Problem :(

Das Problem ist eine kleine Messwertschwankung, wenn ich den Encoder 
oder die Tasten betätige. In der Regel dürfte das nicht auftreten, da 
die Messwerterfassung durch einen (TIMER2_OVF_vect) Interrupt und in der 
4.Messphase durch den externen (PCINT0_vect) Interrupt gesteuert wird. 
Encoder und Tasten werden in einer Schleife im Hauptprogramm abgefragt.

Ich habe die Messwerterfassung in 4 Phasen gegliedert.

1.Phase (löschen des ADC Integrators)
Das Flag "Timer2_run_flag" auf 1 setzen. Den Timer2 initialisieren und 
starten. Mit dem löschen des ADC integrators beginnen. Zurück zum 
Hauptprogramm springen und Encoder und Tasten abfragen.

2.Phase (ADC Integrator aufladen)
Wenn das "Timer2_run_flag" nach Ablauf der Entladezeit (OCR2B) durch den 
(TIMER2_OVF_vect) Interrupt auf 0 gesetzt wurde, dann den Timer2 neu 
initialisieren und das "Timer2_run_flag" auf 1 setzen. Timer2 starten 
und mit dem Aufladen des ADC integrators beginnen. Zurück zum 
Hauptprogramm springen und Encoder und Tasten abfragen.

3.Phase (ADC Integrator entladen und Zeit messen)
Wenn "Timer2_run_flag" durch den (TIMER2_OVF_vect) Interrupt auf 0 
gesetzt wurde, dann den Timer2 neu initialisieren und das 
"Timer2_run_flag" und "ADW_flag" auf 1 setzen. Jetzt mit dem Entladen 
des ADC integrators beginnen. Zurück zum Hauptprogramm springen und 
Encoder und Tasten abfragen.

4.Phase (Messwerte anzeigen)
Wenn das "Timer2_run_flag" durch den (PCINT0_vect) Interruppt auf 0 
gesetzt wird, dann aktuellen Messwert zB Volt, Ampere oder Temperatur 
anzeigen. Danach Flags und Messphase löschen. Zurück zum Hauptprogramm 
springen und Encoder und Tasten abfragen.

Im Anhang das Programm. Leider bin ich noch nicht dahinter gekommen, was 
die Ursache für die Messwertschwankung sein könnte.

Die Benutzung der Timer ist wie folgt. Timer0 steuert am OCR0A Ausgang 
den Fan. Timer1 steuert an seinen Ausgängen OCR1A und OCR1B die 14Bit 
PWM für Spannung und Strom. Timer2 ist für die Messwerterfassung 
zuständig.

Die delay_ms() Funktion aus der Library habe ich nicht benutzt, weil ich 
mir nicht sicher bin, ob sie einen Timer benutzt.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Die Ursache ist vermutlich die Wartezeit zwischen den einzelnen 
Mess-Phase und das Umschalten des ADC-Muxers IC6.

Da es durch die Tastatur und Encoder Abfragen im Hauptprogramm zu 
kleinen Zeitverzögerungen beim Umschalten der Mess-Phasen kommen kann, 
wird keine genaue Integrationszeit des ADC-Integrators erreicht.

Um zu verhinder, dass der Integrationskondensator C49 nach einem Timer2 
Interrupt sich weiter auflädt oder entlädt, habe ich jetzt den ADC-Muxer 
in den Interrupt Routinen gesperrt.


1
//*************************************************************************
2
// Timer2 Overflow interrupt for measurement results
3
//*************************************************************************
4
ISR (TIMER2_OVF_vect)
5
{   
6
  OCR2B++;
7
  
8
  if (OCR2B == 48 && ADW_flag == 0){
9
    TCCR2B &= ~((1<<CS00) | (1<<CS01));  // stopp timer and disabled ADC
10
    PORTD |= ((1 << ADC_AD0) | (1<<ADC_AD1) | (1<<ADC_AD2));
11
    Timer2_run_flag = 0;
12
    }
13
}
14
15
//*************************************************************************
16
// Meassurement interrupt from ADW-Pin
17
//*************************************************************************
18
ISR(PCINT0_vect)
19
{
20
  //  fallende Flanke
21
  if (!(PINB & (1<<PB0))) {
22
    TCCR2B &= ~((1<<CS00) | (1<<CS01));  // stopp timer and disabled ADC
23
    PORTD |= ((1 << ADC_AD0) | (1<<ADC_AD1) | (1<<ADC_AD2));
24
    Timer2_run_flag = 0;
25
    }
26
}

Gruß Rolf

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

Der LCD-Controller könnte ein S3C72P9 sein:
https://datasheet.iiic.cc/datasheets-1/samsung_semiconductor_division/S3P72P9-QX.pdf

The S3C72P9 single-chip CMOS microcontroller has been designed for high 
performance using Samsung's newest 4-bit CPU core, SAM47 (Samsung 
Arrangeable Microcontrollers).
With an up-to-896-dot LCD direct drive capability, flexible 8-bit and 
16-bit timer/counters, and serial I/O interface, the S3C72P9 offers an 
excellent design solution for a wide variety of applications which 
require LCD functions.
Up to 39 pins of the 100-pin QFP package can be dedicated to I/O. Eight 
vectored interrupts provide fast response to internal and external 
events. In addition, the S3C72P9's advanced CMOS technology provides for 
low power consumption and a wide operating voltage range.
The S3C72P9 is made by shrinking the KS57C21516. The S3C72P9 is 
comparable to KS57C21516, both in function and in pin configuration 
except that S3C72P9 have a 32,768 ×8-bit ROM, 1056×4-bit RAM, 12 common 
selectable and LCD contrast control function.
OTP
The S3C72P9 microcontroller is also available in OTP (One Time 
Programmable) version, S3P72P9. S3P72P9 microcontroller has an on-chip 
32K-byte one-time-programmable EPROM instead of masked ROM. The S3P72P9 
is comparable to S3C72P9, both in function and in pin configuration.


Er hat zwar "EPROM read protection", aber man könnte versuchen, ihn 
auszulesen. Aber wer will das disassemblieren?

Danke Rolf für Dein Durchhaltevermögen.

von Rolf D. (rolfdegen)


Lesenswert?

Hallo eProfi

Danke für den Link. Wie gut das ich am Anfang eine Teilanalyse der 
seriellen Daten vom ATmega88 zum LCD Controller gemacht habe. Das hat 
mir bei der Softwareentwicklung für das Netzteil viel Zeit erspart. 
Sonst hätte ich mich zusätzlich noch mit der Programmierung eines LCD 
Controllers beschäftigen müsse.

Zur Zeit entwickel ich noch eine Kalibrier Funktion für die Spannungs- 
und Strommessung. Ferner ist mir aufgefallen, dass die Spannung bei 
steigender Temperatur etwas sinkt.

Messung unter Belastung von 30V/A3. Bis 30'C ist alles stabil. Bei 70'C 
und 10 minütiger Belastung habe ich eine Abweichung von -0,2V am Ausgang 
festgestellt. Das muss ich dann auch noch irgendwie kalibrieren.

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Zur Zeit entwickel ich noch eine Kalibrier Funktion für die Spannungs-
> und Strommessung. Ferner ist mir aufgefallen, dass die Spannung bei
> steigender Temperatur etwas sinkt.

wie sehen jetzt die Wertepaare aus? (mV/ADC)

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Joachim

Ich habe jetzt zwei Werte Gruppen ermittelt. Der Digitale Offset ist bei 
allen gleich.

Digital offset = 133

y1 = 1.0007V    x1 = 512   counts + offset
y2 = 30.001V    x2 = 15419 counts + offset

y1 = 5.0010V    x1 = 2567  counts + offset
Y2 = 27.004V    x2 = 13878 counts + offset

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Zum Vergleich mit dem PPS5330 Netzteil habe ich ein anderes 
Labornetzteil (SPD3303X von Siglent) getestet. Ich habe das Siglent 
Netzteil eingeschaltet und die Spannung auf 1.000V eingestellt. Die 
unbelastete Ausgangsspannung hatte nach dem Einschalten eine Spannung 
von 1.0011V.  Nach 20 Minuten hat sich die Ausgangsspannung auf 0.9985V 
stabilisiert (1.Bild).

Danach habe ich die Spannung auf 30.000V eingestellt und 20 Minuten lang 
mit 3A belastet. Die Ausgangsspannung sank kurz nach dem Teststart von 
30.003V auf 29.971V und stabilisierte sich dann wieder auf 29.975V 
(2.Bild).

Das gleiche Szenario habe ich dann mit dem PPS5330 Netzteil 
durchgeführt. Die unbelastete Ausgangsspannung sank nach 20 Minuten 
unwesentlich von 1.0016V auf 1.0014V (3.Bild).  Unter Belastung sank die 
Ausgangsspannung aber merklich. Innerhalb von 20 Minuten von 30.003V auf 
29.837V (4.Bild). Die Temperatur am Kühlkörper stieg mit offenem Gehäuse 
während des 20minütigen Tests von 27'C auf über 46'C an.

Der Test hat gezeigt, dass im Vergleich zum Siglent Netzteil, die 
Ausgangsspannung des PPS5330 Netzteils unter sehr hoher Belastung und 
bei steigender Temperatur nicht stabil ist. Das muss ich dann in der 
Software anhand der ausgelesenen Temperaturwerte kompensieren. Leider 
fehlt mir da der direkte Vergleich mit der Original Software und den 
Messwerten.

Mit meinem Multimeter (UNI-T UT181A) habe ich die Messwerte 
protokolliert. Das Multimeter habe ich 20 Minuten vor der Messung 
eingeschaltet. Es hat eine DC Ungenauigkeit von <0.025% und 60000 
counts.

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Der Digitale Offset ist bei
> allen gleich.

dann hast du es offensichtlich richtig gemacht und meine Erklärung gut 
umsetzen können, das freut mich.
War doch nicht so schwer oder?

Rolf D. schrieb:
> die
> Ausgangsspannung des PPS5330 Netzteils unter sehr hoher Belastung und
> bei steigender Temperatur nicht stabil ist.

das bekommst du auch noch hin, kannst ja Kennlinien aufnehmen und sogar 
die Kennlinienverschiebung mit der Temperatur berücksichtigen, also m 
und b zu einer Temperatur ermitteln.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallo Joachim

Ja Danke. Den Spannungsverlust bei hohen Temperaturen will ich noch 
kompensieren. Dann bin ich fast fertig.

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Hallo Joachim

geht doch, trotz einiger Störfeuer und Mißtöne in der Zwischenzeit.

Beitrag #6395160 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich habe ein kleines Video gedreht um die Auflösung und Genauigkeit der
Ausgangspannung im PPS5330 Netzteil zu demonstrieren. Der eingebaute
AD-Wandler hat eine Auflösung von 14Bit. Macht bei 30.00V eine maximale
Auflösung von 1.8mV.

Link: https://youtu.be/ACEmlj7E1N0

von Parcel Weich-Statistski (Gast)


Lesenswert?

Rolf D. schrieb:
> Hallöchen..
>
> Ich habe ein kleines Video gedreht um die Auflösung und Genauigkeit der
> Ausgangspannung im PPS5330 Netzteil zu demonstrieren.

Spannend bis zum Ende. Der Hauptdarsteller erweist sich als Könner in 
seinem Fach und auch der Regisseur hatte eine Sternstunde.

Wann ist Kino-Premiere?

😀

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Danke. Aber ein wenig ist noch zu tun. Die Temperaturkompensation muss 
ich noch programmiere und das Speichern und Abrufen der Sollwerte im 
EEPROM.

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> muss
> ich noch programmiere und das Speichern und Abrufen der Sollwerte im
> EEPROM.

echt?

wie oft willst du speichern?
Ein Konzept damit das EEPROM länger hält?

Im Zweifel würde ich ja ein FRAM wählen, oder ein I2C EEPROM im DIL 
Sockel zum leichter tauschen!

von Rolf D. (rolfdegen)


Lesenswert?

Die Sollwert-Vorgaben werden mit der Taste "Memory" im 512 Byte großen 
EEPROM des Atmega88 gespeichert. Das Aufrufen der gespeicherten 
Sollwert-Vorgaben erfolgt mit der Taste „Recall“ und dem Encoder für die 
Auswahl der Programm-Nummer.

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Die Sollwert-Vorgaben werden mit der Taste "Memory" im 512 Byte großen
> EEPROM des Atmega88 gespeichert.

wie oft?
ich würde ja sowas o.ä. wählen
https://www.adafruit.com/product/1895

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Das EEPROM im ATmega88 lässt sich 10.000 mal beschreiben. Insgesammt 
stehen 16 Speicherplätze für Sollwert-Vorgaben zur Verfügung.

Das Abspeichern der aktuell eingestellten Sollwert für Spannung und 
Strom erfolgt mit der Taste „Memory“ durch den Benutzer. Das Aufrufen 
von Sollwert-Vorgaben erfolgt mit der Taste „Recall“. Die 
Speicherplatz-Nummer kann mit dem Encoder ausgewählt werden. Mit "Enter" 
werden die Vorgaben übernommen.

Gruß Rolf

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Das Abspeichern der aktuell eingestellten Sollwert für Spannung und
> Strom erfolgt mit der Taste „Memory“ durch den Benutzer.

OK dann könnte das reichen, aber trotzdem sind mir EEPROMs zum Speichern 
von veränderlichen Daten mittlerweile unsympatisch weil endlich!

Rolf D. schrieb:
> Das EEPROM im ATmega88 lässt sich 10.000 mal beschreiben

war das nicht ein eingelötetes SMD?
also nicht mal Tausch leicht möglich?

von Rolf D. (rolfdegen)


Lesenswert?

Ja. Im Netzteil sitzt ein ATmega88 als 32 TQFP Bauform. Mit einer 
Heißluftpistole lässt sich der Chip aber leicht auslöten und ersetzen.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Die Temperaturkompensation im Netzteil funktioniert jetzt. Muss das aber 
im Code noch etwas nachbessern. Das Ganze ist etwas zahlenlastig aber es 
funktioniert. Ein Video dazu gibts später.

Nebenbei: Ein neues spannendes Projekt steht auch schon in den 
Startlöchern. Es ist ein DIY Synth mit Teeny 4.0 Board im Shruthi Gewand 
mit 16Bit Sound echten Wafetables und analogen Filtern.

Werde hier im Forum drüber berichten.

Gruß Rolf

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

Ich habe jetzt extra wegen dieses Threads ein solches gebrauchtes Gerät 
gekauft und werde berichten, ob die original-Software die 
Temperaturkompensation macht.
Dann kann man sich auch auf die Suche nach der Ursache begeben.
Außerdem will ich den genauen Zusammenhang DAC-Wert-Ausgangsspannung 
analysieren.
Und bei Deinen Sythi-Projekten lese ich ebenfalls sehr interessiert mit.
Danke dafür!

von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> Ich habe jetzt extra wegen dieses Threads ein solches gebrauchtes Gerät
> gekauft und werde berichten, ob die original-Software die
> Temperaturkompensation macht.

dann wäre evtl. hilfreich:

Rolf D. schrieb:
> Ich habe eine Bitte. Durch einen dummen Fehler am SPI Port des ATmega88
> habe ich die Firmware des PPS 5330 geschrottet. Das Auslesen des
> ATmega88 mit einem DIAMEX ALL AVR Programmer funktioniert zwar, aber das
> Hexfile binhaltet nur Datenmüll (siehe Anhang). Kann mir vielleicht
> jemand helfen ?

Melchior schrieb:
> - Konntest du die Originalfirmware auslesen und sichern?

von branadic (Gast)


Lesenswert?

Fehlt eigentlich nur noch eine PC-Schnittstelle am Netzteil, damit es 
auch als PC-programmierbares Netzteil einsetzbar ist.

-branadic-

von Joachim B. (jar)


Lesenswert?

branadic schrieb:
> Fehlt eigentlich nur noch eine PC-Schnittstelle am Netzteil

auch das wäre leicht nachzurüsten, mit Tausch des ATmega88p zu 328p ist 
auch reichlich mehr Platz vorhanden

Rolf D. schrieb:
> Ja. Im Netzteil sitzt ein ATmega88 als 32 TQFP Bauform. Mit einer
> Heißluftpistole lässt sich der Chip aber leicht auslöten und ersetzen.

meint der TO

von Rolf D. (rolfdegen)


Lesenswert?

eProfi schrieb:
> Ich habe jetzt extra wegen dieses Threads ein solches gebrauchtes Gerät
> gekauft und werde berichten, ob die original-Software die
> Temperaturkompensation macht.
> Dann kann man sich auch auf die Suche nach der Ursache begeben.
> Außerdem will ich den genauen Zusammenhang DAC-Wert-Ausgangsspannung
> analysieren.
> Und bei Deinen Sythi-Projekten lese ich ebenfalls sehr interessiert mit.
> Danke dafür!

Ja das ist eine gute Idee. Vielleicht kannst du auch den Programmcode 
auslesen. Ich habe das am Anfang leider vermasselt :(

Zur Temperaturschwankung: Die Referenzspannung für den ADC wird in der 
Schaltung durch einen LM385 2.5V erzeugt. Laut Datenblatt hat dieser 
Baustein eine Toleranz von +- 0.8% (+- 20mV).

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

branadic schrieb:
> Fehlt eigentlich nur noch eine PC-Schnittstelle am Netzteil, damit es
> auch als PC-programmierbares Netzteil einsetzbar ist.
>
> -branadic-

Für diese Funktion muss dann aber ein größerer Mikrocontroller größerem 
Flash und mit mehr IO-Leitungen verwendet werden. Am ATmega88 im 
Netzteil sind leider alle Leitungen belegt. Und die 8KB Flash sind schon 
sehr knapp bemessen.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Rolf D. schrieb:
> eProfi schrieb:
>> Ich habe jetzt extra wegen dieses Threads ein solches gebrauchtes Gerät
>> gekauft und werde berichten, ob die original-Software die
>> Temperaturkompensation macht.
>> Dann kann man sich auch auf die Suche nach der Ursache begeben.
>> Außerdem will ich den genauen Zusammenhang DAC-Wert-Ausgangsspannung
>> analysieren.
>> Und bei Deinen Sythi-Projekten lese ich ebenfalls sehr interessiert mit.
>> Danke dafür!
>
> Ja das ist eine gute Idee. Vielleicht kannst du auch den Programmcode
> auslesen. Ich habe das am Anfang leider vermasselt :(
>
> Zur Temperaturschwankung: Die Referenzspannung für den ADC wird in der
> Schaltung durch einen LM385 2.5V erzeugt. Laut Datenblatt hat dieser
> Baustein eine Toleranz von +- 0.8% (+- 20mV).


Siehe Schaltbild

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Rolf D. schrieb:
> Zur Temperaturschwankung: Die Referenzspannung für den ADC wird in der
> Schaltung durch einen LM385 2.5V erzeugt. Laut Datenblatt hat dieser
> Baustein eine Toleranz von +- 0.8% (+- 20mV).

Ob der LM385 alleine für das Absinken der Ausgangsspannung bei hohen 
Temperaturen verantwortlich ist, kann ich nicht mit Sicherheit sagen. 
Der SMD Baustaustein sitzt vorne am rechten Rand auf der Rückseite der 
Netzteil Platine (siehe Bild).

von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Siehe Schaltbild

es ist wirklich traurig,

3 Beiträge innerhalb einer Stunde!
 07.09.2020 15:36
 07.09.2020 15:48
 07.09.2020 15:52

Das bläht den Thread nur unnötig auf!

Nur falls du es noch nicht weisst, innerhalb einer Stunde ohne andere 
Antworten dazwischen kann man seinen eigenen Beitrag noch editieren!

Falls du Angst hast das dann die letzte Antwort keiner mitbekommt dann 
geht das so:

Letzen Beitrag Text kopieren in einen Texteditor!
Letzen Beitrag löschen
Dann
Letzen Beitrag (ehemals vorletzter Beitrag) Text kopieren in den  Editor 
passend davor einsortieren!
Letzen Beitrag löschen

usw.
bis zum letzten deiner Beiträge,

einen neuen Beitrag erstellen, alle bekommen Bescheid und alles steht in 
einem Beitrag!

mal ehrlich 194 Beiträge für nichts was es nicht auch in 100 gepasst 
hätte!

Meine Hochachtung für deine Tätigkeit hast du, aber nicht für die 
Forennutzung

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Rolf D. schrieb:
> Rolf D. schrieb:
>> Zur Temperaturschwankung: Die Referenzspannung für den ADC wird in der
>> Schaltung durch einen LM385 2.5V erzeugt. Laut Datenblatt hat dieser
>> Baustein eine Toleranz von +- 0.8% (+- 20mV).
>
> Ob der LM385 alleine für das Absinken der Ausgangsspannung bei hohen
> Temperaturen verantwortlich ist, kann ich nicht mit Sicherheit sagen.
> Der SMD Baustaustein sitzt vorne am rechten Rand auf der Rückseite der
> Netzteil Platine (siehe Bild).

Ein Bild ergänzt.

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Würde man auf Basis des ELV-Netzteils eine eigene Variante bauen, wäre 
es dann vorteilhaft, für die ADC und DAC fertige, integrierte Wandler 
einzusetzten? Oder sind die Wandler wie sie ELV hier nutzt, für den 
Zweck 'gut genug'?
Der Preis für 'richtige' DAC/ADC würde beim Selbstbau, anders als beim 
Seriengerät, schließlich keine große Rolle spielen.

von Rolf D. (rolfdegen)


Lesenswert?

Joachim B. schrieb:
> Nur falls du es noch nicht weisst, innerhalb einer Stunde ohne andere
> Antworten dazwischen kann man seinen eigenen Beitrag noch editieren!

Ja.. Das ist mein Problem ;)

von Rolf D. (rolfdegen)


Lesenswert?

Erwin E. schrieb:
> Würde man auf Basis des ELV-Netzteils eine eigene Variante bauen, wäre
> es dann vorteilhaft, für die ADC und DAC fertige, integrierte Wandler
> einzusetzten? Oder sind die Wandler wie sie ELV hier nutzt, für den
> Zweck 'gut genug'?
> Der Preis für 'richtige' DAC/ADC würde beim Selbstbau, anders als beim
> Seriengerät, schließlich keine große Rolle spielen.

Bei 16Bit könnte man die Ausgangspannung auf ein mV genau einstellen. 
Das ist mit dem 14Bit Wandler und der PWM Ansteuerung im PPS5330 
Netzteil leider nicht möglich.

Auflösung bei 16Bit: 30V/65536 = 0,00045V
Auflösung bei 14Bit: 30V/16384 = 0,00183V

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Ja.. Das ist mein Problem ;)

lesen könnte helfen:

Joachim B. schrieb:
> Nur falls du es noch nicht weisst, innerhalb einer Stunde ohne andere
> Antworten dazwischen kann man seinen eigenen Beitrag noch editieren!
>
> Falls du Angst hast das dann die letzte Antwort keiner mitbekommt dann
> geht das so:
>
> Letzen Beitrag Text kopieren in einen Texteditor!
> Letzen Beitrag löschen
> Dann
> Letzen Beitrag (ehemals vorletzter Beitrag) Text kopieren in den  Editor
> passend davor einsortieren!
> Letzen Beitrag löschen
>
> usw.
> bis zum letzten deiner Beiträge,
>
> einen neuen Beitrag erstellen, alle bekommen Bescheid und alles steht in
> einem Beitrag!

Beitrag #6396555 wurde von einem Moderator gelöscht.
von eProfi (Gast)


Lesenswert?

zu den belegten Ports:
ELV ist mit den Pins recht verschwenderisch umgegangen, jede Taste ein 
Pin.
Das kann man multiplexen oder mit einem Port-Extender erledigen.
Serielle kommt unbedingt, zur Not mache ich das.
Hat jemand Vorschläge zum Protokoll?

PCINT16 RXD PD0 IC200/30 Stecker ST200/12 (Regler=Signal ob U oder I 
begrenzt)
PCINT17 TXD PD1 IC200/31 Taster  TA206 (Recall)

Ich bringe das auch in die 8kB unter, den Code kann man noch kompakter 
schreiben.
Wir pimpen das Ding ;-9

Zum Auslesen des Codes:  da habe ich wenig Hoffnung, dass der Hersteller 
vergessen hat, die Fuses entwprechend zu setzen.

von Klaus R. (klaus2)


Lesenswert?

Tasten umverdrahten, auslesen per ADC...dirty aber maximaler Pingewinn.

Klaus.

von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> Das kann man multiplexen oder mit einem Port-Extender erledigen.
> Serielle kommt unbedingt, zur Not mache ich das.
> Hat jemand Vorschläge zum Protokoll?

PeDas
per Timer Interrupt auch für Matrix geeignet
um wieviel Tasten geht es denn?
nur je weniger Tasten umso weniger nutzt Multiplex, eine I2C Tastatur 
mit PCF8574(a) habe ich erfolgreich eingesetzt, 8 Tasten direkt ohne 
Matrix im Timer IRQ gelesen und entprellt, PCF lesen irgendwas um 1.5µs, 
kein Beinbruch bei 10ms Timer IRQ, sogar IRMP Befehle kann ich noch 
verarbeiten.
Interrupt auf 15000/s in IRMP, dann bis 150 zählen -> 10ms und in die 
Entprellroutine, wer mag setzt einen Marker und gibt den IRQ noch mal in 
der 10ms frei um weitere IRMP entgegenzunehmen.

von Rolf D. (rolfdegen)


Lesenswert?

Im PPS5330 Netzteil gibt es 7 Tasten. Dafür würde ein 74HC165 
Schieberegister (parallel in seriell out) ausreichen.

Gruß Rolf

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Rolf D. schrieb:
> Im PPS5330 Netzteil gibt es 7 Tasten. Dafür würde ein 74HC165
> Schieberegister (parallel in seriell out) ausreichen.

Würdest du so eine Änderung an deinem vorhandenen Netzgerät oder bei 
einem zweiten, vollständig selbst konstruierten Gerät machen?
Im zweiten Fall würde sich ja gleich ein größerer Controller anbieten 
und natürlich ein anderes Display. Zur Messung der Temperatur(en) 
könnten digitale Sensoren benutzt werden. Ein zweiter Drehgeber wäre 
auch gut.

von Joachim B. (jar)


Lesenswert?

Erwin E. schrieb:
> Im zweiten Fall würde sich ja gleich ein größerer Controller anbieten

ich dachte auch an ATmega 1284p, wenn schon denn schon und immerhin 2 
serielle und Platz für alles inkl. Fernbedienung

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Joachim B. schrieb:
> ich dachte auch an ATmega 1284p, wenn schon denn schon und immerhin 2
> serielle und Platz für alles inkl. Fernbedienung

Oder doch 'nur' ein 328PB? Wobei man sich ja erst dann auf den 
Controller festlegen kann und muss, wenn die Hardware festgezurrt ist.

Eine 'Fernbedienung' wäre klasse. Nützlich finde ich diese aber nur mit 
einer guten PC-Software. Mein TDK ist per RS232 fernsteuerbar, die 
verfügbare Software bietet aber nichts außer der Einstellung von U und 
I. Das kann ich auch direkt am Gerät - genau einmal angeschaut, dann nie 
wieder benutzt.

von Rolf D. (rolfdegen)


Lesenswert?

Kann nichts ins EEPROM des ATmega88 schreiben. Steht immer nur Mist drin 
:(

Weis jemand Rat ?
1
//*************************************************************************
2
// EEPROM write
3
//*************************************************************************
4
void EEPROM_write(unsigned int adress, char data)
5
{
6
  /* Warten bis vorheriger Schreibvorgang beendet */
7
  while(EECR & (1<<EEPE));
8
9
  EEAR = adress; // Adresse an der das Byte im EEPROM geschrieben werden soll
10
11
  EEDR = data;   // Datenbyte, welches im EEPROM gespeichert werden soll
12
13
  EECR &=~ (1<<EEPM0); // Erase and Write in one Operation (siehe Datenblatt Programming Mode)
14
15
  EECR &=~ (1<<EEPM1);
16
17
  EECR |= (1<<EEMPE);
18
19
  EECR |= (1<<EEPE); // Starte EEPROM Write
20
}


Ich habe das davor mit dieser Funktion gemacht. Aber da kann ich keine 
Adressen übergeben.
1
eeprom_write_word (&eeFooWord, myByte);

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Ich habe das davor mit dieser Funktion gemacht. Aber da kann ich keine
>Adressen übergeben.

Warum nimmst du nicht einfach den funktionierenden Code aus dem 
Datenblatt?

MfG Spess

von Rolf D. (rolfdegen)


Lesenswert?

Problem gelöst. Hatte mal wieder das alte Problem mit Pointern und 
Adressen. Das schmeiße ich immer durcheinander ;)

So ist es richtig. Jetzt kann ich im Programm die EEPROM-Adressen ohne 
Problem adressieren.
1
uint16_t * eeAddr = 0;
2
eeprom_write_word(eeAddr, Ulimit)

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Ich muss noch ein paar kleine Fehler beseitigen (siehe Video) und dann 
bin ich fertig :)

Die Temperaturanzeige habe ich wie folgt programmiert. Wenn kein Strom 
fließt wird auf dem Display die Spannung, Strom und Temperatur 
angezeigt. Wenn ein Strom fließt wird die Temperatur alternierend mit 
der Leistung in Watt angezeigt.

Es können jetzt 16 Sollwerte Vorgaben für Spannung und Strom im EEPROM 
des ATmega88 abgespeichert werden. Mit der Taste "Memory" wird die 
Speicherfunktion aufgerufen und das "Memory" Symbol mit der 
Programmnummer wird angezeigt. Gleichzeitigt fängt die Programmnummer an 
zu blinken. Jetzt kann mit dem Encoder eine Programmnummer ausgewählt 
werden mit der die Sollwert-Vorgaben gespeicher werden. Mit der "Enter" 
Taste werden die Werte in das EEPROM geschrieben und die "Memory" 
Funktion beendet.

Das gleiche gilt für das Aufrufen von Sollwert-Vorgaben mit der "Recall" 
Taste. Mit dem Encoder wird die Programmnummer ausgewählt und mit 
"Enter" die Sollwert-Vorgaben geladen und die "Recall" Funktion beendet.

In einem Beitrag habe ich falsche Angaben über die Anzahl der 
Schreibzyklen auf das interne EEPROM im ATmega gemacht. Laut Datenblatt 
sind es keine 10.000 sondern 100.000 Schreibzyklen.


Kleines Video: https://youtu.be/3XXFefjjd7o

Gruß Rolf

: Bearbeitet durch User
von Holger D. (hodoe)


Lesenswert?

Hallo, schöner Hack und Gratulation, dass Du es trotz der Ignoranz der 
Logabirumer-Edelelektronik-Schmiede hinbekommen hast. Eine 
Temperaturanzeige ist für mich persönlich nicht interessant, aber ich 
habe die Beiträge doch mit Interesse verfolgt und fand diese Arbeit sehr 
unterhaltsam und anregend!

Gruß
Holger

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Wie stabil lassen sich eigentlich kleine Ströme einstellen? Z.B. werden 
8mA als Sollwert vorgegeben, bleibt der Strom dann konstant oder 
schwankt/driftet er weg? Oder regelst du die Drift per Software nach?
Was mich auch interessieren würde ist, wie schnell die 
Ausgangsspannungen/-ströme verändert werden können.

von Rolf D. (rolfdegen)


Lesenswert?

@Holger.
Danke :)

@Erwin
Ich werde ein paar Messungen durchführen und dann berichten. Ich hab mal 
einen Strom- und Spannungstest mit einer LED gemacht. Dabei habe ich die 
Spannung auf 10V eingestellt und den Strom auf 20mA. Die LED hats 
überlebt ;)

Gruß Rolf

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Ich spiele mit dem Gedanken, das Gerät nachzubauen. 'Natürlich' mit 
einigen Änderungen/Ergänzungen.
Angefangen habe ich damit, den ELV-Schaltplan in Eagle zu übernehmen. 
Der Analogteil ist im Prinzip fertig (der Schaltplan, nicht die 
Platine), über den Teil mit dem Controller denke ich noch nach. 
Vermutlich werde ich einen Atmega328PB einsetzten, DAC/ADC und ein 
Display mit ILI9341. Man wird sehen. Das gibt aber einen eigenen Thread, 
deinen möchte ich nicht kapern.

von eProfi (Gast)


Lesenswert?

> Dabei habe ich die Spannung auf 10V eingestellt und den Strom auf 20mA.
> Die LED hats überlebt ;)
Ein vernünftiges Labornetzteil hat eine kleine Kapazität am Ausgang, 
damit solche Experimente nicht schief gehen ::
Erwin, da würde ich eher bei den Profis abschauen als bei ELV (47µF).

Rolf, interessiert dich eine PC-Schnittstelle nicht?
Kennlinien aufnehmen und so...

Meins kommt voraussichtlich morgen - freu.

von Rolf D. (rolfdegen)


Lesenswert?

Hi Erwin :)

Die Idee finde ich sehr gut. Bin gespannt auf dein Projekt. Mein 
Programmcode für das Netzteil ist Open Source und wenn du willst kannst 
du oder andere ihn gerne benutzen oder ändern.

Der Einsatz eines 14Bit oder 16Bit DA/AD-Wandlers ist ein Vorteil 
bezüglich schneller und Regelung und störungsfreie Ausgangsspannung. Im 
PPS5330 arbeitet ein langsamer 14Bit AD-Wandler nach dem Prinzip des 
Zwei-Rampen-Wandlers (Dual-Slope). Für die Regelung von Strom und 
Spannung wird eine 14Bit PWM Steuerspannung geringer Taktfrequenz 
benutzt, was die Regelung noch zusätzlich verlangsamt.

eProfi schrieb:
> Rolf, interessiert dich eine PC-Schnittstelle nicht?
> Kennlinien aufnehmen und so...

Das müsste schon eine USB Schnittselle sein und das mit einem ATmega328 
? Ich weis nicht, ob das zu viel Resourcen frist.

>Meins kommt voraussichtlich morgen - freu.
Ja ist schon wieder Weihnachten ;)



Gruß Rolf

von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> Ein vernünftiges Labornetzteil hat eine kleine Kapazität am Ausgang,

die auch u.U. bei 10V eine LED killt bevor die Strombegrenzung einsetzt.

Rolf D. schrieb:
> Ich hab mal
> einen Strom- und Spannungstest mit einer LED gemacht. Dabei habe ich die
> Spannung auf 10V eingestellt und den Strom auf 20mA. Die LED hats
> überlebt ;)

ich schalte LEDs immer einen R davor auch am Labornetzteil oder 
schliesse die Spannung vorher kurz.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Joachim B. schrieb:
> ich schalte LEDs immer einen R davor auch am Labornetzteil.

Mmmm.. Dann wäre es aber kein Test für die Strombegrenzung am Netzteil ?

von eProfi (Gast)


Lesenswert?

Nicht unbedingt natives USB, sondern mit USB-Seriell-Chip wie zum 
Beispiel FTDI oder CH340, oder gleich mit WLAN (ESP32 o.Ä.).

Vor 4 Jahren hat jemand nach einer Fernbedienbarkeit gefragt:
Beitrag "ELV PPS 5330 Labornetzteil hacken -> Schnittstelle nachrüsten?"

Zum PWM habe ich gelesen, dass ein "kleiner" Ripple messbar ist:
https://de.elv.com/forum/500hz-auf-ausgangsspannung-611
In der Bedienungsanleitung 75915_pps5330_g_um_161014.pdf steht ja was 
von 1mVeff.

von Rolf D. (rolfdegen)



Lesenswert?

Hier einige alte Messungen mit dem ELV PPS 5330 und Original Software

1.Bild - Rippel & Noise no LOad
2.Bild - Rippel & Noise 3A Load
3.Bild - 1A Load peak
4.Bild - 3A Load peak
5.Bild - 3A Load off peak

Die Lastmessung habe ich mit einer Elektronischen Last durchgeführt 
(6.Bild).

Gruß Rolf

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Test für die Strombegrenzung

dazu braucht es keine LED, ich mag unschuldige Bauteile nicht töten,
wie soll eine Strombegrenzung auf den C44 wirken?
Beitrag "Re: PPS5330 Labor-Netzteil hack"
https://www.mikrocontroller.net/attachment/467071/ELV-Power-02_1_.jpg

: Bearbeitet durch User
von Erwin E. (kuehlschrankheizer)


Lesenswert?

Joachim B. schrieb:
> wie soll eine Strombegrenzung auf den C44 wirken?

Andersherum. Stell die Ausgangsspannung auf 30V und die Strombegrenzung 
auf 10mA. Dann schließt du die LED am Ausgang an. C44 ist auf 30V 
geladen und gibt seine gespeicherte Energie direkt an die LED ab - dann 
greift erst die Strombegrenzung und regelt die Ausgangsspannung zurück, 
so dass nur noch 10mA fließen. Leider zu spät für die LED.
Ich habe das mit meinem Banggood Clone 
Beitrag "Re: Labornetzgerät - Fragen zum Schaltplan" getestet, 
dieses LNG hat nur 10µF am Ausgang. Auch hier stirbt die LED bei 
eingestellten 30V. Genauso übrigens an einem 10µ Elko, der auf 30V 
geladen wurde. Stabilere LEDs kaufen? Oder eben doch die Spannung 
runterstellen, bevor LEDs angeschlossen werden.

von Joachim B. (jar)


Lesenswert?

Erwin E. schrieb:
> Oder eben doch die Spannung
> runterstellen, bevor LEDs angeschlossen werden.

oder erst die Ausgangsklemmen brücken, kurzschliessen bevor die LED 
angeschlossen wird und dann erst die Brücke entfernen, dann kann die 
Strombegrenzung gleich arbeiten und der Ausgangselko sich nicht über 
Gebühr aufladen!

: Bearbeitet durch User
von Rolf D. (rolfdegen)



Lesenswert?

Hallo

Ich habe noch ein paar Messungen in Bezug auf die Regelgeschwindigkeit 
der Ausgangsspannung im PPS5330 Netzteil gemacht.

1.Bild Anstiegszeit von 0V auf 30V ohne Last

2.Bild Anstiegszeit von 0V auf 30V mit 1A Last

3.Bild Anstiegszeit von 5V auf 30V mit 1A Last

4.Bild Abfallzeit von 30V auf 0V ohne Last

5.Bild Abfallzeit von 30V auf 0V mit 1A Last

Im Anhang eine aktualisierte Liste der Steuercodes für das LCD Display

Gruß Rolf

von Olaf (Gast)


Lesenswert?

> Ich habe noch ein paar Messungen in Bezug auf die Regelgeschwindigkeit

1s zum einschalten? Oh Backe. Probier mal aus wie das auf einen 
Lastsprung
von 1A reagiert. Und nimm da am besten nicht deine chinesische Last fuer 
weil man dies sonst vielleicht auch erst mal vermessen muesste.

Naja, wenigstens kannst du mit dem traegen Dingen Tantalelkos 
einschalten ohne das sich von der Platine huepfen. :)

Olaf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Die Begründung für die träge Spannungsregelung im PPS5330 Netzteil liegt 
vermutlich an der niedrigen PWM-Frequenz des Steuersignals und der 
nachgeschaltet Filterschaltung, bestehend aus R53 und C34 (siehe Bild).

Diese hat eine Zeitkonstante von r * c = 0.726s (0.22Hz). Eine Erhöhung 
der PWM-Frequenz ist mit dem ATmega88 leider nicht möglich, da der Timer 
bei 14Bit Auflösung keine größere PWM-Frequenz erzeugen kann.

Gruß Rolf

von Erwin E. (kuehlschrankheizer)


Lesenswert?

Wie hast du das Einschaltverhalten getestet?
Vom ausgeschalteten Gerät über den Netzschalter oder bereits 
eingeschaltet aus dem Standby?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Olaf schrieb:
> 1s zum einschalten? Oh Backe. Probier mal aus wie das auf einen
> Lastsprung
> von 1A reagiert. Und nimm da am besten nicht deine chinesische Last fuer
> weil man dies sonst vielleicht auch erst mal vermessen muesste.

Ok. Hab mal ein 12V/20W Halogenlämpchen genommen. Ausgangsspannung auf 
12V gestellt und das Lämpchen versucht prellfrei an die Ausgangsbuchsen 
anzuschließen (Bild).

Gruß Rolf

von Rolf D. (rolfdegen)


Lesenswert?

Erwin E. schrieb:
> Wie hast du das Einschaltverhalten getestet?
> Vom ausgeschalteten Gerät über den Netzschalter oder bereits
> eingeschaltet aus dem Standby?

Das Netzteil war eingeschaltet.

von eProfi (Gast)


Lesenswert?

Doch könnte er, wenn man den µC höher taktet. Ich lasse ihn oft mit 24 
MHz laufen. Ich sehe schon, ein DAC-IC muss her.


> oder erst die Ausgangsklemmen brücken, kurzschliessen bevor die
> LED angeschlossen wird und dann erst die Brücke entfernen, dann kann
> die Strombegrenzung gleich arbeiten und der Ausgangselko sich nicht
> über Gebühr aufladen!
Oder die Standby-Funktion verwenden (viel einfacher). Die guten LNT 
haben weniger als 1µF am Ausgang, was die Situation deutlich entschärft.

Danke für die Signalverläufe, Rolf. Interessant wären halt abrupte 
Lastwechsel, z.B. [0 oder 10 mA] -> 3A  und umgekehrt.

Ich werde das Ding sowieso massiv umbauen, 3-polige Netzbuchse und PE 
vorne herausführen. Dann kann man auch noch eine weitere Plus-Buchse mit 
Vorwiderstand für LED-Prüfungen anbringen. ;-)
Diese könnte gleich auch noch als Remote-Sense-Leitung dienen.

von Rolf D. (rolfdegen)


Lesenswert?

eProfi schrieb:
> Ich werde das Ding sowieso massiv umbauen, 3-polige Netzbuchse und PE
> vorne herausführen. Dann kann man auch noch eine weitere Plus-Buchse mit
> Vorwiderstand für LED-Prüfungen anbringen. ;-)

Mir ist aufgefallen, dass ich beim Messen mit meinem Scope, die GND und 
Plus Klemmen am PPS5330 Netzteil immer vertauschen muss (Netzteil-PLUS 
an Scope-GND), da es sonst zu einem Spannungsabfall im Netzteil kommt. 
Liegt vermutlich an der speziellen Schaltung im Netzteil und das mein 
Scope geerdet ist !?

von eProfi (Gast)


Lesenswert?

Weitere Gedanken: Warum ist die Spannung eigentlich auf 30,0V begrenzt?
Ich bin mir sicher, dass bei kleinen Strömen auch 35-40V gehen sollten.

D15 (Ausgangs-Verpolschutz) sollte mindestens 3A abkönnen, wenn man 
Netzteile seriell betreibt und das erste abregelt.

Dann die Sache mit der relais-schaltbaren Spannungsverdopplung, das ist 
doch Murks, weil die Cs C15 und C16 effektiv nur mit 50 statt 100 Hz 
nachgeladen werden --> unnötig hohe Trafobelastung durch hohen 
Nachladestrom.
Daher hat der Trafo auch 15,7V 9,8A und SI3 15A, bei 3A Ausgangsstrom?!?

Jedes bisschen bessere China-Netzteil hat da einen Trafo mit teilweise 
mehreren Anzapfungen und 100Hz-Gleichrichtung.

Wie ist das mit dem Power-Faktor? Müssen nicht alle Geräte >75W eine 
Oberwellenunterdrückung (PFC) haben?

von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> Doch könnte er, wenn man den µC höher taktet. Ich lasse ihn oft mit 24
> MHz laufen. Ich sehe schon, ein DAC-IC muss her.

dann könnte er auch gleich den ATmega8 ersetzen durch Stärkeres und 
einen echten DAC verbauen, wäre sowieso mein Vorschlag.
Der kam auch schon mal wurde aber abgelehnt!

Seine Erkenntnisse zum Display sind ja auch da nützlich, die 
Regelgeschichte gefällt mir auch nicht!

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

> da es sonst zu einem Spannungsabfall im Netzteil kommt.
> Liegt vermutlich an der speziellen Schaltung im Netzteil und
> das mein Scope geerdet ist !?
Oh je, auch das noch. Vermutlich hängt es auch noch davon ab, wie herum 
der Netzstecker drinsteckt (Kopplungskapazitäten im Netztrafo).
Da sieht man halt wieder den Unterschied namhafter erfahrener Hersteller 
/ Spielzeug. Die alten Hasen wussten genau, was und warum sie etwas so 
und nicht anders machten.

Der Halogentest ist jetzt nicht so aussagekräftig, weil der 
Kaltwiderstand etwa 1/10 des Betriebswiderstandes ist. Dafür ist die 
Ausregelung noch relativ gut (geringer Überschwinger).

von eProfi (Gast)


Lesenswert?

Wird die Trafotemperatur irgendwo ausgewertet oder angezeigt?
Ich würde ja lieber die statischen Anzeigen rechts für die beiden 
Temperaturen verwenden (abwechselnd wie gehabt).

Da noch 2 ADC-Eingänge frei sind, könnte man die unstabilisierte 
Spannung messen (und daraus die Transistor-Verlustleistung berechnen / 
integrieren).

von Joachim B. (jar)


Lesenswert?


von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Im Anhang mein Quellcode Version 1.5a. Der Quellcode ist free.

von Rolf D. (rolfdegen)


Lesenswert?

eProfi schrieb:
> Wird die Trafotemperatur irgendwo ausgewertet oder angezeigt?
> Ich würde ja lieber die statischen Anzeigen rechts für die beiden
> Temperaturen verwenden (abwechselnd wie gehabt).
>
> Da noch 2 ADC-Eingänge frei sind, könnte man die unstabilisierte
> Spannung messen (und daraus die Transistor-Verlustleistung berechnen /
> integrieren).

Die Trafotemperatur wird nicht ausgelesen. Kommt vielleicht noch in 
einem Setup-Menü. Ich habe lieber die Werte für Ulimit und Ilimit immer 
im Blick. Da weis man sofort was los ist, wenn die Spannung mal 
einbricht.

von eProfi (Gast)


Lesenswert?

Ideenansammlung:

Im Display-PDF bitte korrigieren:  Ampre: --> Ampere:
Im c-file Zeile 1293: // Stanby on  --> Standby
Die EinzelSegment-Befehle (z.B. für °) sind noch nicht aufgeführt.

> Mir ist aufgefallen, dass ich beim Messen mit meinem Scope, die
> GND und Plus Klemmen am PPS5330 Netzteil immer vertauschen muss
> (Netzteil-PLUS an Scope-GND), da es sonst zu einem Spannungsabfall
> im Netzteil kommt.
> Liegt vermutlich an der speziellen Schaltung im Netzteil und
> das mein Scope geerdet ist !?
Common der Regelung ist der +-Ausgang, das ist oft zu finden bei 
Netzgeräten. Vermutlich kommt die Störung über den Programmier-Adapter.
Entweder ist der Programmier-PC geerdet oder das (Laptop-?) Netzteil 
verbindet PC-Gnd über die Y-Entstör-Kondensatoren mit L und N.
Dann sowieso aufpassen beim Zusammenstecken:
den Netzstecker immer zuletzt einstecken und als ersten ausstecken!
Grund: beim Verbinden entladen sich die Y-Cs schlagartig mit hohem Strom 
evtl. über eine Datenleitung.

Am Gehäuserahmen gibt es in der Nähe der Netzbuchse einen 
6,3mm-Flachsteck-Erdungsanschluss.

> Zum PWM habe ich gelesen, dass ein "kleiner" Ripple messbar ist:
> https://de.elv.com/forum/500hz-auf-ausgangsspannung-611
> In der Bedienungsanleitung 75915_pps5330_g_um_161014.pdf steht
> ja was von 1mVeff.
Es sind 8000000/16384=488,28125 Hz
Wenn man den kleinen 8MHz-Resonator gegen einen 12MHz aus einem 
USB-Device austauscht, wird die Frequenz höher und der Ripple stärker 
bedämpft.
Ob dann der AD-Wandler noch funktioniert, ich denke schon, er könnte ein 
bisschen mehr rauschen.

Der Weihnachtsmann war da.
Habe die Spannungsverdopplungsschaltung mit LTspice simuliert, es ist so 
wie ich schrieb, die Trafoverluste sind 50-100% höher. Man könnte das 
umbauen, der Trafo könnte bifilar gewickelt sein, vielleicht sind beide 
Wicklungsenden zugängig. Das Ralais sollte dann 2x Um sein, damit man 
bei niedriger Spannung (24V) beide Spulen wie gehabt parallel schalten 
kann.
Der Trafo wird auch ohne Last leicht warm.

Zur langen Dauer nach Standby:
1
  if (Button_nr == 1 && Standby_flag == 0) {
2
    send_LCD_commands(Standby_on);
3
    set_Isoll(0);
4
    set_Usoll(0);
5
    print_value(0x43,0);
6
    print_value(0x47,0);
7
    Standby_flag = 1;
8
    return;
9
  }
Es sollte ausreichen, nur das Standby_on-Pin zu setzen und Isoll und 
Usoll bestehen zu lassen. Dann dürfte nach Standby_off die Spannung 
schneller steigen.

mehr als 30,0V / 3,00A:
Rolf, wie hoch sind denn Spannung und Strom, wenn man 7FFF PWM ausgibt?

von Rolf D. (rolfdegen)


Lesenswert?

So viele Fragen ;)

Erst einmal danke für deine Hinweise :)



Ich fang mal mit der letzen Frage an. Dies betrifft die "Standby" 
Funktion.
Wenn ich die PWM Steuerspannung bei aktivierten Standby nicht auf Null 
setze,  entsteht beim deaktivieren von Standby ein großer positiver 
Spannungspeak auf der Ausgangspannung der um einge Volt höher ist als 
die eingestellte Spannung.

eProfi schrieb:
> Wenn man den kleinen 8MHz-Resonator gegen einen 12MHz aus einem
> USB-Device austauscht, wird die Frequenz höher und der Ripple stärker
> bedämpft.
> Ob dann der AD-Wandler noch funktioniert, ich denke schon, er könnte ein
> bisschen mehr rauschen.

Man könnte den Quarz von 8Mhz auf 16MHz ändern. Dann ist die 
Anstiegszeit etwas kürzer. Nachteil ist, das sich dadurch die Messzeiten 
am Integrator ändern und mann die Timer/Counter Werte ändern und die 
Messergebnisse für Spannung und Strom neu berechnen muss.

eProfi schrieb:
> Common der Regelung ist der +-Ausgang, das ist oft zu finden bei
> Netzgeräten. Vermutlich kommt die Störung über den Programmier-Adapter.
> Entweder ist der Programmier-PC geerdet oder das (Laptop-?) Netzteil
> verbindet PC-Gnd über die Y-Entstör-Kondensatoren mit L und N.
> Dann sowieso aufpassen beim Zusammenstecken:
> den Netzstecker immer zuletzt einstecken und als ersten ausstecken!
> Grund: beim Verbinden entladen sich die Y-Cs schlagartig mit hohem Strom
> evtl. über eine Datenleitung.

Ja du hattest Recht. Die Störungen kamen von ISP-Programmer. Hab das 
Scope testweise alleine an den Plus/Minus Buchsen des Netzteils 
angeschlossen. Keine Problem mehr :)

eProfi schrieb:
> Die EinzelSegment-Befehle (z.B. für °) sind noch nicht aufgeführt.
Die einzelnen Segmente lassen sich leider nicht alle getrennt 
ansprechen, sonder manchmal nur in Gruppen. Deshalb der Trick mit einer 
"2" und das Löschen und Setzen der anderen Segmente.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Rolf D. schrieb:
> Ich fang mal mit der letzen Frage an. Dies betrifft die "Standby"
> Funktion.
> Wenn ich die PWM Steuerspannung bei aktivierten Standby nicht auf Null
> setze,  entsteht beim deaktivieren von Standby ein großer positiver
> Spannungspeak auf der Ausgangspannung der um einge Volt höher ist als
> die eingestellte Spannung.

Siehe Bild:
PWM Steuerspannung bei aktivierten Standby nicht auf Null
Ausgangsspannung 5.00V und Spannungspeak wenn Standby Off

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Rolf D. schrieb:
> Ok. Hab mal ein 12V/20W Halogenlämpchen genommen. Ausgangsspannung auf
> 12V gestellt und das Lämpchen versucht prellfrei an die Ausgangsbuchsen
> anzuschließen (Bild).

Uff, ich dachte mein Netzteil ist nicht besonders gut mit ca. 0.5ms 
Lastausregelung aber hier braucht das Teil ja fast 60ms...das ist 
heftig, übelst schlecht für ein Labornetzteil. Und dann bricht die 
Spannung auch noch weit über 50% ein, bei mir sind es nicht mal 5% 
Einbruch bei der Zuschaltung einer 1A Last. Also IMO steckt da aber noch 
mega viel Optimierungspotential drin.

von Rolf D. (rolfdegen)


Lesenswert?

Den Test sollten vielleicht noch andere Besitzer eines PPS5330 Netzteils 
verifizieren. Kann ja sein das es an meiner Software liegt. Bei der 
Hardware gibt es ja keine Unterschiede. Denke ich ;)

von M. K. (sylaina)


Lesenswert?

Rolf D. schrieb:
> Kann ja sein das es an meiner Software liegt

Darauf wollte ich mit meinem Post hinweisen. Versuch das mal 
nachzuvollziehen, vielleicht erstmal ein ganz simples Programm erstellen 
(auf Anzeigen und Co verzichten, mit durch im Code vorgegebenem 
Parametern wie Sollspannung und Sollstrom usw.).
Wie gesagt, 60ms Ausregelzeit sind für ein LNG mindestens zwei 
Ewigkeiten. Das geht IMO gar nicht (So etwas ist ja schon für das 
menschliche Auge „sichtbar“). 10ms wäre schon lang für ne 
Lastausregelung. Selbst für das Reinlaufen in die Strombegrenzung wäre 
das mit 60ms bis zur Ausregelung schon mindestens eine Ewigkeit. Stell 
dir nur mal vor du hast eine uC-Schaltung angeschlossen die alle 10 ms 
eine 1A Last bei 12V zuschaltet...Das würde dauern bis du dahinter 
kommst, dass die ständigen Resets des uCs von der schlechten 
Lastausregelung des LNGs kommen.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe den Belastungstest noch einmal mit normalen Widerständen 
gemacht.

Das Ganze sieht schon etwas besser aus. Die Spannung bricht im ersten 
Moment von 12V auf 9V zusammen und regelt innerhalb von 400usec nach.

1.Bild : Spannung 12V / 3.9 Ohm / 3A

2.Bild : Spannung 12V  12 Ohm  1A

Die verwendete Halogenlampe (12V/20W) in meinem vorlezten Belastungstest 
war nicht unbedingt geeignet, weil sie im Einschaltmoment einen sehr 
geringen Widerstand hat und die maximale Strombelastung des Netzteils 
übersteigt.

Gruß Rolf

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

Eine Halogenlampe ist als Last eher ungeeignet, da sie ein PTC ist.
Die 60ms sind nicht die Ausregelzeit, sondern die Zeit, bis die 
Glühwendel bei 3A so heiß geworden ist, dass der Widerstand 12V/3A=4 Ohm 
ist.

Die Regelung funktioniert rein analog, der µC gibt über PWM-DAC den 
Sollwert vor.

Was ich mir noch zum 488Hz-Ripple überlegt habe:
Man kann die PWM-Unit auch mit 13 oder 12 Bits betreiben zu Gunsten der 
PWM-Frequenz zu Lasten der Auflösung.  Ich würde das als Menüpunkt 
aufnehmen.

von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> Die Regelung funktioniert rein analog, der µC gibt über PWM-DAC den
> Sollwert vor.

stimmt zwar aber bei derlei Überschwinger könnte der Komperator im µC 
auch schneller eingreifen und den DAC steuern oder den Leistungsteil 
abschalten oder begrenzen!

von M. K. (sylaina)


Lesenswert?

Rolf D. schrieb:
> Das Ganze sieht schon etwas besser aus. Die Spannung bricht im ersten
> Moment von 12V auf 9V zusammen und regelt innerhalb von 400usec nach

Die Regelzeit finde ich jetzt OK (Nicht besonders schnell aber noch OK, 
ist in der Tat bei meinem LNG ähnlich, hab das heute morgen mit der 
Halogenlampe auch gar nicht bedacht, dass das LNG dadurch wahrscheinlich 
in der Strombegrenzung war) aber der Einbruch ist IMO immer noch viel zu 
heftig. Man sieht aber auch, dass das anscheinend vom Regler kommt denn 
es ist recht egal ob man 3A oder 1A anfordert, der Einbruch ist in 
beiden Fällen ähnlich stark.

von eProfi (Gast)


Lesenswert?

Gerade sehe ich, dass es ein sehr ähnliches Labornetzteil SPS5630, 30V 
6A, allerdings als Schaltnetzteil mit SG3524A-PWM-Regler, SPP15P10P-FET 
und STPS10L60D/FP Schottky, gibt.
Fertig  185,16 Artikel-Nr. 083569 EAN: 4047976835690
Bausatz 175,41 Artikel-Nr. 083399 EAN: 4023392833991
Der Digitalteil ist praktisch identisch, nur die Linear-Endstufe wurde 
durch den Schaltregler ersetzt.  6A liefert es nur bis 12V, darüber geht 
der Strom zurück auf 2,5A bei 30V (75W), das 5330 kann 30V*3A=90W.
Der Trafo hat 32V 4,8A.
Hier im Forum gibt es 2 Beiträge dazu:
2011: Beitrag "Aufbau Schaltnetztzeil SPS5630"
2015: Beitrag "Problem mit ELV Netzteil Bausatz PPS 5630" mit Bauanleitung
Bauanleitung  Best.-Nr.: 75572   Version 2.0   Stand: März 2008
https://www.mikrocontroller.net/attachment/56486/elv.pdf
3,79 MB, 94304 Downloads !   Es ist die einzige Stelle im weiten WWW, an 
der das PDF (Bau- und Bedienungsanleitung SPS 5630) zu finden ist.

von Olaf (Gast)


Lesenswert?

> Die Begründung für die träge Spannungsregelung im PPS5330 Netzteil liegt
> vermutlich an der niedrigen PWM-Frequenz des Steuersignals und der

Ja das ist der Grund. Nach meinem Post dachte ich mir das auch noch.
Aber okay, das ist dann wohl okay. Solange man das Teil nicht schnell 
durchfahren will wird man damit leben koennen. Auch wenn sicher 2-3x 
schneller nett waer.
Im letzten Horrowitz und Hill (X-Chapter) war ein interessanter Trick 
drin wie man die PWM ein bisschen schneller bekommt.

Ich weiss aber nicht ob ich Elkos im Filter verwendet haette.

Olaf

von Rolf D. (rolfdegen)


Lesenswert?

Hier ein sehr interessanter Test von einem Labornetzteil : 
https://youtu.be/562U6G0XTDE

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen

Ich habe noch ein paar Vergleichsmessungen mit meinem PPS5330 und einem 
Siglent SPD3303X gemacht.

Siglent SPD3303X:
2x 32V/3.2A
1x 2.5/3.3/5V 3.2A

ELV PPS5330:
1x 30V/3A

1a.Bild: Siglent Spannungs Peak  12V/3A Last
1b.Bild: PPS5330 Spannungs Peak  12V/3A Last

2a.Bild: Siglent Standby_off Peak 12V/3A Last
2b.Bild: PPS5330 Standby_off Peak 12V/3A Last

3a.Bild: Siglent Standby_off Peak 12V ohne Last
3b.Bild: PPS5330 Standby_off Peak 12V ohne Last

4a.Bild: Siglent Spannungs Peak Halogen 12V/20W
4b.Bild: PPS5330 Spannungs Peak Halogen 12V/20W


Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Mit einer kleinen Trick habe ich versucht, die Anstiegszeit der 
Ausgangsspannung nach einem Standby zu verkürzen.

Der Trick bestand darin, das ich vor der Aktivierung der 
Entstufentransitoren (T2-T5) durch die Standby-Leitung (T9), die PWM 
Steuerspannung an den Anschlüsse Usoll und Isoll einschalte und erst 
danach mit einer kleinen Zeitverzögerung von 1sec die 
Enstufentransistoren freigebe.

Leider hat das nicht funktioniert, weil am Ausgang wieder hohe 
Spannungsspitzen zu messen waren (siehe Bilder). Schade.. Verstehen tuh 
ich das nicht ? :(

2.Bild: soft_delay ca 0.1sec vor Standby_off (ohne Last)
3.Bild: soft_delay ca 1sec   vor Standby_off (ohne Last)


Standby Funktion u.a.
1
//*************************************************************************
2
// Button function
3
//*************************************************************************
4
void buttonFunction (uint8_t Button_nr)
5
{
6
  // Standby on -------------------------------------------------------- 
7
  if (Button_nr == 1 && Standby_flag == 0) {
8
    set_Isoll(0);
9
    set_Usoll(0);
10
    send_LCD_commands(Standby_on);
11
    Standby_flag = 1;
12
    return;
13
  }
14
  // Standby off -------------------------------------------------------
15
  else if (Button_nr == 1 && Standby_flag == 1) {
16
    read_Ulimit();    // read Ulimit from EEPROM
17
    read_Ilimit();
18
    set_Usoll(Ulimit);
19
    set_Isoll(Ilimit);
20
    Standby_flag = 0;
21
    if (Ulimit >= 15000) {
22
      SPI_wr2(0xB1);      // Relais on  unregulated VDC 48.0V
23
    }
24
    else if (Ulimit <= 14500) {
25
      SPI_wr2(0xB0);      // Relais off  unregulated VDC 24.0V
26
    }
27
    soft_delay(100);
28
    send_LCD_commands(Standby_off);
29
    return;
30
  }
31
....
32
33
34
35
//*************************************************************************
36
// set Usoll (0 - 30.000mV)
37
//*************************************************************************
38
void set_Usoll (uint16_t Usoll_value)
39
{
40
  uint8_t Digi_offset = 120;
41
  #define Umax 30000
42
  //#define counts_per_30v 15419
43
  
44
  if (Usoll_value == 0)
45
  {
46
    OCR1A = Digi_offset;
47
    return;
48
  }
49
  else Digi_offset = 127;
50
  
51
  uint16_t counts_per_30v = 15423;
52
  uint32_t u_factor = (counts_per_30v * 65536 / Umax);
53
  OCR1A = Digi_offset + ((Usoll_value * u_factor) >> 16) +
54
  (((Usoll_value * u_factor) >> 15) & 1);
55
}
56
57
58
//*************************************************************************
59
// set Isoll
60
//*************************************************************************
61
void set_Isoll (int Isoll)
62
{
63
  const uint8_t offset = 160;
64
  OCR1B = offset + (((int32_t)Isoll * 10000) / 2045);  // OCR1B 600=100mA 1200=230mA
65
}

Könntes es vielleicht an C21 in der Standby-Schaltung liegen ??

: Bearbeitet durch User
von eProfi (Gast)


Lesenswert?

1
void set_Isoll (int Isoll)
2
{
3
  const uint8_t offset = 160;
4
  OCR1B = offset + (((int32_t)Isoll * 10000) / 2045);  // OCR1B 600=100mA 1200=230mA
5
}
6
7
kürzer:
8
void set_Isoll (int Isoll){
9
  OCR1B = 160 + ((Isoll * 1252UL) >> 8);  // OCR1B 600=100mA 1200=230mA
10
}

> Könntes es vielleicht an C21 in der Standby-Schaltung liegen ??
Eher das Zusammenspiel C21 + C33 und bei Stromreglerbetrieb C26.
Funktion des Spannungsreglers:
Beispiel Uout=30,00
PWM=94,9% ((127+15423)/16384)
U(R52)=94,9/100*5/2=2,372V
Der Offset 127 kommt aus dem Spannungsteiler R50 (100) und R51 (22k auf 
-5V)

Der Verstärkungsfaktor ist (R47 || R48) / (R49+R50) und ist
150/2/5,7=13,15789474
* 2,372= 31,21052632
- Offset  --> 30V

d.h. R53  C34  und R50  C34  bilden ein PT2-Glied, das gegen das 
PT1-Glied (interne Treiberwiderstand IC201/30) / C21 arbeitet, so ein 
Murks.

Beim Stromregler ist das PT2 R43  C27 und R40  C26.

von Rolf D. (rolfdegen)


Lesenswert?

Danke für den Hinweis und deine Erklärungen :)

Gruß Rolf

von M. K. (sylaina)


Lesenswert?

Rolf D. schrieb:
> Ich habe noch ein paar Vergleichsmessungen mit meinem PPS5330 und einem
> Siglent SPD3303X gemacht.

Sehr schöner vergleich. Das SPD3303X ist ein, ich sag mal, 
durchschnittliches Labornetzteil, und an dem Vergleich sieht man jetzt 
mal wie krass schlecht das PPS5330 ist. Sicher, das PPS5330 kann man 
durchaus nutzen aber es ist halt, meiner Meinung nach, mega schlecht. 
Wenn man die Wahl hat...also kaufen würde ich das nicht.
Ich drück dir die Daumen, dass du es noch ein wenig optimiert bekommst.

von Maulbeere (Gast)


Lesenswert?

M. K. schrieb:

> ... sieht man jetzt mal wie krass schlecht das PPS5330 ist.
> ... meiner Meinung nach, mega schlecht.

Das ist aber nur die Meinung eines unbedarften Bastlers, die er 
offensichtlich nicht mit technischen Fakten belegen kann.

Eine Antwort erübrigt sich, da ich hier nicht mitlese. Danke für dein 
Verständnis.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Die Strombegrenzung ist auch noch etwas merkwürdig. Sie reagiert zwar 
sehr schnell, aber wenn die Belastung bei 5 Volt Sollspannung abfällt, 
ist eine Spannungsspitze von über 1 Volt am Ausgang messbar (siehe 
1.Bild).

2+3.Bild: LED Test bei 10V

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Maulbeere schrieb:
> Das ist aber nur die Meinung eines unbedarften Bastlers, die er
> offensichtlich nicht mit technischen Fakten belegen kann.

Soso...solche User sind immer die Besten. Vor allem wenn man dann noch 
mit

Maulbeere schrieb:
> da ich hier nicht mitlese

um die Ecke kommt. Warum meldet man sich dann überhaupt zu Wort? Na, der 
Username ist anscheinend richtig gewählt.

Rolf D. schrieb:
> Die Strombegrenzung ist auch noch etwas merkwürdig. Sie reagiert zwar
> sehr schnell, aber wenn die Belastung bei 5 Volt Sollspannung abfällt,
> ist eine Spannungsspitze von über 1 Volt am Ausgang messbar (siehe
> Bild).

Das liegt wahrscheinlich schon in den anderen Beobachtungen begründet. 
Wie schnell die Strombegrenzung ist kann man hier auch schwierig 
abschätzen, könnte aber OK sein wenns so maximal 10-20ms sind. Ich 
glaube aber nicht, dass die schneller als 1-2ms sein wird.

von Rolf D. (rolfdegen)


Lesenswert?

Ist halt ein "Bastler" Netzteil. Mich würde aber zu gern interessieren, 
ob das Netzteil von eProfil mit der Original ELV-Software auch so 
reagiert.

Gruß Rolf

von eProfi (Gast)


Lesenswert?

Wenn Du genau sagst, was ich messen soll, mache ich das morgen.
Generell: ein bisschen mehr dazu schreiben (oder in den Videos sagen) 
was Du gerade machst und warum.
Die Überspannung kommt aus dem selben Grund wie beim Standby:
Der Stromregler greift und hat Priorität, und der Spannungsregler macht 
voll auf, weil die Spannung ja zu gering ist.
Fällt die Last weg, übernimmt der Spannungsregler, der aber voll offen 
ist.
Bis der herunterregelt, ist halt die Spannung zu hoch.
Das liegt hauptsächlich an den Elkos in der Regelung. Nur: wenn man die 
kleiner macht, könnte das Ding losschwingen (zum Oszillator werden).
Da muss man feinfühlig optimieren.
Eine LTspice-Simulation wäre angebracht. Aber der mechanische Aufbau 
spielt ja auch noch eine Rolle (parasitäre Rs, Ls und Cs).

von Rolf Degen (Gast)


Lesenswert?

Mich würden folgende Messungen interessieren:
-  Spannungsanstiegszeit mit Standby off  auf 5V ohne und mit Last.
-  Spannungsstabilität bei steigender Temperatur unter Last

Im Voraus schon mal ein Dankeschön für deine Mühe.

Gruß Rolf

von eProfi (Gast)


Lesenswert?

Heute gemessen: sieht ähnlich aus wie bei Dir:
5V 1A Last-Abwurf geht die Spannung auf 8V hoch und in 350ms linear 
herunter.
Allerdings sehe ich bei 1A einen 500kHz-400mV-Ripple, das muss ich noch 
genauer untersuchen, das kann auch am Aufbau liegen.
Nach Standby dauert es über 1 Sekunde, bis die 5V vollständig da sind, 
egal ob mit oder ohne Last.
Hohe Temperaturen mache ich später.

von Rolf D. (rolfdegen)


Lesenswert?

Danke Dir. Dann liegt es nicht an meiner Software. Schon mal gut zu 
wissen.

Jetzt mal schaun wie stabil die Ausgangsspannung ohne Last und mit Last 
ist. Hab das Gerät im kalten Zustand ohne Last auf 10V eingestellt und 
dann 20min gewartet und noch einmal gemessen.


Start ohne Last: Temp.: 24.0'C  Usoll: 10V    Uist: 10.005V
nach 20min       Temp.: 27.6'C  Usoll: 10V    Uist: 10.001V

danach direkt mit Last 10V/1000mA gemessen
                 Temp.: 27.6'C  Usoll: 10V    Uist: 9.977V
nach 30min       Temp.: 44.3'C  Usoll: 10V    Uist: 9.974V

Die Temperaturmessung erfolgte am Kühlkörper und die Spannungsmessung 
direkt an den Ausgangsklemmen.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

eProfi schrieb:
> 5V 1A Last-Abwurf geht die Spannung auf 8V hoch

ist aber böse, das darf nicht sein!

das killt ja jeden nano mit hundert WS2812b wenn das Licht ausgeht!

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Joachim B. schrieb:
> ist aber böse, das darf nicht sein!

Das sehe ich ähnlich, und vorallem dass da rund 350ms nötig sind bis es 
wieder im Soll ist...alter Schwede, da kannst ja von Hand schneller 
nachstellen.

von Olaf (Gast)


Lesenswert?

> .alter Schwede, da kannst ja von Hand schneller

Sowas hab ich auch gerade gedacht. Sowohl die Groesse wie auch
die Zeitdauer sind erschuetternd!

Ich geb zu, ich hab mich seit 20Jahren nicht mehr mit linearen 
Netzteilen beschaeftigt. Man kauft sie halt und sie haben funktioniert. 
Aber sowas sollte man doch besser hinbekommen. Erst recht bei 
irgendwelchen Bausaetzen wo es doch egal ist ob da ein OP drin ist der 
0.5Euro mehr kostet, oder gar ein zweiter.

Olaf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Vielleicht könnte man den Ausgang über eine "Ideale Diode" schaltbar 
machen.

Ideale Dioden zeichnen sich dadurch aus, dass sie hohe Spannungen und 
Ströme schalten können und einen sehr geringen Durchlasswiderstand von 
wenigen Milliohm besitzen.

Der Spannungsabfall am Ausgang wäre je nach Bauart und Aufwand sehr 
gering.

Link: 
https://praktische-elektronik.dr-k.de/Praktikum/Analog/DiodenTransistoren/Le-Ideale-Diode.html

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Olaf schrieb:
> Erst recht bei
> irgendwelchen Bausaetzen wo es doch egal ist ob da ein OP drin ist der
> 0.5Euro mehr kostet, oder gar ein zweiter.

Am OP liegt es nicht sondern an der Schaltung ansich. Selbst eine 
Schnecke von LM358 und ähnliches bekommt das schneller hin.

Rolf D. schrieb:
> Vielleicht könnte man den Ausgang über eine "Ideale Diode" schaltbar
> machen.

Das wäre eine Idee, vielleicht schaust du mal via LTSpice ob das 
wirklich interessant wäre.

von Rolf D. (rolfdegen)


Lesenswert?

An dem langsamen Regelverhalten würde sich ja nichts ändern. Man müsste 
schon die Netzteilschaltung an sich ändern. Die Strombegrenzung reagiert 
innerhalb von 2ms und ist damit ausreichend schnell. Die 
Spannungsregelung ist dafür aber sehr langsam (> 700ms von 0V auf 10V).

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Schade dass das Thema damals irgendwie eingeschlafen ist.
Ich habe es trotzdem gewagt, mein hier im Forum günstig erstandenes 
PPS5330 mit der FW von Rolf zu flashen, als "Spiel-Objekt". Hat 
problemlos geklappt. Mal schauen, ob ich die noch fehlende 
Kalibrierfunktion programmiert bekomme. Habe aber bisher nichts mit AVRs 
zu tun gehabt...
Ach ja: Die Original-FW ist wie vermutet auslesegeschützt.

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..
Ja das war mein Problem. Beim Versuch die alte Firmware auszulesen, habe 
ich die Firmware gelöscht. Ich denke man kann an meiner Firmware 
bestimmt noch einiges verbessern. Aber die Grundlagen um das Display 
anzusteuern sind ja vorhanden.

Gruß Rolf

von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Beim Versuch die alte Firmware auszulesen, habe
> ich die Firmware gelöscht.

Alleine der Versuch die geschützte FW auszulesen löscht noch nichts - 
man bekommt auch keinen Fehler, sondern halt nur 0xFF's zurück. Aber im 
Microchip Studio liegt der Erase-Button natürlich in gefährlicher Nähe 
zum Read-Button...

Rolf D. schrieb:
> Ich denke man kann an meiner Firmware
> bestimmt noch einiges verbessern.

Bis auf die fehlende Kalibrierfunktion (mein Gerät liegt mit deiner FW 
rund 0.1..0.2V bzw. 0.1A daneben), ist eigentlich alles drin, was auch 
das Original kann. Und mit der Temperaturanzeige sogar noch mehr.

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Klaus

Bevor du das Labor-Netzteil neu flascht, kannst du vielleicht ein paar 
Messungen machen. Zum Beispiel Anstiegs- und Abfallzeiten der 
Ausgangsspannung. Oder das Verhalten bei einer Strombegrenzung. Diese 
Test habe ich am Anfang meines Umbaus leider nicht gemacht.

Gruß Rolf

von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Bevor du das Labor-Netzteil neu flascht

Zu spät:

Klaus schrieb:
> Ich habe es trotzdem gewagt, mein hier im Forum günstig erstandenes
> PPS5330 mit der FW von Rolf zu flashen

von Rolf D. (rolfdegen)


Lesenswert?

Schade..

Macht nix. Ich habe es gerade nochmal aus dem Schrank geholt. Wenn du 
Hilfe benötigst dann melde dich einfach. Ich lese mit..

Läuft ca. 1/2 Stunde ohne Last. Netzteil zeigt Temperatur von 26.3 C bei 
Raumtemperatur 22.8 C

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

So, da heute eh' kein Tatort lief, hab ich mal ein bisschen angefangen.

Kalibrierung lässt sich beim Einschalten durch Druck von "<-" und "->" 
starten, oder wird automatisch gestartet, falls noch keine gültige 
Kalibrierung im EEPROM hinterlegt ist.
Ich habe mal 5V und 25V als zu kalibrierende Werte genommen, Einstellung 
mit Drehencoder und Bestätigung mit Enter. Mit beiden Werten werden 
Offset und Steigung berechnet und im EEPROM gespeichert.

Funktioniert soweit für Spannung einwandfrei.
Strom habe ich noch nicht gemacht, sollte aber analog gehen und kein 
Problem sein.

Die "automatic voltage regulation" musste ich rausnehmen, da die 
Messwerte bei mir noch deutlich abweichen. Das ist dann die übernaächste 
Baustelle, vermutlich sollte man die Messung bei der Kalibrierung des 
Ausgangs gleich mit kalibrieren.

Eigentlich würde ich den Code gerne auf github werfen oder so, aber 98% 
sind von dir Rolf - was hältst Du davon?
Hier im Forum gibt's einfach keine Versionskontrolle und Historie, das 
taugt nicht wirklich. Und nicht deutschsprachige Interessenten werden 
das hier auch kaum finden, wobei das ELV Netzteil vermutlich sowieso nur 
im Deutschsprachigen Raum verkauft wurde...

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Klaus

Upload auf github ist kein Problem. Seit einem halben jahr benutze ich 
für meine Projekte PlatformIO. Vorher habe ich mich jahrelang mit ATMEL 
Studio herumgeschlagen. PlatformIO ist schon eine schöne Sache. Mein 
aktuelles Projekt auf github 
https://github.com/rolfdegen/Jeannie-Open-source-Synthesizer

von Klaus (feelfree)


Lesenswert?

Firmware liegt nun hier: https://github.com/feelfree69/pps5330

von Rolf D. (rolfdegen)


Lesenswert?

Hallo Klaus..

Vielen Dank für deine Arbeit und Mühe. Kannst du die neue Firmware 
eventuell als Hex hochladen. Danke :)

von Klaus (feelfree)


Lesenswert?

Hab grade mal den aktuellen Stand committed und noch ein Hex dazugelegt.

von Rolf D. (rolfdegen)


Lesenswert?

Danke. Super :)

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Habe die neue Firmware jetzt aufgespielt. Funktioniert super. Die zwei 
Zahlen oberhalt von der "Standby" Anzeige sind das die Temperaturen ?

Irgentetwas stimmt da aber noch nicht mit der Kalibrierung von Strom und 
Spannung. Die Anzeigenwerte am Netzteil stimmen nicht (siehe Bild). Ich 
habe nach dem 1.Einschalten Spannung und Strom abgelichen bzw kalibriert 
?

Gruß Rolf

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Hallöchen..
> Habe die neue Firmware jetzt aufgespielt. Funktioniert super. Die zwei
> Zahlen oberhalt von der "Standby" Anzeige sind das die Temperaturen ?
Ja. Wobei für die das gleiche gilt wie für Strom- und Spannungsmessung: 
Die werden alle noch nicht abgeglichen, ich habe nur Werte eingetragen, 
die bei mir einigermaßen passten.
Mit deiner Firmware hat mein Netzteil 45 Grad angezeigt kurz nach dem 
Einschalten.
Der Abgleich ist bisher ausschließlich für die PWM da, und lässt sich 
beim Druck auf die beiden Pfeiltasten beim Einschalten auch jederzeit 
wiederholen.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallo Klaus

Hab deine aktuelle Firmware 199b5 gerade getestet. Spannungs- und Strom 
Kalibrierung funktioniert jetzt. Die Temperaturanzeige werde ich für 
mich wieder abändern. Ich fand das in meiner alten Firmware besser. Da 
wurde nur die Temperatur für den Kühlkörper im Wechsel mit der 
Leistungsanzeige angezeigt. In deiner Version ist die Trafo- und 
Kühlkörper Temperatur nicht eindeutig erkennbar.

Hab ein kleines Video gedreht..
Link: https://youtu.be/1CG0pDNu2Fw

Gruß Rolf

von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> n deiner Version ist die Trafo- und
> Kühlkörper Temperatur nicht eindeutig erkennbar.

Das stimmt, ist halt Geschmacksache. Ein Netzteil hat Strom und Spannung 
zu verteilen, und die Leistung auf einen BLick zu sehen finde ich auch 
nicht verkehrt. Die interne Temperatur in einem Netzteil interessiert 
mich eigentlich überhaupt nicht... wenn doch dann würde ich die durch 
irgendeinen langen Tastendruck anzeigbar machen.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Danke. Super Arbeit und perfekt :)

von Frank L. (hermastersvoice)


Lesenswert?

auf jeden Fall Superarbeit von euch Beiden! Ich müsste noch irgendwo so 
einen Bausatz rumliegen haben. Könnte nun interessant werden Den mal 
fertigzubauen.
Danke!

von Rolf D. (rolfdegen)


Lesenswert?

Die aktuelle Firmware kann man hier herunterladen..
Link: https://github.com/feelfree69/pps5330

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Aktuelle Firmware
199b7
partly revised button handling (using timer interrupt for debouncing)
added seperate Contrast / Backlit settings like in original firmware, 
with backlit timeout in minutes
Link: https://github.com/feelfree69/pps5330

Kann mal jemand überprüfen, ob die Original Firmware eine Temperatur 
Kompensation hat ? Eine Kalibrierung des Netzteisl habe ich nach 2 Std 
Betriebszeit durchgeführt. Jedenfalls ändert sich in der Firmware 
Version 199b6 mit steigender Kühlkörper Temperatur die Ausgangsspannung 
(sinkt). Im Einschaltmoment ohne Last habe ich bei 5.00V Einstellung 
eine Ausgangsspannung von 5.04 Volt. Bei 25.00V ist die Ausgangsspannung 
25.04V. Die Ist-Werte von Spannung und Strom auf der LCD-Anzeige stimmen 
mit den gemessenen Ausgangswerten Werten überein.

: Bearbeitet durch User
von Rolf D. (rolfdegen)



Lesenswert?

Messung der Strombegrenzung (Überstromschutzschaltung) im PPS5330

Die Bilder 1+2 zeigen die Messung der Strombegrenzung im PPS5330 bei 
15V/ 100mA und 15V/1000mA.
Das Netzteil reagiert innerhalb weniger Mikrosekunden und geht dann in 
die Strombegrenzung. Die dabei auftetenden Spannungsspitzen bleiben 
unterhalb der eingestellten Ausgangsspannung.

Im Vergleich reagiert das Korad KA3005P Labornetzteil etwas langsamer 
und benötigt ca. 4 Millisekunden (Bild 3).

Bei Laständerung von 15V/0A auf 15V/2.5A reagiert das PPS5330 
Labornetzteil innerhalb von weniger als 1 Millisekunde (Bild 4).

: Bearbeitet durch User
von Rolf D. (rolfdegen)



Lesenswert?

Messung des Ein- und Ausschaltverhaltens über den Standby-Taster am 
PPS5330

Beim Einschalten der Ausgangsspannung über den Standby-Taster kann das 
PPS5330 Labornetzteil leider nicht punkten. Egal wie groß die Last am 
Ausgang ist, benötigt das Netzteil ca. 1.5 Sekunden bis die Spannung 
stabiel anliegt (Bild 1+2). Die Ausschaltzeit beträgt je nach Last (0mA 
- 3A) zwischen 1.5 Sekunden und 240 Mikrosekunden (Bild 3+4).

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Rolf D. schrieb:
> Messung des Ein- und Ausschaltverhaltens über den Standby-Taster am
> PPS5330

Das wird vermutlich an C21 (10uF) liegen. Den würde ich mal 
versuchsweise deutlich kleiner machen.

von Rolf D. (rolfdegen)


Lesenswert?

Danke für deinen Tip. Werde ich mal testen :)

Es gibt von Klaus auf github wieder ein Firmware Update Version 199b9
Link: https://github.com/feelfree69/pps5330

199b9
code cleanup, reduce flash footprint
Key-combination <-,-> and MEMORY for zeroing EEPROM -> resets 
calibration and all user settings

199b8
added panel lock funtion (long-press "<-" and "->" simultaneously for 
toggling) like in original firmware

199b7
partly revised button handling (using timer interrupt for debouncing)
added seperate Contrast / Backlit settings like in original firmware, 
with backlit timeout in minutes

199b6
added calibration of internal ADC measurements for U and I

199b5
code cleanup, cosmetics

199b4
add menu for display-settings (long press U/I), encoder/arrows for 
changing, enter for exit
recall-button: blinky display of stored values before applying
remove more magic numbers in code
rework button handling (still room for improvement...)

199b3
added T2 (transformer) measurement
toggle T1/T2 at 2-digit memory section
decrease interval for temperature measurements

199b2
Added Current calibration

199b1
Minor code cleanups (or mess-up's, dependend on your view..)
Display firmware version at startup
Added Voltage calibration

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Messung der Strombegrenzung mit LED

Messspannung 10V und Strombegrenzung auf 20mA. Messobjekt rote LED.

Innerhalb von 2 Millisekunden reagiert die Strombegrenzung im PPS5330 
und begrenzt den Strom für die LED auf 20mA. Im Vergleich dazu ist das 
NGE100 Netzteil von R&S etwas langsamer und benötigt 25 Milisekunden 
(Bild 2). Die gemessenen Spannungsspitzen liegen beim NGE100 mit 10V 
etwas höher. Beim PPS5330 habe ich maximal 6V gemessen (siehe Bild 1).

Gruß Rolf

: Bearbeitet durch User
Beitrag #7619602 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Lesenswert?

Temperaturen des PPS 5330 Labornetzteil gemessen nach dem Einschalten
ohne Last bei einer Raumtemperatur von 22 C. Gehäuse geschlossen

T1 = KTY81-121 Temperatursensor am Kühlkörper
Me = Messfühler am Kühlkörper (K type -40C~40C, 0.1C +-(2.0%+30))
Tr = KTY81-121 Temperatursensor am Transformator

Berechnung der Kühlkörper Temperatur
1
#define calib_offset_temp 5690      // Calibration to be done
2
#define calib_factor_temp 193803    // Calibration to be done 
3
uint16_t result = (((uint32_t)meas_time - calib_offset_temp) * calib_factor_temp) >> 16;

Kaltstart ohne Last
T1 = 20.7 C
Me = 20.5 C
Tr = 20.0 C

Nach 60 Minuten ohne Last
T1 = 27.8 C
Me = 28.3 C
Tr = 34.0 C


Temperaturen nach 60 Minuten Last von 5 Watt (5V/1000mA)
T1 = 47.0 C
Me = 46.5 C
Tr = 40.0 C

Temperatur nach weiteren 60 Minuten Last von 10 Watt (5V/2000mA)
T1 = 60.6 C
Me = 58.2 C
Tr = 45.0 C

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hab die Werte für die Berechnung der Kühlkörper Temperatur noch etwas 
verändert, da die angezeigten Temperaturen vom T1 Sensor zu hoch waren.
1
#define calib_offset_temp 5695      // Calibration to be done
2
#define calib_factor_temp 191190    // Calibration to be done 
3
uint16_t result = (((uint32_t)meas_time - calib_offset_temp) * calib_factor_temp) >> 16;

Im Bereich zwischen 30C und 70C stimmen die Temperaturen vom Messgerät 
und T1 Sensor mit +- 0.5 C überein.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

PPS 5330 Ripple & Noise Messung

Ich habe bei 5 Volt Ausgangsspannung den Ripple und Noise mit 
verschiedenen Belastungen getestet (siehe Bild). Bei einer maximaler 
Last von 3A liegt die Ripple Amplitude bei ca. 10mVpp.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Die angezeigten Temperaturen im PPS 5330 Labornetzteil waren immer noch 
etwas ungenau. Aus diesem Grund habe ich einen Digitalen 
Temperatursensor (DS1820) parallel zum Temperatursensor am Kühlkörper 
installiert und die Werte miteinander verglichen (Bild 1+2). Dadurch 
konnte ich die Werte für die Kalibrierung genauer bestimmen.
1
#define calib_offset_temp 5717      // Calibration to be done
2
#define calib_factor_temp 185150    // Calibration to be done 
3
uint16_t result = (((uint32_t)meas_time - calib_offset_temp) * calib_factor_temp) >> 16;

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Die beiden KTY81-121 Temperatursensor zeigen unterschiedliche 
Temperaturen an.
Ich habe beide Sensoren demontiert und im freien Raum mit dem digitalen 
Temperatur IC DS1820 verglichen. Eine Sensor zeigt 12.5 C an und der 
andere 20 C. Die 20 C entsprechen ungefähr dem Messwert vom ditalen 
Temperatur IC. Der Code für die Messwerterfassung beider Sensoren ist 
identisch. Ich schau mir jetzt mal beide Sensoren T1 und T2 an und die 
vorgeschalteten Reihenwiderstände R59 und R60 die an +5V gehen. 
Vielleicht gibts da irgendwelche Ungereimtheiten ?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hab leider nichts entdeckt. Um auszuschließen, dass einer der beiden 
Temperatursensoren defekt ist oder zu stark streut, habe ich beide 
Sensoren durch zwei Widerstände (1kOhm 1%) ersetzt. Dabei traten wieder 
unterschiedliche Messwerte auf. T1 hatte 18 C und T2 hatte 26 C. Nach 
der Temperaturtabelle vom KTY81/121 liegt der Wert bei 1KOhm zwischen 
25-30 C. Die Messung für T2 scheint ok zu sein. Aber bei T1 scheint also 
etwas nicht zu stimmen. Versuchsweise habe ich den Eingangskanal für T1 
am Multiplexer auf einen nicht benutzten Kanal (7) am Multiplexer 
gebrückt. Hatte danach aber das gleiche Ergebniss. Die Bauteile am 
Messeingang habe ich nachgemessen. Keine großen unterschiede 
vestgestellt. Die Eingangspannungswerte am Multiplexereingang 2+3 lagen 
bei 1.3251V bzw 1.3250V.

: Bearbeitet durch User
von Sven K. (svenk)


Lesenswert?

Hallo Rolf,
aus dem Bauch heraus würde ich ja auf einen Software Fehler tippen,
da Du ja die Hardware ausgeschlossen hast.
Im interrupt

Überlauf einer Variablen?
Volatile/ non volatile?
Variable überlebt den interrupt nicht?

Muss es eine 32bit variable sein?
Reicht nicht 16bit und durch geschicktes Schieben oder
Teilen durch 10 am Ende habe ich
eine ausreichend hohe Auflösung der Temperatur?
Beispiel 615 -> 61,5 Grad Celsius?
208 -> 20,8 Grad Celsius?

Vielen Dank das Du den Code veröffentlichst.

Gruß Sven

von Rolf D. (rolfdegen)


Lesenswert?

Ich teste mit der aktuelle Firmware 199b9 von Klaus aus diesem Forum. 
Die Firmware liegt auf Github https://github.com/feelfree69/pps5330

Ich denke auch, dass es vielleicht noch einen kleinen Bug gibt, der das 
Problem verursacht. Mal schaun..

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..
Ich habe keinen Bug gefunden. Alles soweit ok. Nach einigen Test an der 
Hardware habe ich festgestellt, dass nur ein paar Ohm Unterschied schon 
einige Grad im Messwert ausmachen. Das kann am Multiplexer CD4051 mit 
seinen Schalter-Innenwiderständen ( R_on Widerstand) liegen. Oder aber 
an den Temperatursensoren die kleine Unterschiede in ihrer Kennlinie 
haben. Ich habe den Temperaturunterschied jetzt mit einem 
Reihenwiderstand von 51 Ohm am Temperatursensor kompensiert. Das scheint 
auch zu funktionieren. Aber bei höheren Temperaturen (65C) gibt ist bis 
zu einem Grad unterschied. Hab jetzt mal bei Reichelt 5 Stück von den 
KTY81-121 bestellt und werde diese dann in der Schaltung testen. Bin auf 
die Messwerte gespannt...

Gruß Rolf

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen
Manchmal ist man doch etwas vorschnell..
Der digitale Temperatursensor DS1820 braucht wohl etwas länger, bis sich 
die ausgelesenen Temperaturwerte stabilisieren. Im Vergleich mit dem 
KTY81-121 und dem zusätzlichen Reihenwiderstand von 51 Ohm stimmen die 
Werte jetzt bis auf +- 0.2C genau. Auch im oberen Temperaturbereich von 
65C ist kein nennenswerter Unterschied der Temperaturen feststellbar :)

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Wenn ich mich nicht verrechnet habe, beträgt bei der gegebenen 
Verschaltung der Spannungshub am AD-Wandler gerade mal 7mV/K.
Dann noch ein paar Toleranzen, dann wundert das Ergebnis nicht wirklich.
Aber es handelt sich ja auch um ein Netzteil und nicht um einen 
Präzisionsthermometer...

von Peter D. (peda)


Lesenswert?

Rolf D. schrieb:
> stimmen die
> Werte jetzt bis auf +- 0.2C genau.

Und was soll das bringen?
Es reicht völlig, die Temperatur des Kühlkörpers auf 5° genau zu messen. 
Zumal die Temperatur des Substrats wieder eine völlig andere ist.
CPUs haben nicht ohne Grund eine Meßdiode direkt auf dem Die.
Si-Dioden sind als Temperatursensor mit etwa -2mV/°K recht linear.

von Klaus R. (klaus2)


Lesenswert?

...es zu "können" :)

Schönes Projekt btw!

Klaus.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo..

Ich habe die Messung für Ripple & Noise beim PPS5330 Labornetzteil 
nocheinmal wiederholt, da ich bei der alten Messung keine Massefeder 
(Bild1) für den Tastkopf hatte. Dadurch hatte ich HF-Einstreuungen in 
der Messung.

Bild2 => Rippel & Noise ohne Last (Vpp 6.89mV)
Bild3 => Ripple & Noise mit Last 12V/1.6A Halogenlampe (Vpp 5.81)

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Thomas Z. schrieb:
> Rolf D. schrieb:
>> Messung des Ein- und Ausschaltverhaltens über den Standby-Taster am
>> PPS5330
>
> Das wird vermutlich an C21 (10uF) liegen. Den würde ich mal
> versuchsweise deutlich kleiner machen.

Habe den Elko C21 gegen einen 1uF ausgetauscht und versuchweise auch 
ohne Elko getestet. Hat leider nichts gepracht. Das Netzteil brauch bei 
Belastung über eine Sekunde bis die Spannung am Ausgang stabiel anliegt 
(siehe Bild).

Ich denke, dass das PWM-Signal für U-Soll und I-Soll im Standby auf Null 
stehen und wenn Standby den Ausgang einschaltet, die Regelung langsam 
das PWM Signal an den beiden Steuereingängen bis zum eingestellen 
Sollwert hochfährt ?

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Rolf D. schrieb:
> Ich denke, dass das PWM-Signal für U-Soll und I-Soll im Standby auf Null
> stehen und wenn Standby den Ausgang einschaltet, die Regelung langsam
> das PWM Signal an den beiden Steuereingängen bis zum eingestellen
> Sollwert hochfährt ?

Das würde aber doch bedeuten, dass die Standby Schaltung mit T9 / D10 
gar nicht benutzt wird um den Ausgang abzuschalten. Das sollte dann aber 
in der FW  zu sehen sein.

von Klaus (feelfree)


Lesenswert?

Thomas Z. schrieb:
> Das würde aber doch bedeuten, dass die Standby Schaltung mit T9 / D10
> gar nicht benutzt wird um den Ausgang abzuschalten. Das sollte dann aber
> in der FW  zu sehen sein.

Es werden (überflüssigerweise) sowohl die Standby-Funktion wie auch die 
PWM-Limits gesetzt.
 https://github.com/feelfree69/pps5330/blob/7f316769799e89947e692270dee4c7b2a2503abb/pps5330_fw.c#L1355

Beitrag #7624276 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Hab die Zeilen für das PWM-Limits entfernt. Die Messung mit einem 43 Ohm 
Widerstand und 5 Volt zeigt Bild1. Der Spannungsspitzenwert im 
Einschaltmoment liegt bei knapp 12V und sink innerhalb von 3.5ms auf den 
eingestellten Sollwert von 5 Volt. Hab das Ganze mal bei 2 Volt getestet 
(Bild2+3). Zum Vergleich mein Siglent SPD3303x Labornetzteil bei 5V 43 
Ohm Last (Bild4)

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Hab die Zeilen für das PWM-Limits entfernt

Und mit den Zeilen sieht's anders aus? Ich würde ja sagen, lieber 
langsam als zu kurzfristig zu viel Spannung....

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

das sieht allerdings nicht so gut aus. Das Regelverhalten ist 
unterirdisch. Was passiert wenn du nur die Spannung auf 0 bzw Sollwert 
stellst. Sollte dann schneller werden. War der Kondensator wieder 
eingebaut?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Keine Änderung bei Standby off. Das Regelverhalten ändert sich leider 
nicht. Entwerder man hat eine langsame steigende Ausgangspannung oder 
aber einen kurzen Spannunganstieg mit Spannungsspitzen größer U-Soll :(

Ich habe die Temperatursensoren jetzt kalibriert bekommen. Dazu habe ich 
einen Dallas DS1820 Temperatursensor (+- 0.5C) als Referenz benutzt. Die 
Temperaturwerte werden in meiner Firmware alternierend mit der 
Leistungsanzeige angezeigt (Bild1 und Video). Die Temperatur links ist 
die vom Kühlkörper und rechts vom Trafo.

Video: https://youtu.be/nk4u9k5hUBQ

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Da ich kein gutes Matheverständnis besitze, hatte ich etwas 
Schwierigkeiten die Kalibrierung der Temperaturwerte in eine Formel zu 
packen und auszurechnen. Also habe ich mich mit ständigen 
Vergleichmessungen für die beiden Werte calib_offset_temp und 
calib_factor_temp herangetastet, bis die Werte bei niedrigster und 
höchster Temperatur stabiel waren. War die Temperatur am Anfang richtig 
aber beim höchsten Stand zu niedrig, habe ich den calib_factor_temp 
etwas erhöht. Dadurch stieg die niedrige Temperatur am Anfag der Messung 
wieder. Also musste ich den calib_offset_temp Wert etwas erhöhen um den 
Anfangswert der Temperaturanzeige zu verringern. Das ware eine kleine 
Sisyphusarbeit die dann aber leztendlich zum Erfolg geführt hat..

Da beide Temperaturkanäle mit dem selben Temperatursensor 
unterschiedliche Messwerte anzeigen, musste ich die Kalibrierung für 
beide Temperatursensoren durchführen. Da der Messkanal für T2 etwas 
genauer arbeitet, habe ich diesen für den Kühlkörper vewendet. T1 ist 
der Trafo. Im Original ist es umgekehrt.

Aktuelle Kalibrierungswerte
Trafo T1 => calib_offset_temp1 = 5665
            calib_factor_temp1 = 182908

HeatS T2 => calib_offset_temp2 = 5910
            calib_factor_temp2 = 175608
1
//*************************************************************************
2
// print T measurement result (heat sink) and set Fan PWM/Overtemp alarm
3
//*************************************************************************
4
void print_T_heatsink_result(uint16_t meas_time)
5
{  
6
  #define calib_offset_temp2 5910
7
  #define calib_factor_temp2 175608
8
  
9
  uint16_t result = (((uint32_t)meas_time - calib_offset_temp2) * calib_factor_temp2) >> 16;
10
    
11
    if (Alternate_flag == TRUE)
12
    {
13
        print_T1_degree(result);
14
    }        
15
16
    result /= 100;
17
        
18
    // heat alert
19
    if (result >= 75)
20
    {
21
        wr_SPI_buffer4(Standby_On_cmd, set_standby);
22
        Standby_flag = 1;
23
        return;
24
    }
25
    else if (result >= 70)
26
    {
27
        wr_SPI_buffer3(set_overtemp);
28
        OCR0A = 255;    // set max Fan PWM
29
        return;
30
    }
31
    else if (result < 69)
32
    {
33
        wr_SPI_buffer3(clr_overtemp);
34
        
35
        if (result <= 35)
36
        {
37
            OCR0A = 20;    // set min Fan PWM
38
        }
39
        else
40
        {
41
            uint8_t fan_speed = ((result-31) * 4);  // calc fan_speed
42
            OCR0A = fan_speed;
43
        }
44
    }
45
}
46
47
48
//*************************************************************************
49
// print T measurement result (transformer)
50
//*************************************************************************
51
void print_T_transformer_result(uint16_t meas_time)
52
{  
53
  #define calib_offset_temp1 5665
54
  #define calib_factor_temp1 182908
55
    
56
    uint16_t result = (((uint32_t)meas_time - calib_offset_temp1) * calib_factor_temp1) >> 16;
57
    
58
    if (! (Memory_flag || Recall_flag))
59
    {  
60
    if (Alternate_flag == TRUE)
61
    {
62
      print_T2_degree(result);
63
    }
64
    }        
65
}

Gruß aus dem Bergischen Wuppertal. Rolf

: Bearbeitet durch User
Beitrag #7626723 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Um den langsamen Spannungsanstieg der Ausgangsspannung nach einem
Standby etwas schneller zu machen, habe einige Versuche mit der Firmware
gemacht.

Bild_1 Usoll und Isoll werden im Standby Mode auf Null gesetzt. Das 
Bild_1 zeigt den langsamen Spannungsanstieg wenn Standby ausgeschaltet 
wird.
1
 
2
// Standby on -------------------------------------------------------- 
3
            if (Standby_flag == 0) {
4
                set_standby_mode();
5
                set_Usoll(0);
6
                set_Isoll(0);
7
            }
8
            else // Standby off -------------------------------------------------------
9
            {
10
                set_Usoll(Ulimit);
11
                set_Isoll(Ilimit);
12
                clr_standby_mode();
13
             }

Bild_2 zeigt einen schnellen Spannungsanstieg mit Überschwinger in der
Ausgangsspannung wenn Usoll im Standby Mode nicht auf Null gesetzt wird.
1
// Standby on -------------------------------------------------------- 
2
            if (Standby_flag == 0) {
3
                set_standby_mode();
4
                //set_Usoll(0);
5
                set_Isoll(0);
6
            }
7
            else // Standby off -------------------------------------------------------
8
            {
9
                set_Usoll(Ulimit);
10
                set_Isoll(Ilimit);
11
                clr_standby_mode();
12
             }

Bild_3 zeigt einen schnellen Spannungsanstieg ohne Überschwingen in der
Ausgangsspannung wenn Usoll etwas kleiner ist als Ulimit.
1
// Standby on --------------------------------------------------------
2
            if (Standby_flag == 0) {
3
                set_standby_mode();
4
                set_Usoll(Ulimit - 1000);
5
                set_Isoll(0);
6
            }
7
            else // Standby off 
8
-------------------------------------------------------
9
            {
10
                set_Usoll(Ulimit);
11
                set_Isoll(Ilimit);
12
                clr_standby_mode();
13
             }

Bild_4 Leider funktioniert das nicht mehr, wenn Ulimit auf 3 Volt
eingestellt wird.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Original Standby Funktion von Klaus

Hehe, das ist noch Original dein Code :-)

> Bild_4 Leider funktioniert das nicht mehr, wenn Ulimit auf 3 Volt
> eingestellt wird.

Dann müsste man wohl keinen festen, sondern einen relativen offset 
einstellen.

Mit welchen Lasten hast du gemessen, Leerlauf?

von Rolf D. (rolfdegen)


Lesenswert?

Für diesen Test arbeite ich mit der letzten Firmware 199b9 von Klaus.
Die Messung habe ich mit und ohne Last gemacht. Macht in der 
Anstiegskurve keinen großen Unterschied.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Ich arbeite mit der letzten Firmware 199b9 von Klaus.

Schon klar. Nur habe diese Zeilen ursprünglich nicht ich geschrieben, 
sondern Du ;-)

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Ah.. hab gar nicht gesehen wer da schreibt ;)

Wird Zeit ins Bett zu gehen. Wünsch Dir eine gute Nacht :)

von Muk (muk)


Lesenswert?

Weil es zum Thema passt:

Habe gerade ein PPS 5330 abzugeben. Würde es für die Hälfte des NP 
abgeben. Also 90 Euro plus Versand. Kleiner Haken (?) – mir hatte das 
Design nicht gefallen und meinte es schwarz lackieren zu müssen. Hatte 
dann keine Lösung für Beschriftungen der Bedienelemente des Frontpanels 
und habe es dann einfach ohne benutzt – so viele Bedienelemente hat es 
ja nicht.

Würde es dann in der Rubrik Markt mit aussagekräftigen Fotos einstellen, 
wenn hier überhaupt Bedarf besteht.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo Muk

Kurze Frage: Hast du ein Scope zur Hand und kannst mal die 
Ausgangsspannungkurve beim Ausschalten der Standby Funktion messen. Wäre 
interessant wie das mit der ELV Original Firmware aussieht. Als 
Vergleich die Spannungskurve mit der neuen Firmware (Bild).

von Muk (muk)


Lesenswert?

Rolf, tut mir Leid. Mir steht kein Scope zur Verfügung. Könnte es im 
Raum zentrales Ruhrgebiet aber zu Messzwecken zur Verfügung stellen.

von Rolf D. (rolfdegen)



Lesenswert?

Um den langsamen Spannungsanstieg zu beschleunigen, könnte man einen 
Digital-/Analog-Wandler (LTC2644) einsetzen, der ein PWM-Eingangssignal 
innerhalb von weniger Mikrosekunden in eine stabile Gleichspannung 
umwandelt. Der Wandler wird zwischen den PWM-Steuerleitungen für U-soll 
und I-soll geschaltet und wandelt die PWM-Signale in eine Gleichspannung 
um. Da das PWM-Signal nur eine kleine Taktrate von 500Hz besitzt, 
benötigt dieser Wandler ein paar Millisekunden bis die Gleichspannung am 
Ausgang stabiel ansteht. Die Elkos C27 und C34 die für die Filterung des 
PWM-Signals zuständig sind, müssten dann entfernt werden.

Link: https://de.farnell.com/ltc2644-zweikanal-und-ltc2645-vierkanal-dau

von Walter (wripota)


Lesenswert?

Hallo Rolf,
das ist ja einfach super, was du da alles bewerkstelligst !
Ich hab nur diesbezüglich eine Frage - die ev. andere Forenmitglieder 
auch interessieren könnte - das Netzgerät hat doch (für den Nachbau) 
eine "unmögliche" Displayanzeige mit dem unmöglich sauber lötbaren 
Controllerbaustein auf der Frontplatte drauf.
Gibts da nicht eine "saubere" einfachere Lösung mit einem kompletten 
OLED (Auflösung für so eine Anwendung muß ja nicht "über drüber sein").
da würde ja die Lötarbeit für die Frontplatte auf ein Minimum reduziert 
sein, oder lieg ich da falsch ??

Gruß walter

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Machbar wäre das schon. Aber der Display-Controller IC201 steuert mit 
zwei Portleitungen die Standby-Funktion und das Umschalt-Relais für die 
Trafospannung. Dafür müsste man die (leider) an Masse liegenden 
Portleitungen ADC6 und ADC7 des ATmega88 Mikrocontroller IC200 freilegen 
und umprogrammieren (siehe Bild).

: Bearbeitet durch User
von Walter (wripota)


Lesenswert?

Hallo Rolf,
danke für Antwort.
Ich bin leider neu bei AVR, aber die Trafoumschaltung wäre ja  mit 
OPAmps machbar und die Displayplatine müßte ja eh neu entworfen 
werden....und die Standby ? könnte die Leitg. nicht weggelassen werden ?
Und die anderen Anschlüsse sind ja bei ähnlichen OLED (LCD) gleich ? 
Serielle Ansteuerung inkl.
Mich fasziniert einfach das Netzteil, weil ich brauch öfters an die 50 V 
(48) bei etwa 3 A
Gruß walter

von Klaus (feelfree)


Lesenswert?

Walter schrieb:
> Mich fasziniert einfach das Netzteil, weil ich brauch öfters an die 50 V
> (48) bei etwa 3 A

Dann taugt das überhaupt nicht, weil es nur 30V liefert.

Und selbst wenn das reichen würde, macht es ja überhaupt keinen Sinn, 
ein Netzteil praktisch komplett umzubauen, bis es den eigenen 
Anforderungen genügt. Da kauft man sich doch besser gleich etwas, was 
passt.

von Walter (wripota)


Lesenswert?

Hallo Klaus,
geb dir schon recht, aber
1.)geht`s mir primär um das Selbstaufbauen (bin ja schon in Pension)..
2.) hab ich jede Menge an Elektronikmaterial auf Lager (aktive u. 
passive )
3.)Und für die gewünschten 50 V hab ich jede Menge an RKT`s und
4.)für die Beschaffung ev. nicht vorhand. BT geb ich halt gerne ein Paar 
Euronen aus.
Aus meiner früheren Tätigkeit kenne ich ja das Problem Labornetzteil mit 
viel Welligkeit am Ausgang auch um eine Stange Geld.
Die mit niedr. Welligk. kosten halt Ende nie....(sogar für manche Fa. 
ein Problem ?)

Gruß Walter

von Klaus (feelfree)


Lesenswert?

Walter schrieb:

> 3.)Und für die gewünschten 50 V hab ich jede Menge an RKT`s

Was' das?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Als Display könnte man ein Oled ohne Schutzglas nehmen. Das hier z.B. EA 
OLEDL128-6LWA von Electronic Assebly. Das würde von den Abmessungen gut 
hinter die Front passen.

Link: 
https://www.reichelt.de/grafik-oled-128x64-68x51-mm-weiss-ohne-schutzglas-ea-oledl128-6lwa-p259375.html?PROVID=2788&gad_source=1&gclid=CjwKCAjwnv-vBhBdEiwABCYQA4bLkKCe-HUmgKIMOiLDULt281RqYZc5P3FEa5pyXRYeRkSxUPHtQRoCFdAQAvD_BwE

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Das würde von den Abmessungen gut
> hinter die Front passen.

Und dann braucht man neben einem neuen Display auch noch einen neuen 
Controller, weil die 8k Flash nie und nimmer reichen.

Ich halte es nach wie vor für eine Schnapsidee.

von Rolf D. (rolfdegen)


Lesenswert?

Das mit dem DAU (LTC2644) werde ich aber mal ausprobieren. Da muss man 
nicht groß was umbauen. 12Bit Auflösung für die Spannungs- und 
Stromsteuerung müssten reichen.

Spannungsauflösung 30V/4096 = 7mV
Stromauflösung 3A/4096 = 7uA

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> 7uA

0,7mA

von Rolf D. (rolfdegen)


Lesenswert?

Ups.. Da war wieder die Hand schneller als das Hirn ;)

Hab mal zwei LTC2644 geordert. Gibt's bei DigiKey.

Gruß Rolf

von Rolf D. (rolfdegen)



Lesenswert?

Hallöchen..

Kleiner Versuchsaufbau mit dem LTC2644 und der Spannungssteuerung im 
Netzteil. Die beiden bestellten Chips haben eine kleine Flugreise hinter 
sich und kamen als Express Lieferung aus Minnesota in den Vereinigten 
Staaten.

Der Versuchaufbau hat funktioniert. Ich habe die PWM Steuerleitung zum 
U-Soll Anschluss getrennt und an den LTS2644 Eingangspin IN_a gelötet. 
Ferner wurde der Glättungskondensator C34 am Eingang U-Soll entfernt und 
der Ausgang VoutA vom LTC2644 mit dem Eingang von U-Soll verbunden. Der 
Spannungsanstieg sieht jetzt viel besser aus. Die Ausgangsspannung 
steigt nach "Standby OFF"  innerhalb von weniger als 50ms auf das 
eingestellte U-Limit. Das ganze muss allerdings noch etwas optimiert 
werde. Da der LTC2644 ein paar Taktzyklen benötigt um aus dem 
PWM-Eingangssignal eine entsprechendes Gleichspannung zu erzeugen, 
entsteht am Ausgang eine kleine Verzögerung von weniger als 50ms bis die 
korrekte Spannung anliegt.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Leider hat sich beim testen mit dem LTC2644 gezeigt, das die 12Bit 
Auflösung (4096) für eine genaue Spannungseinstellung von 0-30V nicht 
ausreichen.

von Rolf D. (rolfdegen)



Lesenswert?

Hallöchen..

Ich habe eine andere Lösung für einen schnellen Spannungsanstieg nach 
einem Standby gefunden. Diese Lösung funktioniert ohne LTC2644 und mit 
Standart Bauteilen. Siehe Schaltungsskitze (1+2 Bild).

Schaltungsbeschreibung. Wenn die Standby-Funktion aktiviert wird, dann 
wird das PWM-Signal am U-Soll Eingang nicht mehr abgeschaltet, sondern 
ein CMOS Schalter IC1 schaltet die gleichgerichtete PWM-Spannung vor dem 
Regler-Eingang  IC4 Pin ab. Das Schaltsignal für den CMOS Schalter 
erhält das IC vom invertierten Standby-Signal. Vorteil dieser Schaltung 
ist, dass die Zeitdauer für die Gleichrichtung des PWM-Signals keinen 
großen Einfluss mehr auf die Spannungsanstiegzeit am Netzteil-Ausgang 
hat.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Jetzt ist mir auf dem Panel PCB leider der Mikrocontroller ATmega88PA 
abgeraucht. Hab ihn durch einen ATmega88-20 AU ersetzt. Funktioniert 
allerdings nicht so richtig. Beim ändern der Stromstärke stürzt die 
Software ab. Was kann das jetzt sein !?  Mal schaun...

von Rolf D. (rolfdegen)


Lesenswert?

So.. Eine Kalte Lötstelle am SMD Mikrocontroller war die Ursache für die 
ständigen Abstürze. Jetzt läuft das Netzteil stabiel. Ich hoffe ;)

Ich werde die gleiche Testschaltung auch für den I-Soll Anschluss machen 
und das Ganze auf eine kleine Lochraster Platine löten und ins Netzteil 
einbauen. Ein gebrauchtes PPS5330 Netzteil mit Original ELV-Firmware ist 
auch schon unterwegs zu mir. Wenn es eintrifft werde ich 
Vergleichsmessungen machen können. Ich bin gespannt..

von Rolf D. (rolfdegen)


Lesenswert?

Da ich schon mal dabei war den defekten Mikrocontroller Chip ATmega88PA 
auszulöten, habe ich gleich den 8MHz Quarz gegen einen 20MHz Quarz 
ersetzt. Das hat zur Folge, das die PWM-Frequenz von 488Hz auf 1.220Hz 
steigt und die Ausgangspannung einen kleineren Rippel & Noise hat.

von Walter (wripota)


Lesenswert?

Hallo Rolf,

Hab da ein Datenblatt vom AD7660 entdeckt. Wäre das was wegen der 12 bit 
?
Kann 16 Bit; 2,5V input; Parallel od. seriell

LG

von Klaus (feelfree)


Lesenswert?

Walter schrieb:
> Hallo Rolf,
> Hab da ein Datenblatt vom AD7660 entdeckt. Wäre das was wegen der 12 bit
> ?
> Kann 16 Bit; 2,5V input; Parallel od. seriell
> LG

Wenn man Spannung/Strom mittels 12 bit PWM einstellen kann, macht es 
wenig Sinn, den Wert mit 16 bit zurückzulesen.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Moin Rolf, wie ich sehe, krempelst du das Netzgerät ja ziemlich um. 
Wissen "Die" in Leer das eigentlich? Das relativ langsame Ansteigen der 
Ausgangsspannung hat mich auch immer gestört, viele µC starten nicht.
Eine andere Sache, wenn ich einen U/I-Memorywert abrufe, kann man die 
vorgegebenen Werte ohne weitere Nachfrage erhöhen (hat mich mal 96 
WS2812 gekostet). Kann man da irgendwas einbauen?
Schönen Sonntag noch

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo Walter
Der AD7660 ist ein 16Bit AnalogDigital-Wandler im klassichen Sinne und 
besitzt am Ausgang ein digitales Interface um die Daten mit einer MCU 
o.Ä. weiter zu verarbeiten. Das wäre für das Netzteil ein zu großer 
Bauteilaufwand. Außerdem müsste man das PWM-Signal vom ATmega erst 
gleichgerichtet, um es an den Eingang des AD7660 zu führen.

Im PPS5330 Netzteil wird die Sollwert-Vorgabe für Spannung und Strom von 
der Atmega MCU mit PWM-Signalen realisiert. Die PWM-Signale (488Hz) 
werden über einen Tiefpassfilter in eine proportionale Gleichspannung 
gewandelt. Das Problem im Netzteil ist die niedrige PWM-Frequenz von 
488Hz und der Tiefpassfilter (R53 + C34) mit einer Grenzfrequenz von 
0.2Hz. Eine schnelle Spannungs- und Stromregelung ist damit nicht 
möglich.

Mit meiner kleine Trick-Schaltung (Bild) und einer Änderung in der 
Software (PWM-Signal wird im Standby-Mode nicht mehr abgeschaltet) 
erreiche ich, dass der Spannungs- und Stromanstieg beim Ein- und 
Ausschalten über den Standby-Taster sehr schnell ist (< 50ms) und keine 
1.4 Sekunden mehr benötigt.

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Thomas G. schrieb:
> Eine andere Sache, wenn ich einen U/I-Memorywert abrufe, kann man die
> vorgegebenen Werte ohne weitere Nachfrage erhöhen (hat mich mal 96
> WS2812 gekostet). Kann man da irgendwas einbauen?

Verstehe ich dich richtig: Du willst verhindern, dass Du die 
Einstellungen aus Versehen (Fehlbedienung) falsch einstellst?
Dafür gibt es die Tastenkombination langer Druck auf "<-" und "->", mit 
der das Bedienpanel gesperrt wird.

Beim Abrufen der gesicherten Werte funktioniert meine Firmware so:
Druck auf "Recall", dann blinken Memory-Nr, U-Soll und I-Soll Werte, mit 
dem Drehencoder kann die Memory-Nr gewählt werden, und mit Druck auf 
Enter wird die Einstellung aktiv.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Thomas G. schrieb:
> Moin Rolf, wie ich sehe, krempelst du das Netzgerät ja ziemlich um.
> Wissen "Die" in Leer das eigentlich? Das relativ langsame Ansteigen der
> Ausgangsspannung hat mich auch immer gestört, viele µC starten nicht.
> Eine andere Sache, wenn ich einen U/I-Memorywert abrufe, kann man die
> vorgegebenen Werte ohne weitere Nachfrage erhöhen (hat mich mal 96
> WS2812 gekostet). Kann man da irgendwas einbauen?
> Schönen Sonntag noch

Von der Hardware ist der Aufwand nicht groß. Nur ein paar Bauteile. Die 
Software hat Klaus hier aus dem Forum überarbeitet und auf Github 
bereitgestellt. Das Abrufen der U/I-Memorywerte hat der gute Klaus schon 
geändert. Wenn mit Taster "Recall" Memorywerte abgerufen werden, blinken 
die neuen Werte U-Limit/I-Limit und müssen mit "Enter" bestätigt werden. 
Will man das nicht, kann mit einem erneuten Tastendruck auf "Recall" die 
Funktion abgebrochen werden. Ob das in der Original Firmware von ELV 
auch so funktioniert weis ich nicht. Aber Morgen bekomme ich ein zweites 
Gerät mit der ELV Firmware und kann das testen.

Gruß Rolf

: Bearbeitet durch User
von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Das funktioniert soweit wie von ELV vorgesehen. Was ich meine ist, dass 
ich eine Einstellung abrufen kann, und diese beliebig, natürlich auch 
aus versehen, erhöhen kann. Das nach einem Memory-Recall automatisch die 
Tastensperre gesetzt ist wäre natürlich auch eine Möglichkeit.

Beitrag #7643323 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen.. :)
Ich habe den Umbau jetzt erfolgreich abgeschlossen und mit zwei
anderen Netzteilen verglichen. Netzteil_1 ist mein umgebautes PPS5330 
ELV Netzteil. Netzteil_2 ist das Original ELV Netzteil mit unverändeter 
Software. Netzteil_3 ein Siglent SPD3303X Labornetzteil.

Zuerst habe ich bei jedem Netzteil den Spannungsanstieg nach einem 
Standby (Standby_OFF) gemessen (Bild 1-3). Die Ausgangsbelastung lag bei 
30/V und 1A. Danach habe die Konstantstromregelung bei 5 Volt und 500mA 
gemessen (Bild 4-6.

Bild_1 "Standby off" PPS5330 mein Umbau (timebase 50ms)
Bild_2 "Standby off" PPS5330 ELV Original (timebase 500ms)
Bild_3 "Standby off" Siglent SPD3303X (timebase 50ms)

Bild_4 "CC Funktion" PPS5330 mein Umbau (timebase 200ms)
Bild_5 "CC Funktion" PPS5330 ELV Original (timebase 500ms)
Bild_6 "CC Funktion" PPS5330 Siglent SPD3303X (timebase 200ms)

Bild_7 Der Umbau

Schaltplan und Umbauanleitung folgt..

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..

Ich bin kein großer Mathematiker und tu mich etwas schwer mit der 
Berechnung der Temperaturkompensation für das Netzteil. Wie könnte man 
so etwas bewerkstelligen ?

Messwert beim Kaltstart:    5.013V/100mA 22°C
Messwert nach einer Stunde: 5.000V/100mA 40°C

von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
>
> Messwert beim Kaltstart:    5.013V/100mA 22°C
> Messwert nach einer Stunde: 5.000V/100mA 40°C

Differenz:                    0.013V       -18K
Kompensation(Div durch -18): -0.7 mV/K

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

so ganz grob driftet deine Spannung also mit -0.5mV / C°. (In der 
Hoffnung dass das linear ist)  Bei dem Messprinzip wirst du da nicht 
sehr viel machen können. Wie Mawin vor einiger Zeit geschrieben hat, ist 
der Wandler halt ungenau. Es hindert dich aber niemand daran die PWM 
Inkremente z.B alle 5 min mit der Temp zu verknüpfen.

Die Regelung ist ja voll analog, Die CPU gibt ja nur die Sollwerte vor.

edit: Klaus war schneller

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Danke für die Unterstützung. In der letzten Firmware Version 199b9 von 
Klaus gibts noch ein kleines Problem. Die Tastenabfrage prellt etwas und 
die Tastenfunktion wird erst nach dem Loslassen der Taste aktiviert. 
Besonders die Standby- Taste prellt sehr stark.

Gruß Rolf

von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..
Hab noch ein kleines Problem in der neuen Firmware entdeckt. Bei 
Belastung sinkt die Ausgangsspannung im umgebauten Netzteil stetig. Am 
Original ELV Netzteil (schwarz) stabilisiert sich die Ausgangspannung 
nach einer Weile (siehe Video).

Video: https://youtu.be/FvQBmEi_dog

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Die Tastenabfrage prellt etwas und
> die Tastenfunktion wird erst nach dem Loslassen der Taste aktiviert.
> Besonders die Standby- Taste prellt sehr stark.

warum nimmst du nicht PeDas Entprellroutine?

von Thomas Z. (usbman)


Lesenswert?

Rolf D. schrieb:
> Belastung sinkt die Ausgangsspannung im umgebauten Netzteil stetig.

Die Drift ist ja nur im mV Bereich und liegt innerhalb der 
Anzeigegenauigkeit. Ich würde das ignorieren, solange das nicht einige 
10mV sind.

Wie hoch ist den die Spannungsänderung pro PWM inkrement?

von Klaus (feelfree)


Lesenswert?

Thomas Z. schrieb:
> Rolf D. schrieb:
>> Belastung sinkt die Ausgangsspannung im umgebauten Netzteil stetig.
>
> Die Drift ist ja nur im mV Bereich und liegt innerhalb der
> Anzeigegenauigkeit. Ich würde das ignorieren, solange das nicht einige
> 10mV sind.
>
> Wie hoch ist den die Spannungsänderung pro PWM inkrement?

Hab's auch schon auf github kommentiert.
Die minimale Schrittweite pro PWM inkrement beträgt 1,8mV. Man könnte 
also 2mV Abweichung durchaus ausgleichen, aber: Die Schrittweite des 
AD-Wandlers beträgt nur 7,2mV.
Es macht also keinen Sinn, da was dran zu drehen.

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Klaus schrieb:
> Die minimale Schrittweite pro PWM inkrement beträgt 1,8mV. Man könnte
> also 2mV Abweichung durchaus ausgleichen, aber: Die Schrittweite des
> AD-Wandlers beträgt nur 7,2mV.

Versteh ich jetzt nicht so ganz. Laut Beschreibung hat der AD-Wandler 
doch eine Auflösung von 14Bit (1.8mV) !?

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Rolf D. schrieb:
> Laut Beschreibung hat der AD-Wandler
> doch eine Auflösung von 14Bit (1.8mV) !?

Ah ich dachte 12 bit.... war wohl wg. dem LTC2644 weiter oben....

Dann kannst Du die Regelung die in deiner Firmware drin war ja wieder 
einbauen und schauen wieviel es bringt.
Solltest aber die Regelung beim Übergang Standby->Aktiv erstmal 
totlegen, sonst wird's wohl üble Überschwinger geben....
Oder vermutlich einfacher: Nur wenn die Soll/Ist-Abweichung kleiner 
einer Schwelle (z.B. 20mV) ist, wirklich nachregeln.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Rolf D. schrieb:
> Versteh ich jetzt nicht so ganz.

Rolf du nutzt doch einen AVR?

Dann könntest du doch Peter Danneggers Entprellroutine nutzen. (die 
funktioniert auch mit einem ESP32, muss halt nur angepasst werden, 
andere Timer, andere Register.

von Klaus (feelfree)


Lesenswert?

Joachim B. schrieb:
> Entprellroutine

Falsches Thema.
Die Entprellung der Standby-Taste hab' ich wohl vermasselt, als ich die 
Tastenerkennung um "Longpress" und "mehrere Keys gleichzeitig" erweitert 
habe. Bei meinen Tests hat ich kein Prellen festgestellt, aber das kann 
ja auch an meiner Taste gelegen haben.
Ist alles im github.

Beitrag #7646272 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Lesenswert?

Ich denke ich habe das Problem mit der Spannungsdrift gefunden. Alle 
Belastungsmessungen habe ich immer mit 5.00V gemacht. Bei Belastung sank 
die gemessene Ausgangspannung stetik und der angezeigte Spannungswert 
auf dem Display blieb immer auf 5.00V stehen.  Ich habe die Messungen 
dann mit 6.00V gemacht und festgestellt, dass die Ausgangspannung mit 
zunehmender Belastung nachgeregelt wurde und das Display den korrekten 
Spannungswert anzeigt.

Neues Video: https://youtu.be/1WIm6SWlFUY

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Von welcher Spannungsdrift sprichst du eigentlich, immer noch von dem 
guten Millivolt aus deinem Video?

Edit, ah gerade ins Neue Video reingeschaut. Das läuft wohl die 
Spannungsmessung aus irgendeinem Grund nicht richtig.

Edit2: bei 5V werden dauernd 5,00V angezeigt, bei 6V 5,99V.

Und nochmal: Es gibt keine Regelung im Digitalteil!

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Das Video zeigt das Problem etwas genauer. Bei genau 5.00V wird die 
Ausgangsspannung nicht korrekt angezeigt. Bei anderen 
Spannungseinstellungen z.B. 5.10V ist die Spannungsanzeige annähernd 
richtig.

Video: https://youtu.be/SqReOx2EAOY

von Klaus (feelfree)


Lesenswert?

Siehe github. Es macht keinen Sinn, ein und dasselbe an 2 verschiedenen 
Orten zu diskutieren.

von Joachim B. (jar)


Lesenswert?

Klaus schrieb:
> Falsches Thema.
> Die Entprellung der Standby-Taste hab' ich wohl vermasselt,

als Autor in Github?

weil Rolf das schrieb dachte ich an seine eigenen Änderungen.

Wer behebt nun das Prellproblem?

von Rolf D. (rolfdegen)


Lesenswert?

Joachim B. schrieb:
> weil Rolf das schrieb dachte ich an seine eigenen Änderungen.
>
> Wer behebt nun das Prellproblem?

Hallo Joachim
Ich habe die Firmware von Klaus für die modefizierte Hardware angepasst 
und werde die am Wochenende auf github bereitstellen. Da ist denn auch 
das Tastenprellen beseitigt.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Hallöchen..
Eine neue Firmware 2.00 mit angepasster Prellzeit und 
Hardwaremodifikation steht jetzt auf meiner github Seite zur Verfügung. 
Schaltplan für den Umbau folgt. Um die Temperaturanzeige von Heatsink 
und Transformator zu unterscheiden, habe ich die Anzeigedauer für den 
Heatsink etwas länger programmiert. Die Trafo-Temperatur wird im Wechsel 
mit der Heatsink-Temperatur nur kurz angezeigt.

Github: https://github.com/rolfdegen/PPS5330_PowerSupply_mod

Kleines Video: https://youtu.be/KPteA9frJQY

Gruß Rolf

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.