• .
  • Willkommen im Forum!
  • Alles beim Alten...
  • Du hast kaum etwas verpasst ;-)
  • Jetzt noch sicherer mit HTTPS
Hallo, Gast! Anmelden Registrieren


PBG12201 Plasma Bargraph Display - reloaded
#21
So, der erste Aufbau der Steuerung für 4 Balken (2 Displays) sah so aus:

   

Hier für 5 Phasen aufgebaut. Die Analogeingänge provisorisch verdrahtet, ein Poti lieferte ein variables Inputsignal. Alles sehr übersichtlich Tongue .
 
Reply
#22
https://de.wikipedia.org/wiki/Low_Voltag..._Signaling

Das ist doch serielle Highspeed-Übertragung, meines Erachtens auch zeitkritisch.
 
Reply
#23
Ich verstehe leider immer noch nicht, worauf du hinaus willst.
 
Reply
#24
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):
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 Gurke Gurke Gurke . 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...
 
Reply
#25
Einmal in Betrieb - direkt unter einer 40W-Halogenlampe, damit man was sieht lachend .





Interferenzen versauen ein wenig das Bild, die Leuchtbalken sind absolut gleichmässig und mit 70Hz auch flimmerfrei.
 
Reply
#26
(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 Smile
(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.)
 
Reply
#27
(10.09.2016, 08:57 AM)buyman schrieb:
(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 Smile
(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.)
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.

Es gibt übrigens ein Zeitfenster von etwa 71us zwischen 2 Interrupts, das schon ganz gut gefüllt ist.
 
Reply
#28
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.

 Cry

Neue Zieldefinition: Ein überhaupt nicht universelles Ansteuerungsprogramm für genau ein Display, mit guter Peripherie und gleich mit einem Audioverstärker dran.
 
Reply
#29
Ich bin für ohne Audioverstärker dran. Smile Dafür mit kleinem DCDC-Wandler.
 
Reply
#30
Mein Problem ist dabei, dass ich erstmal bis zu dem Stand von heute dokumentieren muss klappe . Dazu fehlt noch:
  1. Der DC-DC-Wandler zu Spannungsversorgung,
  2. Die Signalaufbereitung vor den analogen Eingängen.
Beides ist schon verstreut im internen Bereich zu sehen (unter "Mich freut"), ich will es aber hier noch einmal im richtigen Kontext bringen. Sonst findet man es nie wieder...

Wenn es jemand für andere Zwecke verwendet - kein Problem. Baut mal los Big Grin . Theoretisch ist schon genug geposted, dass Nach- und Umbauten möglich sind.
 
Reply
#31
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... ;whistling. Diesmal war ich besser. Die Schaltung um den OPV ist ganz lustig und funktioniert etwas anders als normal  Confused.

Die Simulation
.asc   Envelope.asc (Größe: 2,22 KB / Downloads: 616)
und das Zubehör
.lib   Poti.lib (Größe: 129 Bytes / Downloads: 557)
.asy   poti.asy (Größe: 552 Bytes / Downloads: 584)

   

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
   

Big Grin Der schnelle Lochrasteraufbau in Stereo funktioniert exakt nach Plan Big Grin .
   
 
Reply
#32
Smile 
jepp, gefällt! Cool
...mit der Lizenz zum Löten!
 
Reply
#33
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:

[Bild: 184_FAN_small_03.png]


[Bild: 97_FAN_small_01.jpg]

Meine Løtzinnrolle ist signifikant kleiner geworden klappe Weih :
   

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 Big Grin . In der Dimensionierung kann die Schaltung 2 Displays (4 Balken)  versorgen, eventuell auch 3.

Die 70V Hilfsspannung macht eine 68V Z-Diode...
 
Reply
#34
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! Smile
 
Reply
#35
(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! Smile
Man kann! mache ich schon seit ca 10 Jahren so Big Grin
...mit der Lizenz zum Löten!
 
Reply
#36
(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! Smile
Was ist BCM?
 
Reply
#37
boundary conduction mode (BCM).
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Reply
#38
Nun ja - ok. Jetzt kenn ich auch den Fachbegriff und seine Abkürzung lachend . 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 Wink .
 
Reply
#39
Puh... heute war heftiger Løttag.

Vorher:
   

Nachher:
   

   

Jetzt kann es schon fast in eine Kiste...  klappe
 
Reply
#40
Cool, wie machen sich die neuen Platinen so?
 
Reply