Forum: Mikrocontroller und Digitale Elektronik Spannungsteiler am ADC spielt verrückt


von Robert V. (malso)


Angehängte Dateien:

Lesenswert?

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

von otto (Gast)


Lesenswert?

Hallo, deine Zeichnung hat aber nichts mit dem geschildertem Problem zu 
tun - oder?
Gruß otto

von Luca E. (derlucae98)


Lesenswert?

Rob O. schrieb:
> Was ist mein Problem ?

Den Pin als Output definiert?

von Robert V. (malso)


Lesenswert?

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

von Ulrich F. (Gast)


Lesenswert?

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!

von otto (Gast)


Lesenswert?

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.....

von Robert V. (malso)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Was passiert, wenn Sie
> ldi r19,0xFF
durch
  ldi r19,0b11111011
ersetzen?

von S. Landolt (Gast)


Lesenswert?

Also, von Matthias Sch. das
1
 ldi r16, 1
2
 out ADMUX, r16
zusammen mit dem
1
 ldi r19,0b11111011
funktioniert hier auf einem ATtiny85.

von Robert V. (malso)


Lesenswert?

Messung zwischen 0V-Gnd und dem Mittelpunkt des Spannungsteilers bei 
folgendem, und nach euren Vorschlägen, abgeänderten codes:

Messung: ca. 0.1V
1
.include "tn13def.inc"
2
.org 0x000
3
rjmp START
4
.org TIM0_OVF0addr
5
rjmp TIMER1
6
7
8
START:
9
10
 ;     ldi     r16, 0b10 
11
  ;    out     TCCR0A, r16
12
 ;
13
;      ldi     r16, (1<<TOIE0)  
14
  ;    out     TIMSK0, r16
15
 
16
17
 ldi r16, 0b00100001
18
 out ADMUX, r16
19
 ldi r16, 0b10000010
20
 out ADCSRA, r16
21
22
ldi r16,0b11111011
23
out DDRB,r16
24
sei
25
ldi r22,0xff
26
27
LOOP:
28
  OUT PORTB,r19  
29
30
31
32
  ldi r16,1
33
  ldi r20,0 
34
  ldi r21,0
35
 MITTEL:
36
  sbi     ADCSRA, ADSC   
37
 WAITADC:
38
  sbic     ADCSRA, ADSC 
39
  rjmp WAITADC
40
  in r16,ADCL
41
  in r17,ADCH
42
43
44
  ldi r19,0x0b11111011
45
  dec r23  
46
  cp r23,r17
47
48
  brlo LOOP
49
    
50
 ldi r19,0x00
51
rjmp LOOP;
52
53
54
TIMER1:
55
56
reti


*********************************************************************
Messung bei folgendem Code:

Messung 2,49V !!!

1
.include "tn13def.inc"
2
LOOP:
3
rjmp LOOP

ich krieg noch ne Kriese

Wegen dem Problem habe ich heute nix geschafft.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Welchen Assembler benutzen Sie, mein avrasm2 nimmt das nicht:
>   ldi r19,0x0b11111011

von S. Landolt (Gast)


Lesenswert?

Funktioniert doch wunderbar, es liegt nur an dieser dussligen Zeile.

von Robert V. (malso)


Lesenswert?

Oh, das habe ich übersehen. Ich nutze WAVRAMS. Doch nach Neucompilierung 
und Programmierung des µC, bleibt das Problem bestehen.

von S. Landolt (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Wundert mich nicht wirklich. Du setzt auch immer den ganzen Port
Deswegen spart er jetzt ja mit
> ldi r19,0b11111011
B2, also ADC1, aus.

von Robert V. (malso)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Robert V. (malso)


Lesenswert?

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.

von Robert V. (malso)


Lesenswert?

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 ?

von Hubert G. (hubertg)


Lesenswert?

Wie sieht die Schutzbeschaltung der Stromversorgung und des Tiny aus?

von Tom Thomsen (Gast)


Lesenswert?

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.

von Marc H. (marchorby)


Lesenswert?

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!

von Robert V. (malso)


Lesenswert?

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.

von Robert V. (malso)


Lesenswert?

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.




1
   12v
2
   ----------------------------------o--------o----------.
3
                                     |        |          |
4
   o---.                             |        |          |
5
       | 5v                          |        |         .-.
6
   o   |                             |        |        ( X )
7
   |0v |                            .-.       |         '-'
8
   |   |                       4.7k | |       |          |
9
   |   |                            | |       |          |
10
   |   |                            '-'       |          |
11
   |   |                             |      |/           |
12
   |   |                             o------| tip120     o---'
13
   |   |                             |      |>           |   |
14
   |   | .--------.                  |        |       ||-+   V
15
   |   | |        |                  |        |  ___  ||<-   -
16
   |   '-o        |                |/         '-|___|-||-+   |
17
   |     |        o----------------|  bc338       10     |   |
18
   |     |        |                |>                    |   |
19
   |     |AtTiny13|                  |-------------------o---'
20
   |     |        |                  |
21
   |     |        |                  |
22
   |     |        |                  |
23
   |     '--------'                  |
24
   |                                 |
25
   |                                ----
26
 ----
27
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

Rob O. schrieb:
1
> 12v
2
>    ----------------------------------o--------o----------.
3
>                                      |        |          |
4
>    o---.                             |        |          |
5
>        | 5v                          |        |         .-.
6
>    o   |                             |        |        ( X )
7
>    |0v |                            .-.       |         '-'
8
>    |   |                       4.7k | |       |          |
9
>    |   |                            | |       |          |
10
>    |   |                            '-'       |          |
11
>    |   |                             |      |/           |
12
>    |   |                             o------| tip120     o---'
13
>    |   |                             |      |>           |   |
14
>    |   | .--------.                  |        |       ||-+   V
15
>    |   | |        |                  |        |  ___  ||<-   -
16
>    |   '-o        |                |/         '-|___|-||-+   |
17
>    |     |        o----------------|  bc338       10     |   |
18
>    |     |        |                |>                    |   |
19
>    |     |AtTiny13|                  |-------------------o---'
20
>    |     |        |                  |
21
>    |     |        |                  |
22
>    |     |        |                  |
23
>    |     '--------'                  |
24
>    |                                 |
25
>    |                                ----
26
>  ----
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

von Hubert G. (hubertg)


Lesenswert?

Hier siehst du wie ein FET-Treiber aufgebaut sein soll.
https://www.mikrocontroller.net/articles/Treiber

von Robert V. (malso)


Lesenswert?

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.





1
 12v                                                         
2
 o-----------------------------------o--------o----------o----.
3
                                     |        |          |    |
4
 o-----.                             |        |Motor+Lamp|    |
5
       | 5v                          |        |         .-.   |
6
 o     |                             |        |        ( X )  -
7
 |0v   |                            .-.       |         '-'   ^   BY214-400
8
 |     |                       4.7k | |       |          |    |
9
 |     |                            | |       |          |    |
10
 |     |         AtTiny13           '-'       |          |    |
11
 |     |       .---------.           |      |/           o----'
12
 |     |       |         |           o------| tip120     |
13
 |     o---o---oVCC      |    2,7k   |      |>           |
14
 |     |   '---oReset    |    ___  |/         |       ||-+
15
 |    .-.      |      PB4o---|___|-|          |  ___  ||<-   IRF2807
16
 |    | |<-----oADC1     |         |>         o-|___|-||-+
17
 |    | |      |         |     bc337 |        |   10     .
18
 |    '-'      |         |           |        |          |
19
 |     |       |      GNDo-.         |        |          |
20
 |     |       '---------' |         |       .-. 4.7k    |
21
 |     |                   |         |       | |         |
22
 |     |                   |         |       | |         |
23
 |     |                   |         |       '-'         |
24
 |     |                   |         |        |          |
25
 |     |                   |         |        |          |
26
 |     |                   |         |        |          |
27
 |     |                   |         |        |          |
28
 |     |                   |         |        |          |
29
 '-----o-------------------o-------- o--------o----------'
30
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Robert V. (malso)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.