Arduino micro und PWM.h

Gast #6994008
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.
#6994023
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ß.
#6994045
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.
#6994048
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
}
Angehängte Dateien:
#6994091
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?

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