So Hallo, Ich bin ein Einsteiger und beschäftige mich seit einiger Zeit mit Mikrocontrollern. Momentan möchte ich eine Software PWM programmieren. Den Mikrocontroller benötige ich um Bauteile mit bestimmten Spannungswerten anzusteuern. Dabei möchte ich mehr als 12 Kanäle gleichzeitig steuern. Die Auflösung sollte so hoch wie möglich sein. Außerdem sollten die Pulsabstände sehr klein sein. Dazu habe ich mir das angehängte Programm überlegt. Die Werte für die einzelnen Ausgänge werde ich per TWI, bzw SPI in die globalen Variablen übertragen. Die Spannungswerte ändere ich nur in längeren Abständen von mehreren Sekunden. Ich dachte mir, da ich den Mikrocontroller für keine anderen Prozesse benötige, könnte ich die PWM-Erzeugung einfacher gestalten. Die Arbeitschleife besteht dabei aus einem Zähler der endlos nach oben zählt und lauter Vergleichen mit den einzelnen globalen Variablen Ich habe gedacht, dass ich damit über die globalen Variablen die Spannungsverhältnisse einstellen kann. Natürlich hat man bei dieser Methode immer einen kleinen Fehler durch die Laufzeit des Programms, aber bei 8MHZ sollte dieser vernachlässigbar sein. Anbei habe ich die Testumgebung für den ATMEGA 8 angehängt. GainA ist dabei (2^16)/2. Damit wäre das reintheoretisch ein Ausgangspegel von ca.2,5V. In der Realität habe ich jedoch gar kein Ausgangssignal. Ich wollte fragen, ob jemand von euch weiß warum das ganze nicht funktioniert? Wäre echt nett, wenn jemand sich das mal ansehen könnte, da ich wie gesagt noch nicht so viel Erfahrung besitze.
Sieh dir die Ausgänge mit einem Oszilloskop an. Multimeter haben einen sehr eingeschränkten Frequenzbereich in dem ein sinnvoller Gleichanteil gemessen werden kann. Die Logik an sich sollte funktionieren, allerdings kenne ich den ATmega nicht, und kann so nicht beurteilen ob die Portsettings korrekt sind. So wie du die MainLoop aufgebaut hast, ist die Ausgangsfrequenz extrem von Code abhängig. Eventuell wäre es besser die Ausgabe mit einem Timerinterrupt in definierten Intervallen aufzurufen. Dann hängt die Ausgangsfrequenz vom eingestellten Wert im Timer ab und ändert sich nicht bei jeder Codeänderung.
mmh, habe den code überflogen und mir ist kein fehler aufgefallen (zugegeben, code kann man eher falsifizieren als verifizieren (ist wie mit wissenschaftlichen Theorien (popper :-)))) gruß
Danke, für eure schnelle Antwort. Wenigstens besteht so eine Chance, dass es funktionieren kann. Der Oszibefund muss leider noch auf sich warten, da ich momentan noch keines zur Verfügung habe (Ich weis, ist n bissle ärmlich, wenn man µC programmieren will). Ich wollte erst mal den Code so einfach wie möglich zum Laufen bringen. Den Timerinterrupt kann man später ja immer noch einbauen, um die Frequenz zu steuern. Ich habe mir halt gedacht, dass ich statt dem Interrupt eventuell auch einfach in der Arbeitsschleife ne Verzögerungsschleife einbaue, dann könnte ich eventuell den Takt einfach steuern (Poti->A/D) und dann per Oszi einstellen. Ich häng halt irgendwie noch an der guten alten Hardware ;-)
Super. Somit hast du eine 16bit-12Kanal Doft-PWM programmiert. Was steuerst du mit dieser PWM an?
>Ich steuere damit solidstate Optokoppler an.
Und was steuern die an?
Die steuern Verstärkung und Filter in einem Vorverstärker. Sozusagen als Potiersatz
Bin jetzt doch noch schnell an ein Oszi gekommen. Verrückterweise zeigt der Atmega8 am Pin D2 ein 5V Signal. An allen anderen Null. Ist denk ich mal schrottreif, da ich kurz n anderes Programm zum testen drüber laufen lies, und da war das gleiche. Wenn von euch jemand den kurz zu Hand hätte und einfach mal Messen könnte, ob bei im am Pin B0 n 2,5V Signal rauskommt, dann wäre das echt nett. Ich hab nämlich nur den einen gehabt. Es liegen sonst nur noch Atmega 128 rum, und für die hab ich keine Testumgebung (SMD). Wäre also wie gesagt echt nett, wenn einer von euch das machen könnte.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.