PWM-Steuerung will nicht funktionieren

rhschneider

Neues Mitglied
19. Feb. 2009
6
0
0
Sprachen
  1. BascomAVR
Hallo liebe Forenuser,
ich habe mir eine Schaltung samt Code aus dem Netz gezogen, das Ganze aufgebaut und einen Atmega8 gebrannt - keine Funktion. Am Schaltungsaufbau kann es nicht liegen, ich vermute, dass entweder der Code nicht ganz astrein ist oder beim Brennen was danebengeht.
Ich habe es versucht über ISP und auch mit meinem Galep4, das Ergebnis ist immer dasselbe: sobald der Atmega8 Betriebsspannung sieht, schaltet dieser die Ausgänge Pin14 PB1(OC1A) und Pin15 PB2 (SS/OC1B) auf high und bleibt auch dabei. Wenn ich unter Betriebsspannung an der leeren Fassung messe, ist alles O.K. also der Atmega legt die Ausgänge definitiv auf high. Alles was in dieser Schaltung mit PWM zu tun hat ist ohne Funktion, bzw. ich hab's nicht hinbekommen. Die Features Eingang als Impuls oder Dauerspannung funktionieren. Ich habe jetzt Stunden (und Nächte) mit der Fehlersuche verbracht und komme absolut nicht mehr weiter. Daher meine Bitte um Unterstützung an Euch: Kann sich mal jemand das Listing genauer betrachten und mir auf die Sprünge helfen, oder mir erklären was ich sonst falschgemacht haben könnte? Ich bin für jegliche Unterstützung dankbar! Das Listing und den Schaltplan hänge ich an und hoffe darauf, dass jemand einen Fehler finden kann.
Code:
Anhang anzeigen motcntrl.bas
Plan:
Schaltbild.gif
Einstweilen bedanke ich mich erstmal für Eure Unterstützung!

Gruß Richard
 
Da die anderen Funktionen ja scheinbar funktionieren, wäre mein erster Gedanke,
eine fehlende Steuerspannung, sodass der PWM permanent auf 0xFF ist...
Sind die Potis vieleicht falsch/nicht angeschlossen? oder einer der Endschaltereingänge etc.?
 
Hallo und Danke für Deinen Beitrag,
nach meinen Messungen liegen an Pin 23/24 etwa 2,3V (bei Mittelstellung der Potis) an und die Endschaltereingänge liegen permanent auf low.

Gruß Richard
 
Mach einffach mal ne Kopie vom Programm und ersetze was hinter "pwm1a = " bzw. "pwm1b = " steht durch 125,
dann kannst du sonstige Einflüsse auschliesen, nach Compillieren und Fflashen noch mal nachmessen...

Und lade deinen Schaltplan bitte nochmal als .bmp hoch - man kann den nur schwer lesen...
 
Mach einffach mal ne Kopie vom Programm und ersetze was hinter "pwm1a = " bzw. "pwm1b = " steht durch 125,
dann kannst du sonstige Einflüsse auschliesen, nach Compillieren und Fflashen noch mal nachmessen...

Und lade deinen Schaltplan bitte nochmal als .bmp hoch - man kann den nur schwer lesen...

... leider ist der Schaltplan mit 322kb zu groß zum hochladen und kleinermachen ist nicht wegen der Unleserlichkeit.
 
.bmp ist ein Bitmap, da, was eigentlich allgemein bekannt sein sollte, bei dem von
dir verwendeten jpeg Format eine Verlustbehaftete Komprimierung durchgeführt wird...

Wenn du den Schaltplan als Bitmap hochlädst kann man besser lesen...

Aber eigentlich müsste auch 322kb kein Prob sein, ich hab hier schon
bilder mit über 1Mb hochgeladen...

Was ist mit deiner eigentlichen Fragestellung, probierst du meinen Vorschlag aus?
 
.bmp ist ein Bitmap, da, was eigentlich allgemein bekannt sein sollte, bei dem von
dir verwendeten jpeg Format eine Verlustbehaftete Komprimierung durchgeführt wird...

Wenn du den Schaltplan als Bitmap hochlädst kann man besser lesen...

Aber eigentlich müsste auch 322kb kein Prob sein, ich hab hier schon
bilder mit über 1Mb hochgeladen...

Was ist mit deiner eigentlichen Fragestellung, probierst du meinen Vorschlag aus?

... ja, werd ich gerne ausprobieren, muss aber erst zuhause sein um das tun zu können. Jetzt werde ich versuchen ein ordentliches BMP hochzuladen - Danke!


... sorry geht nicht. Für Bitmaps habe ich hier eine max. Größenbeschränkung von 244kb.
 
Hallo,

ich hab mal den Code überflogen und da ist mir folgendes aufgefallen:

######
' ------------------------------------------------------------------------------
' Subroutinen
' ------------------------------------------------------------------------------

' ADC lesen
Sub Adc_in
' Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Adc0 = Getadc(0) ' Poti Rechtslauf
Adc1 = Getadc(1) ' Poti PWM Linkslauf
Adc2 = Getadc(2) ' Analoger Eingang zur Steuerung der Geschwindigkeit (alternativ zu den beiden Potis)
Stop Adc
End Sub

#######

Wann soll denn der ADC das Eingangssignal verarbeiten ?

Nach dem Start benötigt der ADC eine entsprechende Zeit für die Umsetzung (abhängig von Auflösung, Takt usw.), aber du startest den ADC und erwartest sofort ein Ergebnis - das funktioniert so nicht!

Entweder du suchst mal im Datenblatt, wie lange der ADC für die Umsetzung braucht und wartest nach dem Start ADC oder besser, du läßt dich vom Interrupt wecken, wenn der ADC fertig ist.
 
Bascom, "denkt" schon ein wenig mit, die haben waits vermutlich schon drinne...
Sonst wäre die Sprache ja auch nicht so gut für leute geeignet,
die eigentlich nicht wissen, was sie tuen...
 
oder besser, du läßt dich vom Interrupt wecken, wenn der ADC fertig ist.


Hallo, ich grüße Dich gp177!
Leider reicht mein Bascom Wissen nicht aus um das genau zu überblicken. Kannst Du mir vorschlagen, wie ich das (in Bascom) machen soll?

Vielen Dank und Gruß
Richard
 
im einffachsten Falle: Waitms(2) hinter Start ADC
 
Getadc pollt selbst das ADIF, insofern korrekt (OK, der Controller wartet die Wandlung ab).
Den Plan kannst Du verlustfrei komprimiert als GIF oder PNG anhängen.
Den Code mal bitte als reinen Text in Code-Tags einfügen, ich will das nicht erst aufs Telefon laden. Dann schau ich auch mal rein.
 
Getadc pollt selbst das ADIF, insofern korrekt (OK, der Controller wartet die Wandlung ab).
Den Plan kannst Du verlustfrei komprimiert als GIF oder PNG anhängen.
Den Code mal bitte als reinen Text in Code-Tags einfügen, ich will das nicht erst aufs Telefon laden. Dann schau ich auch mal rein.


Hallo, Grüße Dich LotadaC
versteh nicht ganz, wie Du den Code haben möchtest (etwa 32000 Zeichen)


Danke & Gruß Richard

Schaltplan ist jetzt in besserer Qualität sichtbar.
 
Probier doch einffach mal eben meinen Vorschlag aus,
dannach wissen wir, ob es an der PWM oder an ADC/Hardware liegt...
 
Hallo Richard,

sorry, hatte vorhin nicht viel Zeit.
Dein Plan sieht mir sehr nach EAGLE aus, wenn dem so ist, sollte auch ein Export nach PDF für bessere Lesbarkeit sorgen.

Aber jetzt zum eigentlichen Problem ..

Der ATMeaga8 besitzt nur einen AD-Wandler! aber einen vorgeschalteten Multiplexer, d.h. vor der Messung muss der richtige Kanal (Eingang) auf den AD-Wandler geschaltet werden.
--------------------
Dim Adc0 As Word ' Poti noch frei
Dim Adc1 As Word ' Poti PWM
Dim Adc2 As Word ' Analoger Eingang zur Steuerung der Geschwindigkeit
Dim Adc3 As Word ' Dummy

-------------------
wenn du wirklich die 10 Bit Genauigkeit benötigst, solltest du auch das Datenblatt zu den Themen Stromversorgung / Referenzquelle beachten, wenn 8 Bit genügen, reicht natürlich jeweils ein Byte fürs Ergebnis und hier bietet sich natürlich die Verwendung eines Arrays an.

-----------------
const ch_max = 4 'Kanal 0 .. 3
dim ADC_value(ch_max) as Byte 'oder Word
dim x as byte 'Index für Array
dim Channel as Byte
dim Temp as Byte

'Bitte beachten die ADC-Kanäle zählen ab 0, Arrays ab 1


DDRC =&B00000000 'PC7...PC0=0: PortC-Pins auf Eingang
ADMUX=&B00100000 'Bits7+6=00: Externe Referenzspannung
'Bit5=1: LeftAdjust, nur 8 Bit in ADCH
'Bits3...0=0000: Initial Pin ADC0 messen
ADCSRA=&B11001111 'Bit7=1:AdcAn,Bit6=1:Start
'Bit5=0:Nicht freilaufend,Bit3=1:IntrAn
'Bits2+1+0=111: AdcClock=AvrClock/128
SREG.7=1 'Globale Interrupt-Freigabe
'----------------------------------------------------------
x = 1 'Initialwert
Do 'Hauptschleife
' mache irgendwas mit den Werten oder wozu du sonst Lust hast ...
Loop
'----------------------------------------------------------
OnAdc: 'ADC-Interrupt-Routine
adc_value(x)=ADCH 'Meßwert speichern
Incr x 'Index weiterstellen
If x > ch_max then x=1
Channel = x - 1 'Bitte beachten die ADC-Kanäle zählen ab 0, Arrays ab 1
Temp=ADMUX And &B11110000 'Oberste 4 Bits merken
ADMUX=Temp Or Cannel 'Neuer Kanal + gemerkte Bits
ADCSRA.6=1 'Nächste Messung starten
Return
-----------------------------------------------------------

So etwa sollte es funktionieren, kann ich jetzt gerade nicht testen aber das sind Teile aus funktionierenden Programmen.
Diese Variante hat den Vorteil, dass du dich um die Abfrage der Analogeingänge im Hauptprogramm nicht mehr kümmern musst, der AD-Wandler und das Weiterschalten der Eingänge laufen im Hintergrund und du kannst im Hauptprogramm jederzeit auf die letzten Werte zugreifen (bitte die Variablen x, Temp und Channel im Hauptprogramm nicht verändern !).
 
Und bist du schon weiter gekommen, mit dem Projekt?

Wenn es wirklich ein Softwarefehler ist, solltest du es am besten auch deiner Quelle mitteilen...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)