Verschiedene Freuenz trotz gleicher PWM.

OP #4166475
Lesenswert?

Hallo lieben Foren Mitglieder,

ich hoffe hier etwas Hilfe zu bekommen, da ich noch nichts passendens 
gefunden habe, erstelle ich einen eigenen Post.

Mein Vorhaben:

Ich möchte mit einem ARDUINO NANO uC 4 LEDs steuern mittels PWM, 
idealerweise sollen alle viers LEDs mit der selben Frequenz und LED 
angesteuert werden.
Desweiteren benötige ich ein Referenzsignal welches in Phase und 
Amplitude zu der jeweilgen Leuchtenden LED gleich ist und snychron an 
einem Ausgang liegt wenn die jeweilige LED bzw. der Port HIGH ist.

Mein problem nun:

wenn ich die LEDs nach und nach durchschalte, habe ich unterschiedliche 
Frequenzen obwohl ich alle mit der selben pwm ansteuern.

Kontrollieren tue ich das mit einem Oszi.
Hardware:

Arduino Nano

RGB und Infrarot LED

Woran könnte das liegen ?

Vielen Dank im Voraus

Ich Poste meinen Code mal für eine Farbe:
1
int   analogpin          = A1;
2
int   ledpin             = 11;   //Blau
3
int   ledpin1            = 5;    //Gruen    
4
int   ledpin2            = 6;    // Rot
5
int   ledpin3            = 9;    // Infrarot      
6
int   maxi               = 1024; // 1024 entsprechen 5V 
7
float wert               = 0.0;
8
float Mittelwertblau     = 0.0;
9
float Mittelwertgruen    = 0.0;
10
float Mittelwertrot      = 0.0;
11
float Mittelwertinfrarot = 0.0;
12
float Voltblau           = 0.0;
13
float Voltgruen          = 0.0;
14
float Voltrot            = 0.0;
15
float Voltir             = 0.0;
16
float gesamt = 0.0;
17

18

19
void setup() 
20
{
21
  Serial.begin(9600);
22
  pinMode(5, OUTPUT);
23
  pinMode(6, OUTPUT);
24
  pinMode(9, OUTPUT);
25
  pinMode(11,OUTPUT);
26
  pinMode(A1,INPUT);
27
}
28
void loop() 
29
{
30
  start:
31
  
32
     int p=0;
33
       if (Serial.available()>0)
34
        {
35
         p = Serial.read();
36
         p-=48;
37
         Serial.println(p);
38
        }else {goto start;}
39
    
40
switch(p)
41
{
42
//------------------------------------------Blau---------------------
43
  case 1:
44
    gesamt = 0.0;                    // setzt gesamt jedes mal wieder auf 0
45
    analogWrite(5, LOW);
46
    analogWrite(6, LOW);
47
    analogWrite(9, LOW);
48
    
49
    Serial.println("Blau ");
50
    Serial.println("_______");
51
    
52
    for(int i=0; i<=500; i++)
53
      {
54
        analogWrite(11, 127);                  // Duty Cycle von ca.75%
55
        delay(1);
56
        wert= analogRead(A1);                     //Einlesen der Werte
57
        gesamt           = wert   + gesamt;
58
        Mittelwertblau   = gesamt / 500;         // Mittelwert ausrechnen 
59
      }
60
      
61
      //Serial.println("_______");
62
     //Serial.println( Mittelwertblau);       // Ausgeben des Mittelwerts
63
      Voltblau= ( Mittelwertblau*5)/1024;    //Spannungswert ausrechnen                                    
64
      Serial.print("Der Spannungswert der Farbe Blau ergibt[V]: ");     // Ausgabe des Spannungswerts
65
      Serial.println(Voltblau); 
66
      break;
Moderator (Firma: Titel) Persönliche Seite #4166727
Lesenswert?

Peter Stein schrieb:
> Ich Poste meinen Code mal für eine Farbe:
Und was kann man daran sehen? Wie kommt damit der Fehler bei den 
anderen Farben zustande? Was erwartest du? Und was erhältst du 
stattdessen?

> wenn ich die LEDs nach und nach durchschalte, habe ich unterschiedliche
> Frequenzen obwohl ich alle mit der selben pwm ansteuern.
Hast du da auch Zahlen?

Peter Stein schrieb:
> hat keiner eine Idee wie ich an mindestens 4 Ausgängen des Arduino Nano
> die selbe Frequenz hinbekomme ?
Doch: eine Sofware-PWM im Timerinterrupt. Sonst wirst du das niemals 
zuverlässig zum Laufen bekommen: siehe den Artikel Soft-PWM

Und sowas mit GOTO wie in BASIC macht man seit C nicht mehr:
1
  start:
2
        ...  
3
        else {goto start;}
Bei welchem Schlauberger hast du das abgekuckt?
Für die Hauptschleife ist ein while(1) {} erfunden worden.

BTW:
du kannst deinen Code mit den passenden Token schön formatieren lassen 
mit
1
[c]
2
   // dein Code (ist ja nur ein C-Derivat)
3
[/c]
Das steht übrigens ein paar Zeilen über der Eingabebox...
Gast #4166729
Lesenswert?

Ich sehe gleich ein paar Probleme die Deinem Vorhaben im Wege stehen.
1. Der Arduino Software Unterbau ist für seine Langsamkeit berüchtigt.
2. float zieht langwierige Berechnungen nach sich.
3. Software PWM
4. delay()

Du bremmst den ATmega328 an jeder nur möglichen Stelle aus was zu einer 
PWM Frequenz führt die er dann je nach Berechnung noch so schafft.

Lese das Datenblatt zum ATmega328, speziell die Kapitel über Timer und 
PWM (output compare).
4 zusammenhängende PWM hat der nicht, aber verteilt über zwei timer 
sollte das kein Problem sein.

Statt float lese was über 
https://www.mikrocontroller.net/articles/Festkommaarithmetik
#4166738
Lesenswert?

Zitat:
"On the Uno and similar boards, pins 5 and 6 have a frequency of 
approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz."

Ausserdem:
"The PWM outputs generated on pins 5 and 6 will have 
higher-than-expected duty cycles. ..... This will be noticed mostly on 
low duty-cycle settings (e.g 0 - 10) and may result in a value of 0 not 
fully turning off the output on pins 5 and 6. "

aus:
http://www.arduino.cc/en/pmwiki.php?n=Reference/AnalogWrite

viel Erfolg
Hauspapa
Gast #4166930
Lesenswert?

Peter Stein schrieb:
> Ich möchte mit einem ARDUINO NANO uC 4 LEDs steuern mittels PWM,
> idealerweise sollen alle viers LEDs mit der selben Frequenz und LED
> angesteuert werden.
> Desweiteren benötige ich ein Referenzsignal welches in Phase und
> Amplitude zu der jeweilgen Leuchtenden LED gleich ist und snychron an
> einem Ausgang liegt wenn die jeweilige LED bzw. der Port HIGH ist.

Wenn ich es also richtig interpretiere soll nur ein- und ausschalten 
individuell per LED steuerbar sein? Ansonsten alles gleich?
Dann nimm doch 1 PWM-Ausgang und verknüpfe (UND) die mit einem 
Steuersignal für jede LED:

.-----.
| PWM |]--ooo.
|     |   ||||  .---.
|     |   |||'--| & |-----> LED1
| LED1|]--+++---|   |
|     |   |||   '---'
|uC   |   |||   .---.
|     |   ||'---| & |-----> LED2
| LED2|]--++----|   |
|     |   ||    '---'
|     |   ||    .---.
|     |   |'----| & |-----> LED3
| LED3|]--+-----|   |
|     |   |     '---'
|     |   |     .---.
|     |   '-----| & |-----> LED4
| LED4|]--------|   |
'-----'         '---'
#4167097
Lesenswert?

Peter Stein schrieb:

> ich steuer damit das Gate eines Transistors.
>
> Da die Dioden ca. 700mA ziehen , habe ich eine Treiberschaltung.
> Somit funktioniert Ihre Idee nicht.

Warum sollte es dann nicht funktionieren?

Andere Frage, wozu brauchst du das Signal einer LED an verschiedenen 
Pins? Greif es doch für beide Zwecke (Verstärkung und was auch immer) 
einfach direkt am selben Pin ab.
#4167110
Lesenswert?

Naja, du hast einen Pin, an dem deine PWM liegt. An diesem sind die 
Transistoren angeschlossen. Warum brauchst du dann jetzt noch einen 
zweiten Pin, an dem genau das selbe Signal liegt?

Und ja, das funktioniert mit den UND-Gattern, ist im Prinzip die 
einfachste Lösung, wenn du keine eigene Soft-PWM schreiben willst.
OP #4167558
Lesenswert?

Guten Abend Samuel,

danke für den Link aber da ich  ja in der EWU Arduino das ganze 
realisieren will, komme ich damit leider nicht weiter.

Ich meine das muß doch sofware technisch auch irgendwie möglich sein, 5 
exakt die selben Frequenzen zu generieren, die Hardware kann das doch 
oder liege ich da falsch.

Ich werde mal folgende varianten testen:

1:

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);
  delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz
  digitalWrite(13, LOW);
  delayMicroseconds(1000 - 100);
}


2:

  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS22);
  OCR2A = 180;
  OCR2B = 50;


bei variante zwei habe ich nur das problem das das glaube ich nur an pin 
3 und 11 möglich ist oder kann ich das an allen pins so generieren ?
#4167603
Lesenswert?

Ja, die Hardware kann das in der Tat. Du hast 6 PWM-Einheiten zur 
Verfügung, allerdings sind diese über Arduino-Befehle schwer in den 
Griff zu bekommen, aber du hast ja den richtigen Ansatz über die 
Register schon gezeigt.

Allerdings musst du, um alle 6 PWM-Kanäle nutzen zu können, alle drei 
Timer für dich reservieren, und da wird dir die Arduino-API vermutlich 
einen Strich durch die Rechnung machen, da diese vermutlich mindestens 
einen Timer für sich will.

Somit bleibt dir, wenn du weiter mit der Arduino-API arbeiten willst, 
nur eine Soft-PWM, und auch da kann ich dir leider nicht sagen, ob die 
mit der Arduino-API so einfach zu machen ist, wie mit blankem C.
OP #4167623
Lesenswert?

Hm....

Was nun tun ??

Die einfachste Lösung wäre denke ich, die Baustein zu nehmen mit den UND 
Gattern, aber ist das auch die beste lösung ?

Kann ich den Arduino Nano auch mit einer anderen EW-Umgebung 
Programmieren ?
So das ich Hardware mäßig nix verändern muß , oder muß ich einen andern 
uC nehmen ?
#4167715
Lesenswert?

Du musst an der Hardware überhaupt nichts verändern. Du kannst jede IDE, 
die mit AVRs umgehen kann verwenden. Ich verwende dafür Atmel-Studio, 
aber da hat jeder seinen eigenen Geschmack.

Die Arduino-Geschichte ist auch nur C mit einem Batzen an Bibliotheken. 
Theoretisch kannst du sogar in der Arduino-IDE direkt normales C 
schreiben, allerdings ist das nicht wirklich komfortabel.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren