Nano Every PWM Timer TCA

Hallo,
ich bin absolut blutiger Anfänger mit Arduino und die ist mein erster Beitrag hier im Forum.
Deshalb mal ein zusätzliches Hallo an alle die hier aktiv sind.
Für den Fall, dass ich evtl. nicht die richtige Kategorie getroffen habe oder aus Versehen ins Fettnäfpchen getreten bin, bitte ich schon mal vorsorglich um Entschuldigung und hoffe auf eine kleine Hilfe zu folgendem Problem:

Für mein erstes Projekt "Stroboskop / Drehzahlmesser" habe ich bei Youtube eine recht brauchbare Vorlage gefunden, was ich aber auf meinen Zweck noch stark anpassen muss.
Das Projekt nennt sich "Stroposkop_LED_Drehzahlmesser".
Verwendet wird eine Librarie pwm Copyright (c) 2012 Sam Knight.

Das Ganze funktioniert mit einem Arduino Uno bisher sehr gut und völlig problemlos, wenn gleich noch etwas verbesserungsbedürftig.
Dummerweise kann ich das Projekt aber nicht auf den später zum Einsatz vorgesehenen Arduino Nano Eve verwenden.

Es wäre wirklich nett, wenn mir dabei jemand helfen könnte.

VG Jürgen

C:\Users\JRGEN~1\AppData\Local\Temp\ccs9B6MW.ltrans0.ltrans.o: In function `SetPinFrequency()':
C:\Users\Jürgen\Documents\Arduino\Stroposkop_LED_Drehzahlmesser/Stroposkop_LED_Drehzahlmesser.ino:60: undefined reference to `SetPinFrequencySafe(signed char, unsigned long)'
C:\Users\Jürgen\Documents\Arduino\Stroposkop_LED_Drehzahlmesser/Stroposkop_LED_Drehzahlmesser.ino:61: undefined reference to `SetPinFrequencySafe(signed char, unsigned long)'
C:\Users\JRGEN~1\AppData\Local\Temp\ccs9B6MW.ltrans0.ltrans.o: In function `setup':
C:\Users\Jürgen\Documents\Arduino\Stroposkop_LED_Drehzahlmesser/Stroposkop_LED_Drehzahlmesser.ino:16: undefined reference to `InitTimersSafe()'
C:\Users\Jürgen\Documents\Arduino\Stroposkop_LED_Drehzahlmesser/Stroposkop_LED_Drehzahlmesser.ino:19: undefined reference to `pwmWrite(unsigned char, unsigned char)'
C:\Users\Jürgen\Documents\Arduino\Stroposkop_LED_Drehzahlmesser/Stroposkop_LED_Drehzahlmesser.ino:20: undefined reference to `pwmWrite(unsigned char, unsigned char)'
collect2.exe: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1

Nur mit der Fehlermeldung kann man nicht sehr viel Anfangen. Es klingt danach, als wären Libs nicht richtig installiert oder nicht für Deinen geplanten Arduino geeignet.
Gib uns bitte die Links zu den Libs und Deinen Sketch (in Codetags - wie das geht, steht hier)

Gruß Tommy

Ich kann nur raten, daß die Bibliothek den Controller nicht unterstützt. Hast Du es schon mal ohne versucht?

Vielen Dank für die superschnelle Reaktion.

Der Link vom original Projekt ist folgender:
https://www.youtube.com/watch?v=aCnB8vkpDbE&list=WL&index=100

Da hängt das Projekt in der Beschreibung als zip inklusive lib an.

Ich vermute eben auch, das der Nano für die Lib nicht geht.
Dann benötige ich aber etwas Anderes, was am Ende das gleiche macht.
Ich sage es nur nochmal, mit dem Uno funktioniert das bestens.
Dann nehme ich den gleichen Sketch, das gleiche Projekt, stelle nur den verwendeten Port um und es kommt der Linker Fehler.

Im Grunde ist die Aufgabenstellung ja simpel:
Zwei Leds sollen mit einstellbarer Frequenz blinken.
Die Einschaltdauer soll dabei möglichst kurz sein.

Ich möchte damit reparierte Motoren mit interner Drehzahlregelung auf Gleichlauf prüfen.

Das ist ja eine sehr präzise Vorgabe :wink:

Hast Du es schon mal mit dem IDE Beispiel BlinkWithoutDelay probiert?

Hast Du das Core-Paket für den Every installiert?
Das Zip kollidiert mit meinen Sicherheitseinstellungen.

Gruß Tommy

@DrDiettrich

pwmWrite(led1, 1);
pwmWrite(led2, 1);

Das entspricht 1 % Einschaltdauer.
Um du schärfer sehe ich meine Markierung beim Blitzen.

@Tommy56
Als ich den Nano das erste mal angesteckt habe, kam eine Meldung ich möge die Treiber instllieren.
Das habe ich auch gemacht.

Die Warnung beim Entpacken des Zip habe ich auch bekommen.
Habe es trotzdem ausgepackt.

Ich kann die Dateien wenn nötig irgendwo ungepackt hinladen.
So viele ist das nicht.
Ich könnte den Inhalt genausogut hier anfügen.

Könntest Du auch die Fragen beantworten?
Der Nano Every hat nichts mit dem Nano zu tun. Das ist ein völlig anderer Prozessor. Wenn es mit dem UNO funktioniert, könntest Du bei dem bleiben oder einen Nano mit 328P benutzen.

Gruß Tommy

Ich kann diese Frage nicht beantworten, weil ich sie nicht verstehe.
Aber wenn Du mir erklärst wie ich dieses Paket installieren muss tue ich das gern noch fix.

Und ja, du hast Recht, ich war eine wenig unpräzise.
Ich habe einen Uno mit dem es funktioniert und eine Nano Eve mit dem es nicht funktioniert.

Ich wäre auch bereit noch einen Nano zu beschaffen, wenn das eine Lösung ist. Kostet ja nicht viel.

Da kollidiert die Website - ich habs mal gewagt :wink:
Geht.

@jb66 Du hast ein Problem.
In der lib steht ausdrücklich:

/*
This library is built to support two of the AVR Architecture 'groups' that Arduino uses
a) ATmega48/88/168/328,
b) ATmega640/1280/1281/2560/2561
*/

der every passt da nicht rein. -> ATMega4809
Die lib müsste angepasst werden, da mit timer gearbeitet wird - siehe im Verzeichnis utility

Für den Every müsstest Du den Core installieren. Wie das geht steht hier. Dass es dann immer noch nicht geht, ist nicht auszuschließen.
Mit einem "normalen" Nano mit 328 (wie beim UNO) geht es, also nimm lieber diesen.

Gruß Tommy

Hallo @my_xy_projekt
so groß ist das Problem ja nicht.
Vor allem nicht, wenn es durch den Kauf eines Nano zu erledigen ist.

Aber die Anpassung der lib wäre auch interessant.
Das übersteigt allerdings meinen derzeitigen Horizont.

Interessant wäre es aus noch einem anderen Grund.
Ich kann das derzeitige Programm für meine Prüfung der Drehzahl schon verwenden.
Es hat aber einen Nachteil, der auch mit einer Änderung der Lib sicher zu beheben wäre.

Ich kann die Frequenz derzeit nur in 1 Herz Schritten ändern.
Viel besser wären 0,1 Herz

Beim Umbau der lib bräuchte ich aber definitiv Hilfe.

@Tommy56
Ich denke, es ist installiert.
Das Blinkbeispiel konnte ich ja ohne Weiteres kompilieren.
core

Dochdoch.
Dreist wenn Du auf einen anderen Controller umsteigst, ist Deine Anforderung ja dann noch die Änderung der Auflösung.

Aber vielleicht ist es mit einem anderen Controller dann nicht ganz so schwer.

Den einizigen, den ich kenne der den every schon mehrfach in der Mache hatte, wäre @Doc_Arduino - und das umschreiben bzw. hinzufügen entsprechender Routinen benötigt schon etwas an Wissen udn ist nicht mal so nebenher gemacht.
Einen ersten Eindruck bekommst Du, wenn Du in seinem Profil auf seinen Link Nano Every Basics klickst.

Ist das möglicherweise diese Library?

https://github.com/terryjmyers/PWM/blob/master/PWM.h

Ok, dann ist der Core da.
Es gab hier mal eine Thread von @Doc_Arduino zum 4809, den ich hier gehostet habe. Evtl. hilft Dir das weiter. Einiges an Einarbeitung wirst Du aber da rein stecken müssen.
Ich habe keinen Nano Every, kann Dir da also nicht mehr weiter helfen.

Gruß Tommy

Ist ein Ableger auf einem anderen Zweig.
Im Archiv ist das Datum 2018.

Ich häng mal das expandierte und wieder eingepackte hier ran.
libraries.zip (12,0 KB)

//Made by Adam Wilczek 
#include <PWM.h>
int led = 9;
int led1 = 10;
int schalter = 3;
int schalter1 = 4;
int i = 0;
int herz = 25;
void setup() {
  Serial.begin(9600);  
  InitTimersSafe();
  SetPinFrequencySafe(led, 100);
  SetPinFrequencySafe(led1, 100);
  pinMode(led, OUTPUT);
  pinMode(led1, OUTPUT);
  pwmWrite(led, 10);
  pwmWrite(led1, 10);
  pinMode(schalter, INPUT_PULLUP);
  pinMode(schalter1, INPUT_PULLUP);
}
void loop() {
  Serial.print(herz);
  Serial.print("\n");
  if (!digitalRead(schalter)) {
    herz++;
    SetPinFrequencySafe(led, herz);
    SetPinFrequencySafe(led1, herz);
  }
  if (!digitalRead(schalter1)) {
    herz--;
    SetPinFrequencySafe(led, herz);
    SetPinFrequencySafe(led1, herz);
  }
  if (herz < 1) {
    herz = 2;
  }
  if (herz > 100000) {
    herz = 99999;
  }
  delay(50);
}

Hallo,

Wenn man den Geist ruft. :rofl: Nicht gab, den Thread gibt es immer noch. :wink:
nano-every-atmega4809-am-anfang-stand-der-anfang

Ich lese du möchtest irgendeine Frequenz haben und den Duty Cycle einstellen.
Von welcher Frequenz oder Frequenzbereich reden wir?
Von welchen Duty Bereich reden wir?
Vielleicht ist im Link schon etwas dabei.
Die Verwendung vom MegaCoreX Core empfehle ich jedem Every Nutzer. MCUdude war so schlau und hat den Timer TCA freigeschaufelt. Wird nicht mehr von millis() & Co belegt. Könnte wichtig werden.

1 Like

Wenn es darum geht, LEDs mit einem bestimmten Timing kurz aufblitzen zu lassen, wäre m.E. eine Timerroutine ausreichend.

Ich habe leider auch keinen Every, bin aber auf diese Lib gestoßen:

https://github.com/Kees-van-der-Oord/Arduino-Nano-Every-Timer-Controller-B/tree/master/EveryTimerB

Das als Ino-File beigefügte Beispiel ist ziemlich umfangreich, allerdings gibt es auf der Startseite bei GitHub folgenden Code, der kurz und bündig ist:

#ifdef ARDUINO_ARCH_MEGAAVR
#include "EveryTimerB.h"
#define Timer1 TimerB2    // use TimerB2 as a drop in replacement for Timer1
#else // assume architecture supported by TimerOne ....
#include "TimerOne.h"
#endif

// code below will now work both on the MegaAVR and AVR processors

void setup() {
  Timer1.initialize();
  Timer1.attachInterrupt(myisr);
  Timer1.setPeriod(1000000);     // like the TimerOne library this will start the timer as well
}

void myisr() {
  // do something useful every second	
}
  • Passende Periodendauer in Mikrosekunden einstellen
  • In der ISR Zähler für Ein/Aus einbringen
  • LEDs bei Erreichen der jeweiligen Zählerstande schalten

digitalWrite sollte ggf. durch direkte Portmanipulation ersetzt werden, um die ISR nicht zu lange zu beanspruchen.

1 Like

Danke für die vielen Beiträge.
Ich muss das nachher erst mal alles lesen, bin noch unterwegs.

Da sprichst Du etwas wichtiges an.
Die lib kann ja bis in den kHz Bereich.
Das brauche ich nicht.
Ich brauche so von 30 bis 50 Hz praktisch.
Von 1 bis 100 wäre mehr als ausreichend.

Das schafft natürlich Platz im Wertebereich.
Die lib wird ja mit einem int gefüttert.
Wenn also das ganze einen 10er Teiler bekommen würde, wäre das völlig ausreichend.

Dann wäre eben der Wert in "herz" nicht 1 Herz sondern 0,1 Herz und 330 33 Herz.
Das wäre völlig ausreichend.

Hallo,

also 30 ... 50Hz, optimal 1 ... 100Hz.
Auflösung 0,1Hz.
Signalform symmetrisches 50% Rechtecksignal?
Lies dich mal ein. Meine Timer Libs sind keine Universal Libs. Sie dienen nur zum einfacheren Konfigurieren der Timer laut Manual. Wobei man das hier, wenn es einfach gehalten bleibt auch direkt schreiben kann. Wird man sehen. Morgen bin ich nicht da. Wenn du wirklich tiefer wissen willst wie man das macht bin gern bereit das zu erklären.