Hallo,
Es geht um einen Attiny 13, welchen ich mittels Usbasp programmiere.
D.h. ich hab einen Programmiersockel und einen Sockel in der Schaltung,
also beides getrennt.
Ich steuere die helligkeit einer Glühlampe mit einer simpelsten Software
PWM. Das funktioniert auch so weit ganz gut, nur das die Werte am
Spannungsteiler nicht mit den ADC werten übereinstimmen.
0V ---- R1-22k----- ADC1 -------R2-22k-------- 5V
am ADC liegen messbar fast 0V. Wenn ich den µC jetzt aus dem
Sockel(von der Schaltung) nehme messe ich zwischen ADC1 und 0V bzw. VCC
22k. Also so stimmt alles.
Ich hab den Eindruck, das der ADC an sich einen sehr niedrigen
Widerstand nach Gnd hat.
Das ganze soll für ein lineares 10k Poti Sein. Hab es durch die
Widerstände ersetzt um ein 50%/50% verhältnis zu simulieren.
vt
Was ist mein Problem ?
mfG Rob
Also die Zeichnung ist nur, falls jemand fragt, was neben dem
Spannungsteiler noch am µC hängt.
Am Pin 7 (ADC1 hängt der Spannungsteiler). Und ab einem gewissen
Widerstandsverhältnis, also kurz vorm Ende des POTI-Stellbereichs kann
ich dann die Spannug, am ADC1 bis auf 5V hochstellen.
Das Poti ist Linear, hab es durchgemessen und auch schon ein anderes
probiert. Und um alles auszuschließen hab ich nun den 22k/22k
Spannungsteiler montiert.
Hier der vorläufige Code:
.include "tn13def.inc"
.org 0x000
rjmp START
.org TIM0_OVF0addr
rjmp TIMER1
START:
ldi r16, 0b10
out TCCR0A, r16
ldi r16, (1<<TOIE0)
out TIMSK0, r16
ldi r16, 0b01000001
out ADMUX, r16
ldi r16, 0b10000010
out ADCSRA, r16
ldi r16,0b11111011
out DDRB,r16
sei
ldi r22,0xff
LOOP:
OUT PORTB,r19
ldi r16,1
ldi r20,0
ldi r21,0
MITTEL:
sbi ADCSRA, ADSC
WAITADC:
sbic ADCSRA, ADSC
rjmp WAITADC
in r16,ADCL
in r17,ADCH
ror r16
ror r16
andi r16,0b00111111
rol r17
rol r17
rol r17
rol r17
rol r17
rol r17
andi r17,0b11000000
or r17,r16
ldi r19,0xFF
dec r23
cp r23,r17
brlo LOOP
ldi r19,0x00
rjmp LOOP
TIMER1:
reti
Ulrich F. schrieb:> Du kannst keine PWM mit einem ADC messen.>> Und ja, bei einem PWM Ausgang liegen immer nur 0V oder 5V an.> (falls dein µC mit 5V läuft)> Ohne Ausnahme!
Ich verstehe das so, dass über das Poti der Sollwert vorgegeben werden
soll.....
genau so meine ich das.
Ich habe ein Poti als Spannungsteiler an einem ADC und dieser macht mir
daraus ein PWM. Das ganze funktioniert bestens, nur das der
Einstellbereich des POTIS auf den erstenn 4% liegen. Nein es ist kein
logarithmisches Poti, deswegen habe ich einen 22k/22k Spannugsteiler
dazwischen gelötet.
Vielleicht hat der µC einen weg. Ich dachte ich hab was übersehen beim
Programmieren.
Rob O. schrieb:> in r16,ADCL> in r17,ADCH> ror r16> ror r16> andi r16,0b00111111> rol r17> rol r17> rol r17> rol r17> rol r17> rol r17> andi r17,0b11000000> or r17,r16
Das kannst du dir sparen, wenn du den ADC auf linksbündig setzt und dann
nur ADCH auswertest. Da kommt ohne weitere Rollerei ein 8-bit Wert raus.
Rob O. schrieb:> ldi r16, 0b01000001> out ADMUX, r16
Du bist sicher, das du die internen 1,1V als Referenz haben willst? Wenn
also am ADC1 1,1V oder mehr liegen, hängt der ADC immer auf 1023.
Rob O. schrieb:> ldi r16, 0b10> out TCCR0A, r16
Da fehlt was. 0b10 ist noch kein vollständiges Byte und kann zu lustigen
Sachen führen, die du aber nicht vorhattest.
Die Programmierleitungen haben Sie zur Messung abgezogen?
Also bei mir klappt es, wie gesagt, mit einem ATtiny85 (m.m.), an B4
hängt ein altes Zeigervoltmeter, und mit dem Potenziometer kann ich
schön den Zeiger wandern lassen.
Rob O. schrieb:> Doch nach Neucompilierung> und Programmierung des µC, bleibt das Problem bestehen.
Wundert mich nicht wirklich. Du setzt auch immer den ganzen Port,
während es viel einfacher geht. Also entweder mit
1
sbi PORTB,4 ; setzen von PB4
2
; und
3
cbi PORTB,4 ; löschen von PB4
; oder gleich die Hardware PWM des Tiny benutzen.
Den OVF Interrupt des Timers kannst du dann zum laden des OCR Registers
aus r17 benutzen.
Wenn ich die zeile: OUT PORTB,r19 weglasse messe auch 0v.
wenn ich OUT DDRB,0b11111011 weglasse, messe ich 2,5!!!! Volt
Ich habe auch das OUT DDRB,0b11111011 über die ADMUX und ADSCRA zugriffe
gesetzt. 0V
es müsste doch daran liegen
S. Landolt schrieb:>> Wundert mich nicht wirklich. Du setzt auch immer den ganzen Port> Deswegen spart er jetzt ja mit>> ldi r19,0b11111011> B2, also ADC1, aus.
Trotzdem ist das ja keine brauchbare Praxis. Wenn ich ein Pin setzen
will, schiesse ich doch nicht auf den ganzen Port :-P
Da steht auch noch eine Menge Müll im Programm. Wo wird dein SoftPWM
Zähler (r23) initialisiert? Was tun denn r20-r22?
Schmeiss den Kram erstmal raus und überdenke nochmal die Option mit der
Hardware PWM.
Alles vollkommen richtig, trotzdem sollte es in der jetzigen Form
laufen, da stimmt wohl noch etwas anderes nicht, und bevor man neue
Baustellen aufmacht...
Da ich aber nur den ATtiny85 zum Ausprobieren hier habe, verabschiede
ich mich an dieser Stelle.
Das Programm war ursprünglich größer und ich habe alles Wegkastriert,
bis zum Kernproblem:
ldi r16,0b00010000
out DDRB,r16
ist die Lösung.
1000Dank
obwohl ich den Hintergrund nicht verstehe.
Da der ganze PWM Kram eigendlich mal für einen Wischermotor gedacht ist
gibt es jetzt neue Probleme.
Ich habe eine Schottkydiode als Freilaufdiode antiparallel gelötet. Bei
der Glühlampe alles allright nur wenn ich dem Motor zuschalte, dann geht
die PWM auf 100%. Wenn ich nun am PIN-out des Tiny13 messe, messe ich
immer Lowlevel. Ich denke der µC Resetet sich ständig und der Mosfet
bleibt im Dauerleitzustand. Wie kann ich der Annahme nachgehen oder den
µC vom Resetten hindern ?
Rob O. schrieb:> Ich habe eine Schottkydiode als Freilaufdiode antiparallel gelötet.
Welche? Und wieviel Strom fließt durch deinen Scheibenwischermotor, wenn
er läuft?
> Wie kann ich der Annahme nachgehen ...
Du kannst den µC in der Initialisierungsphase, die in der Hauptschleife
nicht durchlaufen wird, irgendeine Kennung (Pin-Wackeln, serielle
Ausgabe) von sich geben lassen und dir angucken, ob diese Kennung auch
während des Betriebs auftaucht.
Ich vermute ein anderes Problem!
Wenn er das Poti mit dem ADC einliest bekommt er 10 Bit also 1024 Werte.
Macht er mit 8Bit weiter, bekommt er beim Drehen von 0 bis max 4x 0-max
am PWM-Ausgang!
Prüf mal das nach!
Also erstmal. PWM funktioniert mit einer Sofitte von 0 auf 100 %
Problemlos.
Vor meiner LOOP-Routine habe ich ein paar langsame Impulse eingesetzt.
So sehe ich immer wenn der µC resettet.
Wenn ich nun den Scheibenwischermotor, parallel zur Sofitte lege. Brennt
sie 100% hell. Nun habe ich das OSZI zwischen Gnd und µC-Ausgangspin
geklemmt. Es ist kein PWM-Signal oder Startimpulse wahrzunehmen. Für
mich heißt das, dass er ultraschnell resettet.
-Scheibenwischermotor ist der typische 80er,90er Jahre-VW-Typ.
Billigmultimeter zeigt 9.8A unter Last !
-Stromversorgung PC-Netzteil: Ich hab den Resetpin (PIN1) auf VCC
gelegt. Schutzbeschaltung muss ich erledigen.
Nachtrag:
Die SChottky Diode habe ich mal als Freilaufdiode gekauft und habe
leider deren Daten nicht parat. Sie ist so grau und kugeligund hat auf
jedenfall "Dicke beine" ich denke min 1A. Zusätzlich habe ich noch eine
BY214-400 zwischen die Anschlussdrähte am Motor gelötet.
Soll ein simpler Vorschubantrieb werdnen. Die Spindel war ein wenig
verklemmt, so das die Last deutlich zu hoch war. Somit sinken die
Amperewerte noch mal ein bisschen.
Wenn ich die PWM müt Glühlampe betreibe (wo sie ja anstandslos
funktioniert) und den Motor parallel zur Versorgungsspannug 12V (also
nicht zur Glühlampe) hänge. Läuft er ohne das der µC resettet. Genau das
passiert auch wenn ich ihn an die 5V VCC Leitung der Versorgungsspannung
hänge. An selbiger hängt auch der µC-PIN8 (VCC).
Mit einem kleinerem Getriebemotor funktioniert das alles gut. Doch
diesen hatte ich vorher drin und ihn mittels Drahtpoti gesteuert. Viel
zu langsam und zu schwach, deshalb jetzt der Umbau auf Wischermotor.
Ich danke euch schon mal für eure Hilfe. Man lernt sehr viel dazu.
Da sind noch grobe Fehler:
- Basiswiderstand am BC338 fehlt
- Widerstand zwischen Emitter des TIP120 und GND fehlt
- Diode parallel zum FET ist falsch gepolt und unnötig
- wenn X ein Motor ist, fehlt die Freilaufdiode parallel zu X
- GND am ATtiny ist wohl nur vergessen...
Gruß Dietrich
Tschuldigung die Schaltung oben ist totaler mist. Unten sollte die
Richtige sein. Motor und Lampe sind parallel geschaltet. Wenn ich PB4
abklemme, Läuft der Motor auf 100%. Und ich kann mit dem Oszi das
PWM-Signal (PB4 am µC) wunderbar erkennen. Kaum verbinde ich PB4 mit dem
2,7kOhm Widerstand, resettet der µC sofort.
Als ich zum Motor seriell einen Hochlastwiderstand (Kochsalzlösung)
geklemmt habe funktionierte die PWM. Jetzt bleibt der Versuch mit dem
Optokoppler.
Hast du sie nur nicht eingezeichnet oder gibt es tatsächlich keine
Abblockkondensatoren am Tiny? Dann wird es Zeit, zwischen Vcc und GND
direkt am MC z.B. mal 100nF einzubauen. Am ADC1 Eingang kann ein 10nF
gegen Masse auch nicht schaden.
Der wichtige Schaltungsteil, aus dem die 12V und die 5V kommen, fehlt
leider auch. So ein Motor hat nämlich einen hohen Einschaltstrom und
lässt dadurch die Belastung der 12V hochschnellen. Wenn dabei die 5V auf
z.B. 2V zusammenbrechen, resettet der Tiny, auch wenns ein 13A ist.
Die Wahl der PWM Frequenz ist dabei auch wichtig. Wenn sie zu hoch ist,
kommt die Endstufe nicht hinterher, und wenn sie zu niedrig ist, knurrt
oder piepst der Motor.
die 12V bzw 5V kommen aus einem PC-Netzteil. Da ich keine Kondensatoren
da habe. Habe ich den µC an ein anderes Netzteil geklemmt und ihn
mittels 4n35 an den "Treiber" gekoppelt. Das ganze funktioniert nur muss
ich jetzt die PWM geräuschloser machen, obwohl der Motor gummigelagert
ist, Vibriert der ganze Tisch. SChätze so 60Hz bis 100Hz. Ich probier
weiter.