Wenn ich nur den ADC laufen lasse (so schnell er kann), erreicht er 14,9 kHz. (In dieser Zeit wandelt er im Single-Modus zwei verschiedene ADC-Inputs). Sobald ich aber eine PWM dazu schlalte, senkt sich die Geschwindigkeit des ADC auf 10,5kHz. Nehme ich noch eine zweite PWM hinzu, so sinkt die Geschwindigkeit des ADC erneut auf 8 kHz.
PS: PWM dazuschalten bedeutet hier nur den Timer dafür initialisieren und einmalig mit einem Wert füllen. Danach wird die PWM nicht erneut gesetzt und der Timer erzeugt auch keine (software)Interrupts.
Gemessen habe ich das mit einem Osziliskop und dem Toggeln von Pins.
Ist ein solches Verhalten bereits so schon bekannt und erklärbar, oder sind nähere Informationen von mir nötig? (kann ja sein, dass das schon bekannt ist. Deshalb wollt ich erstmal nachfragen, bevor ich mit Details komme)
Über Hilfe/Gedanken/Antworten würde ich mich sehr freuen.
ich habe den Quellcode mal auf das Problem zusammengeschrumpft und als compolierfähiges Projekt angehangen.
Ich hoffe nicht auf Seiteneffekte zum weg-gekürtzen Code. Solltest du also das Problem im angehangenen Quellcode nicht entdecken, werd ich noch mehr von dem ganzen Code posten.
Kurz zum Code (bzw dessen sinn):
Es gibt zwei Motoren, die jeweils über eine PWM angesteuert werden. Gleichzeitig wird der Stromverbrauch an diesen Motoren gemessen. Da ich leider keinen Modus gefunden habe beide ADC-Pins gleichzeitig wandeln zu lassen, muss ich im ADC-fertig-Interrupt den ADC-Pin wechseln und die ADC-Wandlung neu starten.
In der Main() lasse ich vorher einfach mal die PWM laufen. Also ich setze einfach nur einen Wert in die Timerregister... Aber sobald ich das mache, wird der ADC deutlich langsamer (siehe meinen vorherigen Post).
Wäre SUPER wenn du/ihr mir helfen könntet.
Beste Grüße
Sebastian
PS: kurz noch zu dem, was ich zum kürzen des Porjektes weggemacht hatte: (folgendes wurde vorher nur noch mit initialisiert, aber bei der Reproduktion des Problems nicht benutzt)
* initialisierung der I2C-Schnittstelle
* initialisieren des Timer5 (aber nicht starten -> prescaler = 0) um Encoder seriell auszulesen
* Timer 1 initialisieren (dieser dient nur der globalen Zeitmessung im Projekt) -> prescaler = 0 -> nicht gestartet
Lesezeichen