Impressum | Datenschutz | Shop | DIY | TT @ Twitter | TT-Cabs
Anzeigen der neuesten Beiträge

Digitale Steuerung

  • 117 Antworten
  • 42595 Aufrufe

0 Mitglieder und 1 Gast betrachten dieses Thema.

*

Offline Sebastian

  • Sr. Member
  • ****
  • 185
  • Ich liebe dieses Forum!
Re: Digitale Steuerung
« Antwort #90 am: 24.12.2006 14:43 »
Hallo,

Also, das Ganze wird so nicht gehen, da ich die PWM nicht schnell genug kriege. Die Interrupt-Routine hält schon alles auf, obwohl da nicht viel passiert. Werde mal versuche, den Teil in ASM zu machen, der C Compiler macht jedenfalls zu viele anscheinend unnütze Befehle daraus. Unter 555Hz komme ich nicht bei 4,19MHz. Eine PWM Periode dauert 100 Interrupts (womit die Auflösung schon stark eingeschränkt wäre).

Wäre gut, wenn da einer weiterhelfen könnte...

M f G (und frohes Fest)
Sebastian

*

Offline Stephan G.

  • YaBB God
  • *****
  • 768
  • Yeah!!
Re: Digitale Steuerung
« Antwort #91 am: 24.12.2006 20:03 »
Hi, Folks!

Wie sieht Dein Programm denn aus?

Viel passieren muss eigentlich auch gar nicht. Der Timer-Interrupt könnte auch nur wie ein TICK verarbeitet werden  - bzw. eigentlich muss er ja nur einen Zähler beeinflussen, der die Zeitschlitze nummeriert ...

Wichtig ist, dass die normalen Routinen in der Zeit zwischen 2 Timer-Interrupts komplett abgearbeitet werden.

Das ist am Besten in Assembler hinzukriegen!

PLAY LOUD!!  :guitar:
Forget TRIAL AND ERROR!  BURN AND LEARN!

*

Offline Sebastian

  • Sr. Member
  • ****
  • 185
  • Ich liebe dieses Forum!
Re: Digitale Steuerung
« Antwort #92 am: 24.12.2006 20:17 »
Hallo,

So sieht die Interrupt-Routine aus. Wie man sieht, passiert auch nicht viel. Jedes 100. Mal wird einfach der Zähler hochgezählt und entsprechend dem Wert von "an" das Puls-Pausen-Verhältnis geändert. Kann man auch schön aufm Oszi sehen, das geht also soweit. Der Timer läuft ohne Vorteiler und der Interrupt löst aus, sobald der Timer-Wert von 0x4B erreicht ist (geringere Werte bringen nichts, da es nicht schneller wird).
4,19 Mhz / 0x4b / 100 = 559 Hz


ISR (TIMER0_COMP_vect)
{
   zaehler ++;
   if (zaehler == 100)               //100 => 1 Periode
   {
      zaehler = 0;   
   }
      if (an > zaehler)
      {
         PORTB |= (1 << PB3);         
      }
      else
      {
         PORTB &= ~(1 << PB3);            
      }
}   



Aus dem bisschen Code macht der Compiler 56 ASM Befehle, wobei mehr als die Hälfte davon aus zeitraubenden Pushs und Pops besteht, alles also suboptimal.


M f G
Sebastian

*

Offline Stephan G.

  • YaBB God
  • *****
  • 768
  • Yeah!!
Re: Digitale Steuerung
« Antwort #93 am: 26.12.2006 10:14 »
Hi, Folks!

Kannste mal zeigen, was der Compiler draus macht?

Die Struktur des Programms kann man noch etwas effizienter gestalten, wenn man auf die ELSE verzichtet.
Ich würde zu Beginn der Periode den Ausgang einschalten und mit dem PWM-Wert wieder ausschalten. Die IF muss dann eigentlich nur "Vergleichen" und nicht "Verzweigen"...

Interessant wäre auch, wie die Funktion aufgerufen wird und wo die "Hauptschleife" läuft ...

PLAY LOUD!!  :guitar:
Forget TRIAL AND ERROR!  BURN AND LEARN!

*

Offline Sebastian

  • Sr. Member
  • ****
  • 185
  • Ich liebe dieses Forum!
Re: Digitale Steuerung
« Antwort #94 am: 26.12.2006 13:48 »
ISR (TIMER0_COMP_vect)
{
   zaehler ++;
   if (zaehler == 100)               //100 => 1 Periode
   {
      zaehler = 0;   
   }
      if (an > zaehler)
      {
         PORTB |= (1 << PB3);         
      }
      else
      {
         PORTB &= ~(1 << PB3);            
      }
}   

void init(void)
{
    DDRB = 0xff;                   //PORTA Ausgang
   OCR0 = 0x4B;                  //Compare-Wert   
   TCCR0 = 0x09;                  //Prescaler   
   TIMSK = (1 << OCIE0);            //Timer0 Interrupt an
}


int main (void)
{      
   init ();
   sei();             //globaler Interrupt an
   an = 50;         //50% Helligkeit
   for (;;){}
}


Hallo, so sieht der Rest aus, also nicht viel dran.



21:       {
+00000047:   921F        PUSH    R1               Push register on stack
+00000048:   920F        PUSH    R0               Push register on stack
+00000049:   B60F        IN      R0,0x3F          In from I/O location
+0000004A:   920F        PUSH    R0               Push register on stack
+0000004B:   2411        CLR     R1               Clear Register
+0000004C:   932F        PUSH    R18              Push register on stack
+0000004D:   933F        PUSH    R19              Push register on stack
+0000004E:   938F        PUSH    R24              Push register on stack
+0000004F:   939F        PUSH    R25              Push register on stack
+00000050:   93CF        PUSH    R28              Push register on stack
+00000051:   93DF        PUSH    R29              Push register on stack
+00000052:   B7CD        IN      R28,0x3D         In from I/O location
+00000053:   B7DE        IN      R29,0x3E         In from I/O location
22:          zaehler ++;
+00000054:   91800060    LDS     R24,0x0060       Load direct from data space
+00000056:   5F8F        SUBI    R24,0xFF         Subtract immediate
+00000057:   93800060    STS     0x0060,R24       Store direct to data space
23:          if (zaehler == 100)               //100 => 1 Periode
+00000059:   91800060    LDS     R24,0x0060       Load direct from data space
+0000005B:   3684        CPI     R24,0x64         Compare with immediate
+0000005C:   F411        BRNE    PC+0x03          Branch if not equal
25:             zaehler = 0;   
+0000005D:   92100060    STS     0x0060,R1        Store direct to data space
27:             if (an > zaehler)
+0000005F:   91800060    LDS     R24,0x0060       Load direct from data space
+00000061:   2F28        MOV     R18,R24          Copy register
+00000062:   2733        CLR     R19              Clear Register
+00000063:   91800061    LDS     R24,0x0061       Load direct from data space
+00000065:   91900062    LDS     R25,0x0062       Load direct from data space
+00000067:   1728        CP      R18,R24          Compare
+00000068:   0739        CPC     R19,R25          Compare with carry
+00000069:   F434        BRGE    PC+0x07          Branch if greater or equal, signed
29:                PORTB |= (1 << PB3);         
+0000006A:   91800038    LDS     R24,0x0038       Load direct from data space
+0000006C:   6088        ORI     R24,0x08         Logical OR with immediate
+0000006D:   93800038    STS     0x0038,R24       Store direct to data space
+0000006F:   C005        RJMP    PC+0x0006        Relative jump
33:                PORTB &= ~(1 << PB3);            
+00000070:   91800038    LDS     R24,0x0038       Load direct from data space
+00000072:   7F87        ANDI    R24,0xF7         Logical AND with immediate
+00000073:   93800038    STS     0x0038,R24       Store direct to data space
+00000075:   91DF        POP     R29              Pop register from stack
+00000076:   91CF        POP     R28              Pop register from stack
+00000077:   919F        POP     R25              Pop register from stack
+00000078:   918F        POP     R24              Pop register from stack
+00000079:   913F        POP     R19              Pop register from stack
+0000007A:   912F        POP     R18              Pop register from stack
+0000007B:   900F        POP     R0               Pop register from stack
+0000007C:   BE0F        OUT     0x3F,R0          Out to I/O location
+0000007D:   900F        POP     R0               Pop register from stack
+0000007E:   901F        POP     R1               Pop register from stack
+0000007F:   9518        RETI                     Interrupt return


Das macht der Compiler aus der Interruptroutine.

Ich gebs zumindest mal im Moment auf mit PWM. Wenn man sich den Triaxis anguckt, dann sieht man vorne 10 ICs mit verschiedenen Rs. Das sieht für mich nach Latches / DAs aus.
http://www.student.oulu.fi/~kemppaja/Triaxis%20001.jpg

Leider ist genau der Teil im Plan von tubefreak.com nicht dokumentiert, der Rest des Plans deutet aber auch darauf hin.

Ich werde es auf jedem Fall auch mal so probieren. Ein PCF8574 kostet gerade mal 1,7€. Paar Rs dabei und das wars. Das sind vll 2,5€ mehr pro LDR, dafür kann ich mir aber viel Aufwand im Programm sparen und kann mir sicher sein, dass ich damit nie Zeitprobleme kriege... einfach nen Wert reinschreiben und nicht mehr drum kümmern.


M f G
Sebastian







« Letzte Änderung: 26.12.2006 13:50 von Sebastian »

*

Offline smirnov

  • Full Member
  • ***
  • 39
Re: Digitale Steuerung
« Antwort #95 am: 27.12.2006 13:17 »
hallo leute,

lese schon länger bei diesem thread mit, da mich das thema auch interessiert.
ich mache auch viel mit uC's, u.a. auch PWM steuerung für lüfter etc.

vielleicht klingt das jetzt etwas klugscheißerisch, aber ich kann eure problem mit der pwm-freq nicht nachvollziehen.
der sinn eines pwm ist es ja, eine spannung mit einem gewählten effektivwert zu erzeugen. wenn man nun zwischen uC und LED einen tiefpass mit einer gut gewählten grenzfrequenz schaltet, sollte ja an der LED nur eine gleichspannung ankommen.

bin ich da komplett am holzweg?
was sagt ihr dazu?

lg
Tom

*

Offline Sebastian

  • Sr. Member
  • ****
  • 185
  • Ich liebe dieses Forum!
Re: Digitale Steuerung
« Antwort #96 am: 27.12.2006 16:23 »
Hallo,

@Tom:
Ich hatte nur mal testweise einfach einen C parallel zur Led, mit mäßigem Erfolg. Wenn du mehr weißt, bzw. genau sagen kannst wie man nen optimalen Tiefpass dafür berechnet, immer raus damit. Ich weiß nicht, ob's so toll ist, einfach ein RC Filter für die 560 Hz da zu bauen ...


PS:
Habe mal einen VTL5C3 durchgemessen... wird sich gut für Potis ab 100k (und kleiner) eignen, für 1M eher weniger, da die Widerstandsänderung zu stark ist im Bereich von 0,1-0,2mA.

0,1 mA   1M
0,2 mA   650k
0,5 mA   125k
1mA   32,5k
10mA   3,2k
20 mA   2k
40 mA   1,3k


M f G
Sebastian

*

Offline Stephan G.

  • YaBB God
  • *****
  • 768
  • Yeah!!
Re: Digitale Steuerung
« Antwort #97 am: 27.12.2006 20:33 »
Hi, Folks!

Von der Software her ist es in der Tat einfacher, fertige DACs zu nehmen und den Wert bei Änderungen reinzuschreiben.
Die Kosten hierfür sind neben den Bauteilen selbst auch in Platinenfläche - und zusätzlichen Fehlerquellen - zu suchen.

Zusätzlich sollte man bedenken: Die Grenzen der Schaltung liegen bei DAC-Verwendung eindeutig in der Hardware (schaut Euch mal die Preise für 12-Bit-DACs an !!  :'( ) - mit der Soft-PWM-Lösung ist man einigermassen flexibel für "Verbesserungen" !!
Dann lieber einen grösseren und schnelleren µC!!!

Smirnov's Idee mit dem Tiefpass ist natürlich wie schon besprochen ein zweischneidiges Schwert. Die niedrigere PWM-Frequenz erkauft man sich mit verzögerten Ansprechzeiten!
Der Sinn der möglichst hohen PWM-Frequenz ist der, dass man die Frequenz aufgrund der LDR-Kopplung nicht hören sollte! Idealerweise ist sie ausserhalb des Hörbereichs ab ca. 25kHz ...


PLAY LOUD!!  :guitar:
Forget TRIAL AND ERROR!  BURN AND LEARN!

*

Offline HenningK

  • Full Member
  • ***
  • 59
Re: Digitale Steuerung
« Antwort #98 am: 28.12.2006 01:45 »
Hi Folks,

wollte mich mal kurz ebenso 'klugscheisserisch' wie Smirnov einbringen und die Tiefpassidee unterstützen, ich befasse mich seit fast 30 Jahren mit dem Thema, allerdings ohne je konkrete Hardware zustandegebracht zu haben ......  :-[ (Zeitmangel) Vielleicht hilfts ja trotzdem .......

1. Der Tiefpass den Smirnov erwähnt wäre wohl ein Integrator. (siehe http://www.elektronik-kompendium.de/sites/slt/0412061.htm)
Der Trick ist, einen Analogschalter davorzusetzen, so daß man den Integrator als Analogspeicher benutzen kann. Z.B. kann man einen 4051 CMos Chip benutzen, damit kann man dann 8 solcher Integratoren ansteuern. Die Analogschalter sind in Reihe zu R1, R2 fällt weg. C ist in moderater Grösse, z.B. 100nF oder so, R1 auf Zeitkonstamte = 100ms gesetzt. Als OPV wird TL074 o.ä. verwendet, Hauptsache der Eingangswiderstand des OPV ist hoch.

2. Effekt ist, daß Du nur einen PWM Ausgang brauchst, der wird allerdings nacheinander auf die Integratoren geschaltet. Hättest Du 8 LDR's zu steuern bräuchtest Du nur 1 * 4051 + 2 * TL074 (incl. 8 C's). Dein UC müsste dann nur zusätzlich einen 3 Bit Binärcode ausspucken den Du auf den 4051 gibst um den 4051 zu steuern/addressieren. Das sollte sehr easy sein.  :)

3. Die PWM Frequenz wäre dann etwa so zu berechnen:

Max. Zeit um ein Preset zu recallen: 100ms
Anzahl der LDR's: 8
Zeit, um einen LDR anzusprechen: 100ms/8 = 12,5ms
Min. Frequenz des PWM: 80Hz

Empfehlenswert wäre es auf jeden Fall eine höhere PWM Frequenz zu wählen, die Schaltung wird dann genauer. Wenn Du den UC dazu kriegst nacheinander die PWM's der einzelnen LDR's mit ca. 1000 Hz oder so auszugeben ist alles klar. Wie gesagt, ist ja nur eine PWM auf einmal.

4. Die Software muss dann permanent (nacheinander) die Werte in die Integratoren schreiben, was aber kein Problem sein sollte.

Bei Bedarf mach ich ne kurze Skizze, ist aber alles 'Klugscheissertheoretischererguss', sorry.  O0 Diese Art Schaltung ist aber in professionellen Geräten durchaus verwendet worden! Vielleicht kannst Du was damit anfangen.  ;D

Henning


*

Offline Sebastian

  • Sr. Member
  • ****
  • 185
  • Ich liebe dieses Forum!
Re: Digitale Steuerung
« Antwort #99 am: 28.12.2006 13:41 »
Hallo,

Finde, dass das doch gar nichts mit Klugscheißerei zu tun hat, im Gegenteil, es hilft doch :)

Also, ich habe verstanden, wie die Schaltung funktionieren soll, werde das auch mal ausprobieren (bzw mal simulieren, was der Integrator genau mit meiner PWM macht und dann erst nachbauen).

M f G
Sebastian

*

Offline Stephan G.

  • YaBB God
  • *****
  • 768
  • Yeah!!
Re: Digitale Steuerung
« Antwort #100 am: 28.12.2006 20:13 »
Hi, Folks!

Natürlich ist so eine Schaltung auch für derartige Zwecke geeignet - das ist ein DAC aber auch! Mit dem Vorteil, den Wert nur einmal reinschreiben zu müssen. Übrigens bin ich nicht der Auffassung, mit solch einer Schaltung das PWM-Signal "multiplexen" zu können - schließlich wird der Mittelwert periodenbezogen eingestellt ...  ;)

Wenn schon zusätzliche Elektronik verbaut werden soll, dann aber wenns geht um mir die Arbeit zu erleichtern - also mit "Intelligenz" im Chip.
Nach wie vor sind auch bei dieser Schaltung die Grenzen in der Hardware! Wenn ich die PWM-Frequenz verändere, bin ich zu Bauteiländerungen gezwungen. Das könnte man mit einer einfachen Soft-PWM wesentlich flexibler handhaben!


PLAY LOUD!!  :guitar:
Forget TRIAL AND ERROR!  BURN AND LEARN!

*

Offline HenningK

  • Full Member
  • ***
  • 59
Re: Digitale Steuerung
« Antwort #101 am: 29.12.2006 10:23 »
Hallo,

nur kurz einige Ergänzungen:

Zitat
Übrigens bin ich nicht der Auffassung, mit solch einer Schaltung das PWM-Signal "multiplexen" zu können - schließlich wird der Mittelwert periodenbezogen eingestellt ... 

Wenn R1 eines Integrators hochohmig gemacht wird (= abgeschalteter Analogschalter) speichert die Schaltung den Wert. Wie lange, hängt vom Ri des OPV und vom Isolationswiderstand des Analogschalters ab und von der Güte des Kondensators. Es ist aber sehr, sehr lange und wird so lang sein, daß ein Refresh nach z.B. 100ms ausreicht um keinerlei messbaren (oder hörbaren) Abfall hinzukriegen.

DAC's pro LDR waren hier ja schon aus Kostengründen abgelehnt worden, deshalb dieser günstigere Vorschlag. 2 * TL074, 8 C's und ein 4051 kosten wenige Cent.
Man könnte aber auch beide Vorschläge kombinieren: Man nehme einen DAC und multiplext dessen Analogausgang in eine Reihe Integratoren. Dann ist man die PWM jedenfalls los. Evt. findet man ja auch einen uC mit integriertem DAC, dann wird das Ganze sehr übersichtlich.

Die Integratoren haben einen riesigen Vorteil: Die Steuerung der LDR's erfolgt in jedem Fall weich, 'smooth', da eine Änderung der Steuerspannung immer mit einer linearen Zeitkonstante erfolgt. (Die man natürlich im Bereich 20ms - 100ms wählt) Umschaltknackser sind nicht zu erwarten.  :guitar:  Das Verfahren ist im Prinzip 'analoger' als eine rein digitale Ansteuerung und da würde ich auch Probleme mit den DAC's direkt vor den LDR's erwarten.

Will hier aber niemanden überzeugen, dachte nur Sebastian könnte evt. was mit der Idee anfangen.  8)

Henning

*

Offline Stephan G.

  • YaBB God
  • *****
  • 768
  • Yeah!!
Re: Digitale Steuerung
« Antwort #102 am: 29.12.2006 20:09 »
Hi, Folks!

Henning hat schon recht - mit ein wenig Schaltung um die OPs herum kann man das Ganze mit (kostenbezogen) geringem Aufwand lösen. Man kann sich dabei auch ruhig überzeugen lassen.

Ich bin die Sache leider von völlig anderen Gesichtspunkten angegangen - nämlich kommerziell (weiter vorne erwähnt).
Dabei setz ich voll auf PWM, damit ich mit minimalstem Schaltungsaufwand (Anz. der Bauteile und PCB-Fläche) die grösste Flexibilität beibehalten kann!
Dazu bin ich auch bereit, ein paar Kompromisse einzugehen.
Meine Lösung werde ich allerdings nicht veröffentlichen - da steckt einfach zu viel Arbeit drin - und die soll sich ja irgendwann auch mal auszahlen ...  ;D

Fällt dann unter die Rubrik "Hobby zum Beruf gemacht..." .

Meinen Beitrag in diesem Fred werde ich aber weiterhin leisten ...  :)

Noch was zu den LDR-Kopplern:
Ich würde nicht versuchen, unbedingt den ultrakleinen R on herauszukitzeln. Um (wie Sebastian nachgemessen hat)
von 2 kOhm bei 20mA auf 1,3 kOhm bei 40 mA zu kommen, halte ich für falsch. Der absolute Wert ist gar nicht so wichtig - schließlich ist das Poti ja wegen seiner Funktion als Spannungsteiler so beliebt. Das Verhältnis ist also wichtiger...

Viel interessanter ist die Auflösung im "mittleren Bereich" (10 k ... 250 k), damit man eine vernünftige Auflösung hinbekommt. Da stört der hohe Strom eigentlich nur.

PLAY LOUD!!  :guitar:
Forget TRIAL AND ERROR!  BURN AND LEARN!

*

Offline Hannes

  • YaBB God
  • *****
  • 929
  • Ich liebe dieses Forum!
Re: Digitale Steuerung
« Antwort #103 am: 2.01.2007 19:42 »
Hallo zusammen!

DACs mögen aus Kostengründen abgelehnt worden sein - warum versteh ich nicht so ganz...

Da gibt's beispielsweise den TDA8444 (8x 6bit-DACs mit I²C) für 1,20€ bei ----, den TLC7528 (2x 8bit-DACs) für 1,25€. Oder den DAC808LCN (Stromausgang, 8Bit, 0,89€) oder DAC800LCN (Spannungsausgang, 8bit, 1,10€).

Dafür lohnt's sich doch kaum zu Basteln. Schließlich verringert man auch die Fehlerquellen... Als Alternative böte sich noch ein besserer DAC, ein analoger Multiplexer und einige S/H an.

Umschaltzeiten unter 10ms wären ein Traum - dann merkt der Gitarrist nichts davon, der neue Sound wäre "sofort" da.

Grüße,
Hannes (der diesen Thread mit Spannung verfolgt)

*

Offline Stephan G.

  • YaBB God
  • *****
  • 768
  • Yeah!!
Re: Digitale Steuerung
« Antwort #104 am: 2.01.2007 20:26 »
Hi, Folks!

Bei den 8 Bit-DACs kann man in der Tat nicht von hohen Kosten reden - allerdings kommt man damit nicht sehr weit!

Um die eigentlichen LDR-Widerstände vernünftig - mit angenehmen Abstufungen - einstellen zu können, sind mindestens 10 Bit (besser: 12 Bit) Auflösung gefragt. Damit kann man sich einen Potiwert und eine schöne Kennlinie "aussuchen". Mit 8 Bittern ist noch eine gewisse Elektronik zum Feinjustieren notwendig - ganz zu schweigen von der Justiererei selbst...

Diese "Meinung" basiert natürlich auf der Grundlage, dass die Digitalsteuerung des Amps auch eine echte Verbesserung darstellen soll - und nicht ein Gewurschtel a lá "Hauptsache Digital gesteuert" ...  ;)

Dazu gehört leider auch die Selektion der LDR-Koppler nach gewissen Eckdaten ...  :'(  :'(

Dafür kann man die Koppler ohne spezielles "Einmessen" in der Schaltung integrieren und mit Standardwerten betreiben ...  ;D  ;D

PLAY LOUD!!  :guitar:

P.S.: Ich hatte mal sowas ins Auge gefasst ... : http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3968
Forget TRIAL AND ERROR!  BURN AND LEARN!