Sinus signal mit variable frequenz

wieso hast du mode 14 fast PWM genommen ?
ich dachte da ist die Frequenz nicht variable oder ?

Hallo,

Okay.

Demnach hast du in #38 mit dem falschen Sketch gemessen. Das sorgte ganz schön für Verwirrung. Die Anzeige in #55 ist dennoch unerklärlich.

Weil Mode 14 dafür genügt. Für eine Frequenzänderung muss am Timer an TOP nichts geändert werden.

Schau dir nochmal den Sketch an. Wo lege ich die Frequenz die 50Hz fest? Das baust du auf variabel um. Überlege wie man das machen könnte. Bei Änderung eine neue Berechnung durchführen. Was studierst du? Was baust du damit?

Ich studiere elektro- und informationstechnik
Ich baue damit nichts. Das ist einfach eine Aufgabe

Hallo,

okay. Mach dich bitte nochmal mit deinen Meßgeräten vertraut.
Mit dem ersten Sketch in #31 musst du mit Filter einen 245Hz Sinus messen.
Mit dem zweiten Sketch in #31 musst du mit Filter einen 50Hz Sinus messen.
Mit dem Sketch in #43 musst du ohne Filter ein 100Hz Rechtecksignal messen.
Danach überlegste dir wie man die Frequenz variabel gestalten könnte.

ich habe ganze zeit im internet nach beispiele gesucht und habe leider nur gefunden dass es mit mode 8 oder 9 geht.
für eine frequenz zwischen 45 und 55hz brauche ich einen Integral. stimmt das ?
Oder so einstellen dass beim Vergleich weniger Stürzwerte genommen werden?

Hallo,

gib mir mal die gefundenen Links zum lesen.

Phase Correct und Phase & Frequency Correct macht die mögliche PWM Frequenz um Faktor 2 langsamer. Kann man hier machen, muss man aber nicht. Bei DDS macht man eigentlich immer alles so schnell wie möglich.

Integral? Du willst dich doch nur linear zwischen 45 und 55 bewegen. Du musst dir nur den Code anschauen wo ich die Frequenz festlege. Der Wert dieser Variablen wird dann zwischen 45 und 55 geändert. Das const muss dann natürlich weg, habe ich vorausgesetzt.
Du musst den Code lesen und verstehen lernen.
Du musst nichts am Timer ändern.
Du musst nichts an der Formel ändern.
Du musst das nur etwas anders nutzen bzw. anwenden.
Dann brauchst du noch ein Zeitraster um die Frequenz zu ändern, ansonsten geht das so schnell das man es nicht sieht. Ich gehe davon aus das du das hinbekommen müßtest. Das Hauptprogramm haste ja schon.

const uint16_t RESOLUTION {sizeof(Sinus)/sizeof(Sinus[0])};
const uint32_t PWM {F_CPU/RESOLUTION}; // 8 Bit: 62500 / 10 Bit: 15625
int main () {
int FREQUENCY1 = 45; // Hz
int FREQUENCY2 = 55;
if(FREQUENCY = 45){
FREQUENCY = FREQUENCY1 = 45;
}
else {
FREQUENCY = FREQUENCY2 = 55;
}
}
const uint16_t PHASENDELTA {static_cast<uint16_t>((65536UL*FREQUENCY/PWM)+0.5)}; // 50Hz >> 8 Bit: 52 / 10 Bit: 210
uint16_t phasenakku;

Ich bin jetzt wieder dabei mein Projekt fertig zu machen.
Ich habe an if schleife gedacht aber es funktioniert nicht. Was habe ich da falsch gemacht ?

Macht vermutlich nicht was du willst,
sondern setzt FREQUENCY auf den Wert 45. Die if-Bedingung ist damit immer true

Nachtrag: FREQUENCY ist nicht definiert. Auch ist unklar ob es woanders noch verändert wird. Daher ist es müßig zu spekulieren ob das nicht überhaupt Unsinn ist, was du da zeigst.

Hallo,

@ TO:
Also so langsam bin ich genervt von deinem Verhalten. Bis heute verwendest du keine Code Tags und postest immer nur Codefetzen. Daraus sollen ich/wir nun schlau werden was du alles geändert hast. Mir scheint du hast bis heute von all dem Gezeigten nichts gelernt.

Letzter Tipp. Vergiss erstmal das DDS. Programmiere dir nur ein Programm was kontinuierlich einen Wert zwischen 45 und 55 ändert und dabei den Wert hin und her pendeln lässt.

Na dann mach mal. Bis jetzt ist ja überhaupt nichts passiert.

Meine frage war von anfang an wie kann ich ein Pgramm was kontinuierlich die frequenz zwischen 45 und 55 hz ändert. Ein sinnvoller Tipp wäre wie ich das machen soll.
Ich bedanke mich trotzdem für deine antworten :slight_smile:

Danke gleichfalls für Deine Antworten :wink:

Offensichtlich reden hier viele Leute aneinander vorbei, weil sich manche Fragen nicht so ohne weitere Angaben beantworten lassen. Nach inzwischen über 70 Beiträgen solltest Du Dir vielleicht die Mühe machen, die Dir gestellten Fragen so zu beantworten, daß man Dir weiterhelfen kann.

Die Aufgabe ist völlig klar.

Jetzt muss ich dich fragen. Wieviele Tipps möchtest du denn noch haben?
Das eigentliche Programm mit dem DDS liegt dir zu Füßen.
Jetzt gehts nur noch darum das die Frequenz ständig pendelt.
Wie oft soll ich dir noch sagen das du dir Gedanken nur darüber machen sollst wie man einen Werten zwischen 2 Limits pendeln lassen kann. Ohne dem DDS Kram.
Wie zählt man Werte hoch?
Wie zählt man Werte runter?
Wie prüft man auf Wertüberschreitung?
Das sind alles Grundlagen der Grundlagen.
Wenn das klappt bauen wir das zusammen. Dafür kam von dir bisher kein Einziger Ansatz. Im Grunde stehst du einen Millimeter vorm Ziel. Aber diese einfachste letzte Aufgabe die noch fehlt nehme ich dir nicht ab. Du musst schon mitmachen. Leider sehe ich das überhaupt nicht. Es ist deine Aufgabe, du bist der Student. Es liegt bei dir mitzumachen. Falls du allerdings noch nie eine Zeile programmiert hast, danach sieht es aus, dann wird es schwer für dich.

Deine Einzigste Frage ist ja streng genommen, wenn man es übersetzt, wer schreibt mir das Programm? Nur wenn das dein Projekt ist und du benotet wirst, musst du dafür auch etwas tun. Ansonsten bewertet dein Prof mich/uns und nicht dich. Weil eine Quellenangabe machst du ja sowieso nicht.

kannst du mir bitte zugehörige Literatur empfehlen?
Ich habe sehr viel gegoogelt aber leider nichts konkretes gefunden (zumindest nicht auf deutsch).

Sehr gutes C++ Buch
Für den Anfang etwas einfacher die deutsche Arduino-Referenz

Gruß Tommy

Edit: Ansonsten lesen viele Profs und Dozenten die einschlägigen Foren mit und die kennen Ihre Aufgabenstellungen. Da wird dann bei Verwendung ohne Quelle schnell eine 6 wegen Plagiat draus.

was ist wenn die Anzahl der schritte gleich bleibt (so dass ich die 45hz bekomme )
und anstatt 22ms für ne Periodendauer mache ich 18 ms damit ich 55hz raus bekomme ?!

Hallo,

ich verstehe nicht warum du dich jetzt mit der falschen Aufgabe beschäftigst.
Kurz zu deiner Frage. In dem man die Eingangsgröße kontinuierlich ändert hat das zur Folge das sich die Ausgangsgröße kontinuierlich ändert. Je nachdem wie schnell man das macht, je nachdem ändert sich der Ausgang mit. Was eigentlich logisch ist. Aber damit solltest du dich gar nicht beschäftigen. Du lenkst dich selbst ab.

Was ist hier die entscheidende Eingangsgröße? Oder anders gefragt. Ist deine zu ändernde Eingangsgröße enthalten? Wenn ja, wie lautet diese?

const uint16_t RESOLUTION {sizeof(Sinus)/sizeof(Sinus[0])}; 
const uint32_t PWM {F_CPU/RESOLUTION};      // 8 Bit: 62500  / 10 Bit: 15625
const uint16_t FREQUENCY {50};              // Hz
const uint16_t PHASENDELTA {static_cast<uint16_t>((65536UL*FREQUENCY/PWM)+0.5)};  // 50Hz >> 8 Bit: 52 / 10 Bit: 210
uint16_t phasenakku;

Ich weiß nicht wie du jetzt auf [ms] kommst. Und selbst wenn du das mit der Periodendauer rechnest, bleibt deine Aufgabe gleich. Wie verändert man irgendeinen Wert der sich zwischen 2 Limits kontinuierlich bewegen soll?

1.te frage :

ja, die 50hz.

die 2.te frage :

in dem man den wert inkrementiert oder dekrementiert.

Richitg - Variable FREQUENCY. Und warum willst du dann in [ms] rechnen?

Richtig. Nur das hatten wir schon. Du musst und solltest das in Code umsetzen. Ich dachte du fängst damit mal an ...
Oder du wartest auf das Buch oder du gehst in die Bücherei ...

Antwort auf die nicht gestellte 3. Frage:
...und an den Bereichsgrenzen oben (55Hz) und unten (45Hz) die Bewegungsrichtung (INC/DEC) umkehrt.

Das kannst Du als einfachen Sketch anhand einer Variablen namens FREQUENCY mit Ausgabe auf den seriellen Port ohne das ganze Sinus-Gelumpe implementieren und hier vorstellen.

Dann kommt der Doc:

Die Suche nach "Inkrement Operator" liefert mir bei Bing 7.3 Millionen Ergebnisse und weil ich das "in C++" vergessen habe ist das hier erst das vierte Ergebnis in der Liste.

Hallo,

das ist leider nichts Neues. Die Aufgabe ist seit Wochen glasklar. In welchen Limits er einen Wert pendeln lässt ist nebensächlich. Kann man am Ende immer noch anpassen. Ich möchte erstmal ein funktionierendes Gerüst sehen worauf man aufbauen kann. Es kann ja nicht sein das man einen Studenten an die Hand nehmen muss. Ansonsten könnte er sein Studium auch gleich beenden. Das muss ich einmal so deutlich sagen.

(Tippfehler korrigiert)