09.09.2016, 06:37 PM
PBG12201 Plasma Bargraph Display - reloaded
|
09.09.2016, 06:40 PM
https://de.wikipedia.org/wiki/Low_Voltag..._Signaling
Das ist doch serielle Highspeed-Übertragung, meines Erachtens auch zeitkritisch.
Das ist doch serielle Highspeed-Übertragung, meines Erachtens auch zeitkritisch.
09.09.2016, 07:14 PM
Ich verstehe leider immer noch nicht, worauf du hinaus willst.
Mit den diversen provisorischen Hilfsspannungsquellen sieht der erste funktionierende Aufbau so aus:
Ich hab extra Platz gelassen für 2 weitere Displays... man weiss ja nie.
Der komplette Code... schon mit Schnickschnack wie der Umschaltung zwischen linearer und logarithmischer Skalierung (Arduino Programmierumgebung):
Nach Lieferung dieses Codes hat sich der Russe, für den ich das gemacht habe, nicht mehr gemeldet . Mein Fokus für die Entwicklung hat sich danach verschoben, da ich nicht an Mischpulten mit vielen Anzeigen interessiert bin. Für mich ist maximal eine Stereoanzeige sinnvoll...
Ich hab extra Platz gelassen für 2 weitere Displays... man weiss ja nie.
Der komplette Code... schon mit Schnickschnack wie der Umschaltung zwischen linearer und logarithmischer Skalierung (Arduino Programmierumgebung):
Code:
// Bargraph @ Teensy 2.0
// Version 0.1beta
#include <FlexiTimer2.h>
#include <math.h>
const byte Frequency = 67; // Zielfrequenz des Displays in Hz
const byte Segments = 201; // Anzahl der Segmente des Displays
const byte Phases = 3; // Anzahl der Phasen des Displays (maximal 5)
const byte ResetPin = 5; // Resetanschluss
const byte InputPin_1 = 21; // Eingangspins
const byte InputPin_2 = 20; // Eingangspins
const byte InputPin_3 = 19; // Eingangspins
const byte InputPin_4 = 18; // Eingangspins
const byte LinLogPin = 23; // Lin-Log-Umschalt-Pin
const byte AnodePin_1 = 6; // Anodenpins
const byte AnodePin_2 = 7; // Anodenpins
const byte AnodePin_3 = 8; // Anodenpins
const byte AnodePin_4 = 9; // Anodenpins
const byte Umax = 5; // Maximalspannung am Analog-Input
const float Ustep = 0.004888;// Spannung zwischen 2 ADC-Werten
volatile int Actual_Phase; // Zähler für die Phasensteuerung
volatile int Old_Phase; // Zähler für die Phasensteuerung
volatile int Actual_Segment = 1; // Zähler für die Phasensteuerung
int Input_1 = 0; // Analogspeichervariable
int Input_2 = 0; // Analogspeichervariable
int Input_3 = 0; // Analogspeichervariable
int Input_4 = 0; // Analogspeichervariable
int InputScaler; // Faktor zur Skalierung der ADC-Werte auf die Segmentzahl (lineare Anzeige)
int Balken_1 = 0; // Variable für die aktuelle Balkenlänge
int Balken_2 = 0; // Variable für die aktuelle Balkenlänge
int Balken_3 = 0; // Variable für die aktuelle Balkenlänge
int Balken_4 = 0; // Variable für die aktuelle Balkenlänge
double dBV; // dBV log
int LogTab[1024]; // LogTabelle ADC-Werte - Segmente
void flush() { // Interrupt service routine zur Phasensteuerung
switch (Actual_Segment) {
case Segments: // Das letzte Segment erreicht?
digitalWrite(Actual_Phase, LOW); // Das letzte Segment abschalten
digitalWrite(ResetPin, HIGH); // Reset des Displays
Actual_Segment = 1; // Rücksetzen der Zähler
Actual_Phase = Phases; // Rücksetzen der Zähler
digitalWrite(AnodePin_1, LOW); // Anoden wieder einschalten
digitalWrite(AnodePin_2, LOW); // Anoden wieder einschalten
digitalWrite(AnodePin_3, LOW); // Anoden wieder einschalten
digitalWrite(AnodePin_4, LOW); // Anoden wieder einschalten
break;
default: // Kern der Displaysteuerung
Actual_Segment++; // Zeiger auf das aktuelle Segment erhöhen
if (Balken_1 < Actual_Segment) digitalWrite(AnodePin_1, HIGH); // Bei Solllänge des Balkens wird die Anode abgeschaltet
if (Balken_2 < Actual_Segment) digitalWrite(AnodePin_2, HIGH); // Bei Solllänge des Balkens wird die Anode abgeschaltet
if (Balken_3 < Actual_Segment) digitalWrite(AnodePin_3, HIGH); // Bei Solllänge des Balkens wird die Anode abgeschaltet
if (Balken_4 < Actual_Segment) digitalWrite(AnodePin_4, HIGH); // Bei Solllänge des Balkens wird die Anode abgeschaltet
Old_Phase = Actual_Phase++; // Zeiger auf die aktuelle Phase erhöhen und den alten Wert sichern
if (Actual_Phase > Phases - 1) Actual_Phase = 0; // Phase overflow auf Null
digitalWrite(Actual_Phase, HIGH); // Das nächste Segment anschalten
digitalWrite(Old_Phase, LOW); // Das alte Segment ausschalten
digitalWrite(ResetPin, LOW); // Reset deaktivieren, falls aktiv
break;
}
}
void setup() {
pinMode(0, OUTPUT); // Die Pins für maximal 5 Phasen werden als Output-Pins definiert
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(ResetPin, OUTPUT); // Resetpin wird als Output-Pin definiert
pinMode(LinLogPin, INPUT_PULLUP); // Pin offen: linear, Pin mit GROUND verbunden: logarithmisch
pinMode(AnodePin_1, OUTPUT);
pinMode(AnodePin_2, OUTPUT);
pinMode(AnodePin_3, OUTPUT);
pinMode(AnodePin_4, OUTPUT);
Actual_Phase = Phases;
InputScaler = 1024/Segments; // Faktor zur Skalierung der ADC-Werte auf die Segmentzahl (lineare Anzeige)
// Logtabelle schreiben
LogTab[0] = 1; // Fade out unter -45dBV, relativ zum Maximalpegel
LogTab[1] = 2;
LogTab[2] = 3;
LogTab[3] = 3;
LogTab[4] = 4;
LogTab[5] = 4;
for(int x = 6; x < 1024; x++) { // Berechnung der Log-Tabelle
dBV = 20.0 * log10(x * Ustep / Umax);
LogTab[x] = 4.4 * dBV + Segments;
}
digitalWrite(ResetPin, HIGH); // Reset des Displays
FlexiTimer2::set(1, 1.0/(Frequency*Segments), flush); // Definition des Timerinterrupts
FlexiTimer2::start(); // Aktivierung des Interrupts
}
void loop() { // Hauptprogramm
Input_1 = analogRead(InputPin_1); // ADC
Input_2 = analogRead(InputPin_2);
Input_3 = analogRead(InputPin_3);
Input_4 = analogRead(InputPin_4);
switch (digitalRead(LinLogPin)) {
case HIGH: // Default linear, interner Pullup-Widerstand ist aktiviert
Balken_1 = Input_1/InputScaler; // lineare Skalierung der ADC-Werte auf die Segmentzahl
Balken_2 = Input_2/InputScaler; // lineare Skalierung der ADC-Werte auf die Segmentzahl
Balken_3 = Input_3/InputScaler; // lineare Skalierung der ADC-Werte auf die Segmentzahl
Balken_4 = Input_4/InputScaler; // lineare Skalierung der ADC-Werte auf die Segmentzahl
break;
case LOW: // Logarithmisch
Balken_1 = LogTab[Input_1]; // Lesen der Log-Tabelle
Balken_2 = LogTab[Input_2];
Balken_3 = LogTab[Input_3];
Balken_4 = LogTab[Input_4];
break;
}
}
Nach Lieferung dieses Codes hat sich der Russe, für den ich das gemacht habe, nicht mehr gemeldet . Mein Fokus für die Entwicklung hat sich danach verschoben, da ich nicht an Mischpulten mit vielen Anzeigen interessiert bin. Für mich ist maximal eine Stereoanzeige sinnvoll...
Einmal in Betrieb - direkt unter einer 40W-Halogenlampe, damit man was sieht .
Interferenzen versauen ein wenig das Bild, die Leuchtbalken sind absolut gleichmässig und mit 70Hz auch flimmerfrei.
Interferenzen versauen ein wenig das Bild, die Leuchtbalken sind absolut gleichmässig und mit 70Hz auch flimmerfrei.
10.09.2016, 08:57 AM
(Dieser Beitrag wurde zuletzt bearbeitet: 10.09.2016, 08:58 AM von buyman.)
(09.09.2016, 07:14 PM)kahlo schrieb: Ich verstehe leider immer noch nicht, worauf du hinaus willst.
Darauf, dass serielle Verbindungen für zeitkritische Signale problemlos verwendet werden können. LVDS diente da nur als Beispiel. Ein bekannteres Beispiel wäre SATA - auch eine serielle Schnittstelle
(Welche noch dazu die parallele Variante (IDE/P-ATA) abgelöst hat, weil diese technisch am "Ende" war, also die parallele Übertragung per Kabel technisch nicht mehr sinnvoll umzusetzen war.)
10.09.2016, 01:13 PM
(10.09.2016, 08:57 AM)buyman schrieb:Das ist ja alles ganz schön, aber wozu? Im Augenblick kann ich ohne Probleme 4 Displays ansteuern. Da der Teensy 12 Analogeingänge hat, könnte man mit viel zusätzlichem Aufwand auch 6 Displays schaffen. Das ist sinnlos, wenn man einfach einen zweiten Teensy danebenstellen kann.(09.09.2016, 07:14 PM)kahlo schrieb: Ich verstehe leider immer noch nicht, worauf du hinaus willst.
Darauf, dass serielle Verbindungen für zeitkritische Signale problemlos verwendet werden können. LVDS diente da nur als Beispiel. Ein bekannteres Beispiel wäre SATA - auch eine serielle Schnittstelle
(Welche noch dazu die parallele Variante (IDE/P-ATA) abgelöst hat, weil diese technisch am "Ende" war, also die parallele Übertragung per Kabel technisch nicht mehr sinnvoll umzusetzen war.)
Es gibt übrigens ein Zeitfenster von etwa 71us zwischen 2 Interrupts, das schon ganz gut gefüllt ist.
10.09.2016, 04:11 PM
Rückblick auf die Zieldefinition im Posting #5 :Ein universelles Ansteuerungsprogramm für mindestens 6 Balken (3 Displays), dass durch simple Variablen auf alle Displays angepasst werden kann. Das Ziel ist erreicht. Allerdings ist mein russischer "Kunde" abgesprungen. Vielleicht war ihm mein Engagement in bester Guckimanie zu heftig. Damit habe ich keine Verwendung mehr für das Programm.
Neue Zieldefinition: Ein überhaupt nicht universelles Ansteuerungsprogramm für genau ein Display, mit guter Peripherie und gleich mit einem Audioverstärker dran.
Neue Zieldefinition: Ein überhaupt nicht universelles Ansteuerungsprogramm für genau ein Display, mit guter Peripherie und gleich mit einem Audioverstärker dran.
10.09.2016, 04:47 PM
Ich bin für ohne Audioverstärker dran. Dafür mit kleinem DCDC-Wandler.
10.09.2016, 07:53 PM
Mein Problem ist dabei, dass ich erstmal bis zu dem Stand von heute dokumentieren muss . Dazu fehlt noch:
Wenn es jemand für andere Zwecke verwendet - kein Problem. Baut mal los . Theoretisch ist schon genug geposted, dass Nach- und Umbauten möglich sind.
- Der DC-DC-Wandler zu Spannungsversorgung,
- Die Signalaufbereitung vor den analogen Eingängen.
Wenn es jemand für andere Zwecke verwendet - kein Problem. Baut mal los . Theoretisch ist schon genug geposted, dass Nach- und Umbauten möglich sind.
Zur Signalaufbereitung für den analogen Input: Der ADC sollte eine Spannung zwischen 0..5V serviert bekommen. Diese 0..5V sollten die Amplitude des Audiosignals möglichst genau repräsentieren. Ich muss also ein Wechselspannungssignal in Gleichstrom wandeln.
Vor 10 Jahren habe ich das dilettantisch gelöst, einfach einen Vorverstärker mit anschliessender Gleichrichtung. Den Link auf die Schaltung traue ich mich nicht zu posten... . Diesmal war ich besser. Die Schaltung um den OPV ist ganz lustig und funktioniert etwas anders als normal .
Die Simulation
Envelope.asc (Größe: 2,22 KB / Downloads: 625)
und das Zubehör
Poti.lib (Größe: 129 Bytes / Downloads: 564)
poti.asy (Größe: 552 Bytes / Downloads: 597)
Die LED's haben eine Doppelfunktion. Zum Einen zeigen sie Klipping optisch an (wenn das Signal begrenzt werden muss, um die 5V für den ADC nicht zu überschreiten). Zum Anderen begrenzen sie die Ausgangsspannung auf maximal 5V. Sie sind also selektiert. Die restlichen Gemeinheiten der OPV-Beschaltung sind am besten beim Simulieren zu sehen...
Das Ding ist genau. Wie genau, sieht man beim Plotten von Input und Output (Output/5, für den direkten Vergleich):
Grosssignal
Eine Zehnerpotenz kleiner
Das Limit sieht man bei der nächsten Zehnerpotenz
Der schnelle Lochrasteraufbau in Stereo funktioniert exakt nach Plan .
Vor 10 Jahren habe ich das dilettantisch gelöst, einfach einen Vorverstärker mit anschliessender Gleichrichtung. Den Link auf die Schaltung traue ich mich nicht zu posten... . Diesmal war ich besser. Die Schaltung um den OPV ist ganz lustig und funktioniert etwas anders als normal .
Die Simulation
Envelope.asc (Größe: 2,22 KB / Downloads: 625)
und das Zubehör
Poti.lib (Größe: 129 Bytes / Downloads: 564)
poti.asy (Größe: 552 Bytes / Downloads: 597)
Die LED's haben eine Doppelfunktion. Zum Einen zeigen sie Klipping optisch an (wenn das Signal begrenzt werden muss, um die 5V für den ADC nicht zu überschreiten). Zum Anderen begrenzen sie die Ausgangsspannung auf maximal 5V. Sie sind also selektiert. Die restlichen Gemeinheiten der OPV-Beschaltung sind am besten beim Simulieren zu sehen...
Das Ding ist genau. Wie genau, sieht man beim Plotten von Input und Output (Output/5, für den direkten Vergleich):
Grosssignal
Eine Zehnerpotenz kleiner
Das Limit sieht man bei der nächsten Zehnerpotenz
Der schnelle Lochrasteraufbau in Stereo funktioniert exakt nach Plan .
18.09.2016, 04:35 PM
Die Plasmabalken brauchen 2 Betriebsspannungen: 245V an den Anoden und eine Hilfsspannung von etwa 70V. Im Jahr 2005 baute ich dafür eine platzsparende, aber unelegante und hitzige Step-up-Schaltung mit dem MC34063 auf. Die war schon sehr kompakt...:
Im Dauerbetrieb erzeugte sie aber eine Hitze, dass ich um den Mosfet fürchtete. Also diesmal was Neues. Es musste auch nicht so winzig sein, dafür gut. Deshalb nun:
Meine Løtzinnrolle ist signifikant kleiner geworden :
Gebaut rund um den L6561 oder FAN7527, wandelt er von 12..20V Eingangsspannung zu 250V / 15mA am Ausgang. Die Drossel bekam eine kleine Zusatzwicklung (15 Windungen). Ansonsten ist alles lange erprobtes Lochrasterlayout . In der Dimensionierung kann die Schaltung 2 Displays (4 Balken) versorgen, eventuell auch 3.
Die 70V Hilfsspannung macht eine 68V Z-Diode...
Im Dauerbetrieb erzeugte sie aber eine Hitze, dass ich um den Mosfet fürchtete. Also diesmal was Neues. Es musste auch nicht so winzig sein, dafür gut. Deshalb nun:
Meine Løtzinnrolle ist signifikant kleiner geworden :
Gebaut rund um den L6561 oder FAN7527, wandelt er von 12..20V Eingangsspannung zu 250V / 15mA am Ausgang. Die Drossel bekam eine kleine Zusatzwicklung (15 Windungen). Ansonsten ist alles lange erprobtes Lochrasterlayout . In der Dimensionierung kann die Schaltung 2 Displays (4 Balken) versorgen, eventuell auch 3.
Die 70V Hilfsspannung macht eine 68V Z-Diode...
18.09.2016, 06:03 PM
(Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2016, 06:03 PM von Black_Chicken.)
Hey Cool, genau vor 2 Wochen habe ich mir überlegt ob man nicht einen standard-PFC Controller-IC verwenden kann um einen Boost-Wandler in BCM zu realiseren. Gefällt!
18.09.2016, 06:06 PM
(18.09.2016, 06:03 PM)Black_Chicken schrieb: Hey Cool, genau vor 2 Wochen habe ich mir überlegt ob man nicht einen standard-PFC Controller-IC verwenden kann um einen Boost-Wandler in BCM zu realiseren. Gefällt!Man kann! mache ich schon seit ca 10 Jahren so
...mit der Lizenz zum Löten!
19.09.2016, 12:22 PM
19.09.2016, 12:39 PM
boundary conduction mode (BCM).
Don't worry about getting older. You're still gonna do dump stuff...only slower
19.09.2016, 02:42 PM
Nun ja - ok. Jetzt kenn ich auch den Fachbegriff und seine Abkürzung . Aber ich kann bestätigen, dass das Prinzip cool ist. Eiskalte Bauelemente, wohin das Auge schaut.
Ok, ein Widerstand wird manchmal lauwarm, aber Volti weiss, wie man das wegkriegt .
Ok, ein Widerstand wird manchmal lauwarm, aber Volti weiss, wie man das wegkriegt .
19.01.2017, 02:34 AM
19.01.2017, 02:46 AM
Cool, wie machen sich die neuen Platinen so?