Go Down

Topic: Arduino PWM-Generator (Read 4575 times) previous topic - next topic

agmue

#15
Oct 21, 2016, 06:11 pm Last Edit: Oct 21, 2016, 06:11 pm by agmue
könntest Du kurz erklären, was die Angaben unter den Kurven bedeuten (und von was für einem Oszi die stammen)?
Na klar :)

Ich nutze BitScope DSO 2.8.

FT Triggerpunkt, 0s ist in der Mitte
TB horizontale Auflösung 10 µs/Div
FP Frequenz bezogen auf TP
TP Zeit zwischen linkem Cursor (grün) und rechtem (braun)
TM Zeit zwischen Triggerpunkt und linkem Cursor

@Doc_Arduino: Ich nutze analogWrite, das ist doch Hardware PWM :)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

ArduFE

#16
Oct 21, 2016, 06:23 pm Last Edit: Oct 21, 2016, 06:28 pm by ArduFE
Der Teensy bringt hier keinen Vorteil.
Wie in der verlinkten Doku zu lesen, nutzt der Teensy drei Hardwaretimer für PWM (FTM0, FTM1. FTM2).

agmue

... nur wenn Hans das hier wirklich durchziehen möchte, ...
... dann werde ich interessiert mitlesen. Ob Hans einen teensy kauft oder es mit einem UNO macht, soll er entscheiden. Solange er das nicht gemacht hat, werde ich ihn mit Informationen zur Entscheidungsfindung füttern.
Der Teensy bringt hier keinen Vorteil.
Da bin ich anderer Meinung: Es reichen ein paar Zeilen, um zum Ergebnis zu kommen, ohne in Datenblättern usw. lesen zu müssen:
Code: [Select]
  analogWriteResolution(9);  // analogWrite value 0 to 511
...
  analogWriteFrequency(PWMpin, freq);
  analogWrite(PWMpin, PWMwert);
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Doc_Arduino

#18
Oct 22, 2016, 12:00 am Last Edit: Oct 22, 2016, 12:01 am by Doc_Arduino
Hallo,

ich dachte Hans hat schon einen Arduino? Nur welchen weiß ich noch nicht.
Falls du dich mit Timern noch nicht auskennen solltest, dann kannste danach die Funktion
Code: [Select]
analogWriteFrequency(PWMpin, freq);

für Arduino gern nachrüsten. Zudem ist es bestimmt interessant zu wissen was dahinter steckt. Das macht ja gerade den Reiz aus sich mit dem Datenblatt auseinandersetzen zu müssen. Für mich jedenfalls. Man kann alles erdenkliche frei einstellen.

Edit:  jetzt ist endlich das Forum wieder erreichbar. Heute ging gar nix.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

agmue

Edit:  jetzt ist endlich das Forum wieder erreichbar. Heute ging gar nix.
So kommt es, daß Dein gestern geschriebener Text erst heute gespeichert wurde, womit dann heute zu gestern wird :)
ich dachte Hans hat schon einen Arduino?
Das kann ich aus dem, was er schreibt, nicht eindeutig erkennen. Aber wenn man einen teensy hat, kann ein zusätzlicher UNO nicht schaden, da man dann die Unterschiede zwischen 8 Bit µC (auf dem UNO geht's) und 32 µC gut vergleichen kann. Geht mir zumindest so.
Zudem ist es bestimmt interessant zu wissen was dahinter steckt. Das macht ja gerade den Reiz aus sich mit dem Datenblatt auseinandersetzen zu müssen. Für mich jedenfalls.
Für mich auch! Mit meinem Hobby möchte ich ja neue Dinge herausfinden. Im Datenblatt zu stöbern, gehört nicht unbedingt zu meinen Lieblingsbeschäftigungen, muß aber eben manchmal sein.

Allerdings fände ich es egoistisch, Hans Informationen vorzuenthalten, weil ich UNO-Timer spannend finde.

Ich bin gespannt, ob Hans sich nochmal meldet, sonst sind alle Überlegungen umsonst.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

ElEspanol

Ich finde Datenblätter lesen so aufregend wie Telefonbücher aus New York zu lesen.
Für die meisten Angaben sind meine Hobbyelektronikkenntnisse zu gering und mein technisches Englisch zu schlecht.

Deswegen wäre mal so ein Step by Step für einen Timer ganz interessant.

Doc_Arduino

Hallo,

er wird mit den Basics zu kämpfen haben.
Wegen Arduino/Teensy. Das haste irgendwie falsch verstanden. Ich möchte und will niemanden verbieten über Teensy zu reden. Für mich war nur sehr zeitig klar, dass Hans seinen Arduino nimmt und damit loslegen möchte. Deshalb und nur deshalb wollte ich sehr zeitig beginnen etwas Ordnung im Thread zu halten. Mehr nicht. Was jetzt mit den weiteren Postings eh hinfällig gewurden ist.  :)

Im Moment weiß ich nicht ob ich nicht doch eine separate Anleitung schreibe, da hier alle unterschiedliche Wissensniveaus haben. Nur gibts wiederum schon viele im Netz zu finden. Deswegen frage ich mich dann wieder über die Sinnhaftigkeit solch einer neuen Anleitung.

Wenn Si Sensor auch noch Interesse hat, dann werde ich es mal Stück für Stück aufsetzen. Ohne Datenblätter gehts aber nicht. Ich werde versuchen es so gut es geht zu erklären.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

ihr könnt ja schon einmal etwas rechnen um ein Gefühl zu bekommen wie schnell oder langsam so ein Timer sein kann. Wir bleiben beim Timer 1. Der hat einen 16Bit Zähler. Zählt also von 0 bis 65535. Und er hat verschiedene Prescaler. Das sind Vorteiler um den Timer langsamer zu machen. Der Prescaler hängt zwischen µC Taktgeber (unserem 16MHz Resonator/Quarz) und dem Timer-Takteingang. Ist bei näherer Betrachtung aus dem Blockdiagramm ersichtlich. Okay, nicht ganz, wird aber erwähnt. ;)
Im ATmega328 Datenblatt ist das Kapitel 16.
Im ATmega2560 Datenblatt ist das Kapitel 17.
Alle vorhandenen Prescaler des Timer 1 sind aus Tabelle 16.5 bzw. 17.6 ersichtlich inkl. externer Takt-Flankenerkennung. Wenn wir den Timer immer bis zum max. Counter zählen lassen, also bis zu seinem 16 Bit Maximum. Wieviel Zeit benötigt er mit seinen verschiedenen Prescalern für einen Durchlauf? Könnt ja mal in Ruhe etwas rechnen. ;)  Ich hatte mir damals, als ich das durch hatte, eine Exceltabelle erstellt um nicht jedesmal von vorn anfangen zu müssen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#23
Oct 22, 2016, 08:00 pm Last Edit: Oct 28, 2016, 01:33 am by Doc_Arduino
                                                             under new construction


                                       Die gesamte Anleitung wird komplett neu erstellt.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#24
Oct 23, 2016, 04:52 pm Last Edit: Oct 28, 2016, 01:37 am by Doc_Arduino
Hallo,

so, vielleicht hatte schon jemand Zeit das auszuprobieren. Einigen wir uns auf folgende Einstellungen.  ;)

Code: [Select]
void set_Timer1()   //  Phase Correct PWM, Mode 11
{
  cli();         // Interrupts ausschalten
  TCCR1A = 0;    // Reset TCCR1A Register
  TCCR1B = 0;    // Reset TCCR1B Register
  TIMSK1 = 0;    // Reset TIMSK1 Register (disable Timer Compare Interrupts)
  TCNT1  = 0;    // Start 0
  OCR1A = 160;   // TOP Wert bestimmt Auflösung und mit Prescaler den PWM Takt 50kHz
  OCR1B = 40;    // 25% Pulsweite, OCR1B <= OCR1A
  TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);  // nicht invertiert
  TCCR1B = (1<<WGM13) | (1<<CS10);    // Prescaler 1
  sei();         // Interrupts einschalten
}  // end Funktion


Eine wichtige Korrektur muß ich noch schreiben in Bezug auf die mögliche Live Änderung vom TOP Wert. Da kam ich gestern selbst durcheinander. Sorry. In allen PWM Modi kann man laut Datenblattbeschreibung TOP live ändern wenn man dafür das OCR1A Register verwendet. Wie oben geschrieben. In allen anderen Timer Modi kann man das laut Datenblatt nicht, auch wenn man OCR1A für TOP verwendet. Das Double Buffer Feature in in den non PWM Modi deaktiviert.

Ist aber nicht weiter tragisch, dann nutzt man entweder den Overflow Interrupt oder man stoppt den Timer, nullt ihn, setzt ihn neu und läßt ihn wieder laufen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Holzwurm56

Hallo,
hier habe mal einen Anfang für das PWM-Programm gemacht. Ich habe gesehen das es wohl einen neuen Timer 1 oder Timer 3 gibt bei dem man die Frequenz und das Tastverhältnis einstellen kann, aber ich habe kein deutsches Tutorial darüber gefunden und weiß noch nicht wie ich meine Variablen in den Code einfügen kann.
Code: [Select]

//PWM-Generator, Arduino Nano mit einstellbarer Freqeunz und
//Tastverhältnis

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //initialisieren Bibliothek LCD-Pins
int freq; // Frequenz des PWM-Signals
int tast; // Tastverhältnis
int freqanzeige; // Anzeige auf LCD-Display
int ausgang = 9; //PWM-Ausgang
int ADC0=0;
int ADC1=0;

void setup() {
  lcd.begin(16, 2); //Konfigurieren LCD-Display 2 Reihen mit je 16 Zeichen
  lcd.setCursor(0, 1);
  lcd.print("Freq: ");
  lcd.setCursor(14, 1);
  lcd.print("Hz");
  lcd.setCursor(0, 2);
  lcd.print("Takt: ");
  lcd.setCursor(14, 2);
  lcd.print("%");
  pinMode (9, OUTPUT); // PWM-Pin als Ausgang konfigurieren
 
  }

void loop() {
  freq = analogRead(ADC0);
  tast = analogRead(ADC1);
    freq = freq / 10;
    tast = tast / 10;
    if (freq > 100) freq = 100;
    freqanzeige = 50000/100; // Ausrechnen Anzeigewert
    if (tast > 100) tast = 100;
    lcd.setCursor(7, 1);
    lcd.print(freqanzeige);
    lcd.setCursor(7, 2);
    lcd.print(tast);
   
 

}


MfG

Hans

Doc_Arduino

Hallo Hans,

an Hand deines Codes sehe ich, dass du viel zu schnell bist und das geschriebene nicht durchgegangen bist. Warum überspringst du das? Du mußt einen Schritt nachdem anderen machen. Du hast das Ziel einen PWM Generator zu programmieren. Das ist völlig i.O. Aber es lauern noch viele Verständnisprobleme. Ist auch kein Problem, nur eben alles nacheinander.

Teste doch mal deinen Code ob der wirkich so funktioniert wie er soll. Ein Problem betrifft das Display. Das andere die Frequenzberechnung. Letzteres wirst du nicht erkennen, aber ich.  ;)   Geht aus meiner Beschreibung hervor. Oder war es zu undeutlich geschrieben? Kann auch sein.
Vorschlag.
Bringe erstmal Deinen obigen Code zum laufen das er funktioniert wie er soll.
Dann gehste meine Beschreibung durch und versuchst herauszulesen was den Takt letztlich bestimmt. Und daraus folgend wie man den Takt berechnet. Ums Datenblatt lesen kommste nicht drum herum. Habe extra die Mühe gemacht die Kapitel Nummern anzugeben.


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Holzwurm56

Hallo Doc_Arduino,
erstmal vielen Dank das Du mir helfen willst, aber ich habe leider praktisch nichts verstanden. Kennt jemand ein gutes Tutorial in deutsch speziell über Timer, ich habe leider keins gefunden.
Ich habe eine wohl neueren Timerone-Library von Paul Stoffregen gefunden. Da gibt es spezielle Befehle
für PWM-Frequenz und Duty/Tastverhältnis gefunden, habe aber noch nicht kapiert wie sie funktionieren.
Kennt da jemand den entsprechenden Befehlssyntax?

Ich bekomme kaum Zugriff auf die Seite, ist wohl pausenlos am Rande der Überlastung.

MfG

Hans

Doc_Arduino

Hallo Hans,

ist das kein deutsch was ich schreibe?  :smiley-confuse:
Was habe ich undeutlich formuliert? Was soll ich anders erklären? Wo hängt es?
Abgesehen davon reden wir scheinbar immer aneinander vorbei. Du willst immer gleich an den Timer ran obwohl dein Poti und Display Code noch nicht funktioniert. Bring das erstmal zum laufen.
Die Timer Lib von Paul (ist übrigens der der den Teensy aufgelegt hat) läßt nur eine feste Frequenzeinstellung zu mit variablen Duty Cycle.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#29
Oct 26, 2016, 10:03 am Last Edit: Oct 26, 2016, 10:07 am by Doc_Arduino
Hallo,

ich werde es nochmal komplett neu schreiben. Eigentlich wollte ich keine Kopie von anderen Erklärungen anfertigen die es so im Netz gibt, geht jedoch nicht anders. Nach netten Rückmeldungen.  :) Mein Anfangsziel war es ohne großes Theoriegefassel direkt die benötigten Register und Bits zu erklären. Was man machen darf und was nicht. Und mein Anliegen war es das ihr direkt mit dem Datenblatt arbeitet. Soll aber keine Entschuldigung sein für meinen unverständlichen Text. Ich mach es nochmal. Dauert aber ... geht nur Stück für Stück. Muß erstmal überlegen wie anfange.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up