Forum: Mikrocontroller und Digitale Elektronik Arduino micro und PWM.h


von Black D. (Gast)


Lesenswert?

Moin zusammen,
ich möchrte ein PWM Signal mit einer möglichst hohen Frequenz steuern 
und habe da die PWM.h Bibliothek gefunden. Mit folgedem Programm läuft 
das auch alles wunderbar auf dem Arduino Uno.
1
#include <PWM.h>
2
int Ausgang = 9;    
3
int32_t Frequenz = 30000; // 30Khz        
4
int Poti = A0;         
5
int PotiWert;
6
7
void setup(){
8
InitTimersSafe(); 
9
bool success = SetPinFrequencySafe(Ausgang, Frequenz);
10
}
11
12
void loop(){
13
  PotiWert = analogRead(Poti);
14
  pwmWrite(Ausgang, PotiWert/4);
15
}

Nun wollte ich das Programm auf einen Arduino Mikro laden aber da gibt 
es leider folgende Fehlermeldungen:
1
Arduino: 1.8.20 Hourly Build 2021/12/20 07:33 (Windows 10), Board: "Arduino Micro"
2
3
C:\Users\\AppData\Local\Temp\ccHtDS8e.ltrans0.ltrans.o: In function `setup':
4
5
E:\Uno_PWM_var/Uno_PWM_var.ino:8: undefined reference to `InitTimersSafe()'
6
7
E:\Uno_PWM_var/Uno_PWM_var.ino:9: undefined reference to `SetPinFrequencySafe(signed char, unsigned long)'
8
9
C:\Users\\AppData\Local\Temp\ccHtDS8e.ltrans0.ltrans.o: In function `loop':
10
11
E:\Uno_PWM_var/Uno_PWM_var.ino:14: undefined reference to `pwmWrite(unsigned char, unsigned char)'
12
13
collect2.exe: error: ld returned 1 exit status
14
15
exit status 1
16
17
Fehler beim Kompilieren für das Board Arduino Micro.

Weiß jemand wie ich die Fehler beheben kann?

Viele Grüße

Beitrag #6994012 wurde von einem Moderator gelöscht.
Beitrag #6994013 wurde von einem Moderator gelöscht.
von Veit D. (devil-elec)


Lesenswert?

Hallo,

Arduino v1.8.20 ??? Hast du die IDE aus dem Windows Store? Soweit mir 
bekannt macht die früher oder später Probleme. Aktuell ist eigentlich 
1.8.19 ganz normal von der Arduino.cc Seite.

Gibt es einen Link zur Lib? Sollte man bei Fragen immer zur Verfügung 
stellen.

von Black D. (Gast)


Lesenswert?

Ich glaube die Version habe ich von der Arduino Seite geladen. Ich kann 
aber auch mal auf 1.8.19 wechseln.

Das ist die Bibliothek:
https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads

von Veit D. (devil-elec)


Lesenswert?

Cyblord -. schrieb im Beitrag #6994012:
> Black D. schrieb:
>> Weiß jemand wie ich die Fehler beheben kann?
>
> Hast du ein Gewehr?

So ganz dicht bist du wirklich nicht. Wolltest du nicht etwas sinnvolles 
tun und Jörg beim avr-libc Umzug auf Github helfen? Bist du damit schon 
fertig?

von Peter D. (peda)


Lesenswert?

Black D. schrieb:
> Weiß jemand wie ich die Fehler beheben kann?

Woher soll jemand wissen, was in Deiner pwm.h steht?
Du weißt aber schon, daß man im Web Links posten darf.

von Hugo H. (hugo_hu)


Lesenswert?

Wenn schon copy & paste, dann aber vollständig:
1
 This example runs on mega and uno

Noch Fragen?

von Cyblord -. (cyblord)


Lesenswert?

Veit D. schrieb:

> Wolltest du nicht etwas sinnvolles
> tun und Jörg beim avr-libc Umzug auf Github helfen? Bist du damit schon
> fertig?

Ich fürchte ein Zusammenarbeit mit Jörg ist doch nicht möglich, da 
unsere Vorstellungen über passende oder unpassende Beiträge im Forum ein 
wenig zu stark abweichen.
Aber nett dass du dir da Gedanken machst, vielleicht findest du ja sogar 
mal deine eigenen Probleme wenn du erwachsen bist und musst dich nicht 
um die anderer Leute kümmern. Oder lernst mal in einem Thread On-Topic 
zu bleiben. Wer weiß.

: Bearbeitet durch User
von Hugo H. (hugo_hu)


Lesenswert?

In der Lib selbst steht - ganz am Anfang:
1
/*
2
This library is built to support two of the AVR Architecture 'groups' that Arduino uses
3
a) ATmega48/88/168/328,
4
b) ATmega640/1280/1281/2560/2561
5
*/

von EAF (Gast)


Lesenswert?

Black D. schrieb:
> Das ist die Bibliothek:

Ein kurzer Blick in die Lib zeigt, dass der ATMega32U4 nicht unterstützt 
wird.
Dort ist Nacharbeit nötig.

von Black D. (Gast)


Lesenswert?

GUt danke, dann habe ich das wohl übersehen. Weiß jemand ob es da sonst 
schon eine fertige Bibliothek gibt?

von EAF (Gast)


Lesenswert?

Black D. schrieb:
> Weiß jemand ob es da sonst
> schon eine fertige Bibliothek gibt?

Wozu?
Die Timer sind nicht so kompliziert.

Mein Rat:
Auch Datenblatt lesen!

von N. M. (mani)


Lesenswert?

Du scheinst nur den 8 Bit PWM Timer zu nutzen. Kurzer Blick ins 
Datenblatt...7 Register in dem Timer Typ vorhanden.
Ist also keine Raketenwissenschaft.

Eigenen Header anlegen.
Die 3 Funktionen implementieren:
InitTimersSafe()
SetPinFrequencySafe()
pwmWrite()

Und schon kennst du deinen alten Code verwenden.

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Black D. schrieb:
> Das ist die Bibliothek:
> https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads

Mal davon abgesehen das so ein Archiv keine "saubere" Quelle ist, wird 
dein Controller von der Lib nicht unterstützt. Saubere Quellen sind 
entweder direkt auf Github liegende oder im Lib Manager der Arduino IDE.
Der Arduino Mikro hat den ATmega32U4 drauf.
https://docs.arduino.cc/hardware/micro

Auf die schnelle habe ich jetzt keine PWM Lib für den Micro/Leonardo 
gefunden die 30kHz mitmacht. Du könntest dir das auch selbst schreiben.

Mittels Prescaler und TOP wird die Frequenz bestimmt. Die Formel steht 
im Manual des Controllers. Danach kann man mittels OCR1B das 
Tastverhältnis zwischen 0 und TOP einstellen. Damit wärest du unabhängig 
von Libs.

Der zugehörige Timer 1 Pin 'OC1B/PB6' der hier geschalten wird ist Pin 
10 beim Micro. Noch auf Ausgang setzen.
1
void setTimer1()       // 12 Bit PWM, Phase Correct, Mode 11
2
{         
3
  cli();         // Interrupts ausschalten
4
  TCCR1A = 0;    // Reset 
5
  TCCR1B = 0;    // 
6
  TIMSK1 = 0;    // Reset TIMSK1 Register (disable Timer Compare Interrupts)
7
  TCNT1  = 0;    // initialize counter value to 0
8
  TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);   // Mode 11
9
  TCCR1B = (1<<WGM13) | (1<<CS11);                  // Prescaler 8 >> x,xHz 
10
  OCR1A = 4095;  // TOP Wert bestimmt Auflösung und mit Prescaler den PWM Takt
11
  OCR1B = 0;     // Pulsweite, OCR1B <= 4095 (2^12)
12
  sei();         // Interrupts einschalten
13
}

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Cyblord -. schrieb:
> Aber nett dass du dir da Gedanken machst, vielleicht findest du ja sogar
> mal deine eigenen Probleme wenn du erwachsen bist und musst dich nicht
> um die anderer Leute kümmern. Oder lernst mal in einem Thread On-Topic
> zu bleiben. Wer weiß.

Naja, wer im Glashaus sitzt sollte vorsichtig sein.

von Cyblord -. (cyblord)


Lesenswert?

Black D. schrieb:
> GUt danke, dann habe ich das wohl übersehen. Weiß jemand ob es da sonst
> schon eine fertige Bibliothek gibt?

Evt mal selber denken und PWM einfach selbst machen und die paar Werte 
in die richtigen Register schreiben?
Selber verstehen was da gemacht werden muss?
Selbst mal ins DB schauen?
Ist das zu viel verlangt?
Will man sich ewig hinter 5 Zeilen libs verstecken weil man sich zu fein 
ist den Kram selbst du machen?

von max123 (Gast)


Lesenswert?

Installiere den Code Vision Compiler.
Dieser hat einen  Wizart. Du gibst die Timerkonfiguration (Clockteiler,
Modus...). Dann kannst Du nach Compiele im SOURCE die Register lesen.

hpinfotech.ro

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.