Mit welcher Geschwindigkeit kann ich den Digitalen Ausgang oder die PWM ändern?

Das bezieht sich auf den Arduino Uno Rev 3:

Ich arbeite das erste Mal mit dem Mikrokontroller und würde gerne zwei Bassshaker und drei Drehspulinstrumente als Zeiger damit betreiben und befinde mich in der Planungsphase. Den Uno hab ich schon, war ein Weihnachtsgeschenk.

Ich hab einen Algorithmus geschrieben, der mir meinen Analogwert in ein Digitales Signal umwandelt, mit beliebiger Auflösung. Im Moment benutze ich 200 Stufen, also ein bisschen kleiner als 8bit.

Ich habe erstmal angenommen ich kann den digitalen Ausgang mit 1MHz ansteuern, da ich keine Spez. dazu gefunden habe.

Ich habe das ganze mal mit LTSpice simuliert.

Das hier ist mein Analoges Signal, welches an den Bassshaker übertragen werden soll.

1 Sekunde - Frequenzen zwischen 40 und 100Hz ausser gegen Ende, da habe ich wohl eine kleine Störung drin.

Das ganze setze ich dann in ein digitales Signal um:

Rot ist der Digitale Eingang, grün der Spannungsabfall über dem Bassshaker/Drehspulinstrument = R2.

Das ist meine Schaltung:

Ein simpler Tiefpass.

Ich mach das das erste Mal, also wenn jemand Verbesserungsvorschläge hat, oder ich was falsch gemacht habe, immer her damit.

Ich meine mich zu erinnern, dass es mehrere Takte dauert, bis der Ausgang an einem Mikroprozessor geändert werden kann, deswegen erstmal 1MHz, wie lange dauert es denn genau oder welche Änderungsrate lässt die komplexe Programmierung des Arduinos überhaupt zu?

Liebe Grüße Just

// UNO PB5 === Pin 13
// 2,667 MHz an PB5

int main() 
{
  DDRB |= _BV(PB5);
  while(1) 
  {
    PINB = _BV(PB5);
  }
}

Ich versteh mal nicht wieso Du ein PWM Signal mit 1Mhz ändern willst wenn Du einen Bassshaker hast der mit max 150Hz angesteuert werden kann.

Wie sieht die Leistungsendstufe für die Bassshaker aus?

Grüße Uwe

@combie Vielen Dank.

@Uwefed, ich kann den Bassshaker auch mit einer 50Hz PWM ansteuern, aber dann bekommen ich nicht so einen glatten Sinus, und außerdem ist mir unklar wie ich ein 48KHz Eingangssignal in eine 50Hz-150Hz PWM überführen soll. Außerdem kann ich den Signalverlauf nicht so exakt nachbilden.

Die maximale Leistung der Bassshaker beträgt jetzt ca 35 Watt. Das sollte eigentlich ausreichend sein. Wenn dem nicht so ist kann ich mir ja immer noch einen Darlington-Transistor und ein besseres Netzteil kaufen.

Nur um zu Überprüfen ob ich das richtig verstanden habe:

Die DigitalOutput-Pins kann ich mit 2,66MHz ansteuern und die PWM-Pins geben eine 500Hz Rechteckschwingung aus, die durch die Verteilung von Off- und On-Dauer einen Analogwert realisiert?

Oder sind die 500Hz in diesem Tutorial https://www.arduino.cc/en/Tutorial/PWM nur ein Beispiel und man kann die Frequenz selbst einstellen?

@Uwefed, ich kann den Bassshaker auch mit einer 50Hz PWM ansteuern,

Das hab ich nicht gesagt. 50Hz und 1000000Hz liegen Welten dazwischen und Du mußt ja nicht nur igendwas aus geben sondern einen Eingangswert in ein PWM Timing umwandeln. Als PWM Frequenz würde ich was leicht über 20kHz vorschlagen da man diese Frequenz nicht mehr hört und sie nicht so hoch ist.
Grüße Uwe

Oder sind die 500Hz in diesem Tutorial https://www.arduino.cc/en/Tutorial/PWM nur ein Beispiel und man kann die Frequenz selbst einstellen?

Befrage das Datenblatt zu deinem µC.
Das gibt gerne Auskunft.

Just_Kauser:
Oder sind die 500Hz in diesem Tutorial https://www.arduino.cc/en/Tutorial/PWM nur ein Beispiel und man kann die Frequenz selbst einstellen?

Dieses dünne Textchen ein Tutorial zu nennen ist ein Witz.

Schau Dir zum Vergleich mal das hier an.

Gruß

Gregor

Hi

@JustKauser
Die 2,66MHz sind die MAXIMALE Geschwindigkeit ausschließlich beim Pin-Wackeln - da macht der Chip nicht Anderes, nur im Kreis laufen und laufend den Pin an/aus.
In Assembler sollte Das noch etwas schneller gehen (Pin-Set zum toggeln, jmp-2), dafür büßt man aber den Komfort der Arduino-IDE ein.

MfG

postmaster-ino:
In Assembler sollte Das noch etwas schneller gehen (Pin-Set zum toggeln, jmp-2), dafür büßt man aber den Komfort der Arduino-IDE ein.

out 1 Takt
rjmp 2 Takte
Zusammen: 3 Takte für eine Halbwelle (ein Pegelwechsel)
Macht 6 Takte für eine Vollwelle

16MHz / 6 = 2,6667MHz !

Ich halte es für sehr optimistisch, da mit Assembler mehr raus holen zu wollen.
Ja, ich möchte es sogar hier mal als "unmöglich" bezeichnen.

int main() 
{
  DDRB |= _BV(PB5);
  80:	25 9a       	sbi	0x04, 5	; 4
  while(1) 
  {
    PINB = _BV(PB5);
  82:	80 e2       	ldi	r24, 0x20	; 32
  84:	83 b9       	out	0x03, r24	; 3
  86:	fe cf       	rjmp	.-4      	; 0x84 <main+0x4>

00000088 <_exit>:
  88:	f8 94       	cli

0000008a <__stop_program>:
  8a:	ff cf       	rjmp	.-2      	; 0x8a <__stop_program>

In den anderen Punkten, hast du natürlich völlig Wahr.

Hi

Joha - Da hast Du wahr - klar bin ich so erst bei der halben Periode und mit dem Doppeltem bin ich schon bei der vom Kompiler generierten Geschwindigkeit - hatte hier 'etwas mehr' Optimierungsvermögen für möglich gehalten :slight_smile:

Geil, daß der Kompiler Das ebenfalls SO hinbekommt - Hut ab!

MfG

postmaster-ino:
Geil, daß der Kompiler Das ebenfalls SO hinbekommt - Hut ab!

Wieso Hut ab?

C ist schließlich die Sprache, die besonders Maschinen-nahes Programmieren ermöglich[t|en soll]. Wenn man gut genug C kann, kann man Assembler eigentlich getrost vergessen.

Naja ... zur Not packt man den hässlichen Assembler-Code halt in hübsches C ein, zumal so kurz vor Ostern, nech.

Gruß

Gregor