Ich denke schon und hoffe, dass wir inka nun nicht zu sehr verwirrt haben.
dich meinte ich doch nicht =) ich bezog mich auf inkas frage weiter oben.
aber eben das habe ich ja auch oben drüber gesagt, wird der pullup zugeschaltet ist die spannung am pin höher, und es wir schwerer den low pegel zu erreichen, und nicht wie du gesagt hast, der high pegel würde nicht mehr erreicht. und wie ich auch gesagt habe, müsste der transistor dann stärker durchschalten, also einen geringeren widerstandswert haben... ich denke wir meinen das gleiche, oder?
Ich denke schon und hoffe, dass wir inka nun nicht zu sehr verwirrt haben.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ein Bild mal dazu. (Ach du meine Güte, hätte ich das mal mit dem Bleistiftt gemalt, 1/4 der Zeit hätte es wohl nur benötigt.)
Ansatz sind die Messdaten von inka.
1) Der kleinste Wert ist 18
2) Der größte Wert ist 696
Umrechnen in die Spannung am Prozessor-Pin:
5 Volt / 1023 * ADC-Wert
1) 5 Volt / 1023 * 18 = 0,088 Volt
2) 5 Volt / 1023 * 696 = 3,41 Volt
Die Spannung am Prozessor-Pin entspricht der Spannung über dem Foto-Transistor. Somit muss die restliche Spannung von den 5 Volt Versorgung am Widerstand R18 abfallen.
1) 5 Volt - 0,088 Volt = 4,912 Volt
2) 5 Volt - 3,41 Volt = 1,59 Volt
Entsprechend fließt dann folgender Strom durch diesen Widerstand R18
1) 4,912 Volt / 4,7 kOhm = 1,045 mA
2) 1,59 Volt / 4,7 kOhm = 0,338 mA
Da der Strom dann ja auch durch T11 muss, kann der Widerstand vom Transistor nun endlich berechnet werden. (U [Transistor=U-Pin] / I [R18])
1) 0,088 Volt / 1,045 mA = 84 Ohm
2) 3,41 Volt / 0,338 mA = 10088 Ohm
Und nun den Pull-Up-Widerstand parallel zum 4,7 kOhm.
Leider 2 Möglichkeiten, da die Angabe in der ATmega8-Doku (Seite 237 I/O-Pin Pull-up Resistor) von 20 bis 50 kOhm schreibt.
Nun die Spannung am AD-Eingang, wenn wir die beiden oben berechneten Widerstände vom T11 nutzen:
FALL 1 : 20 kOhm parallel zu 4,7kOhm = 3805 Ohm
1) 5 Volt / (3805 Ohm + 84 Ohm) * 84 Ohm = 0,108 Volt
2) 5 Volt / (3805 Ohm + 10088 Ohm) * 10088 Ohm = 3,63 Volt
FALL 2 : 50 kOhm parallel zu 4,7kOhm = 4296 Ohm
1) 5 Volt / (4296 Ohm + 84 Ohm) * 84 Ohm = 0,096 Volt
2) 5 Volt / (4296 Ohm + 10088 Ohm) * 10088 Ohm = 3,51 Volt
Und wie man nun sehen kann, habe ich mich mit den Pull-Up's vertan.
Die Spannung wird höher, je niedrieger der Pull-Up-Widerstand ist. Somit wird der minimale Erkennungs-Pegel von 3 Volt noch weiter überschritten, und es ist doch sinnvoll die Pull-Up's einzuschalten.
Es lohnt sich immer seinen eigen Quatsch mal nachzurechen.
Gruß Sternthaler
@damaltor
Ich kann keinen Upload mehr machen, da meine 3 MB voll sein sollen. Kannst du da was machen?
Aus diesem Grund doch kein Bild von mir. Und das obwohl ich das so toll gemalt habe
[EDIT] Ach du meine Güte, seit ihr schnell mit dem Schreiben und Erklären. Mittlerweile habt ihr schon 5 Posts eingetragen und ich sitze hier und versuche Bildchen zu malen![]()
Lieber Asuro programieren als arbeiten gehen.
klar, schicks per email, ich hängs dann an... muss mal sehen ob ich deinen counter irgendwie resetten kann.
Danke damaltor, die Mail ist unterwegs.
Und nun noch eine Frage an radbruch:
(Alle anderen schauen jetzt bitte mal weg)Zitat von radbruch
Bevor ich hier nun auch daneben liege. Sollte es nicht genau andersrum sein?
Dunkel = Kein Loch = Hohe Spannung => HIGH-Pegel
Hell = Loch = Niedrige Spannung => LOW-Pegel
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
Ihr könnt gerne alle zuschauen. Ich bin doch nicht unfehlbar. Im Datenblatt des Transistors (LPT 80 A, NPN-Silizium-Fototransistor, z.b.: C) steht was von "Dunkelstrom" im nA-Bereich. Das ist dann wohl "Hochohmig" und bedeutet: die Spannung am Pin ist im Dunkeln am höchsten. Auch ich kann mich mal irren. *lol*
Erklärungsversuch2 für die Spitzen:
Weil die erreichten 3,6V näher am high-Pegel liegen als die ebenfalls erreichten 0,09V am low ergibt sich eine Häufung bei low? Mich würden mal die abgedeckt/freieSicht-Werte interessieren. Schöne Restnacht noch ...
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
naja, ich versuche mich mal durchzubeissen. Was ich noch nicht verstehe ist das mit dem (im prozessor?) eingebauten pull-up. Ich denke ob der nun benutzt wird oder nicht, darauf habe ich doch gar keinen einfluss, oder?Zitat von radbruch
gruß inka
meinst du die werte, die ich bei 22 löchern messen würde mit der von dir vorgeschlagenen blende an der (sende)diode?Zitat von radbruch
gruß inka
auf die pullups hast du natürlich einfluss. mit den datenregistern kannst du ja schon umgehen =)
wenn ein pin aus EINGANG gestellt ist, also das entsprechende bit im DDRx register 0 ist, kannst du mithilfe des PINx registers den wert einlesen. soweit klar. das register PORTx, welches ja eigentlich dazu da ist, um daten auf den ausgang (!) zu schreiben, wird jetzt zweckentfremdet: hat das register PORTx bei einstellung auf eingang eine gesetzte 1, so ist dieser pin über einen hochohmingen widerstand mit VCC verbunden.
hier im anhang noch sternthalers bild:
ok, heist also die pull-ups sind standarmässig abgeschaltet. Ich müsste also zusätzlich, VOR der verwendung der OdometrieData() funktion (der code stammt aus der adc.c)irgendwo eine anweisung unterbringen die in das Register PORT 0 bzw. PORT 1 eine 1 reinschreibt und damit den eingang PC0 bzw PC1 hochohmig macht? Passiert aber nicht so etwas schon in der codezeile 233?Code:00221 void OdometryData ( 00222 unsigned int *data) 00223 { 00224 int ec_bak = autoencode; // Sichert aktuellen Zustand 00225 00226 /* 00227 Autoencode-Betrieb vom ADC-Wandler unterbinden. 00228 */ 00229 autoencode = FALSE; 00230 /* 00231 Vorbereitung zum lesen der Odometrie-Sensoren. 00232 */ 00233 DDRC &= ~((1 << PC0) | (1 << PC1)); // Port auf Input=>Back-LEDs gehen aus 00234 ODOMETRIE_LED_ON; // Odometrie-LED's einschalten 00235 00236 /* 00237 Linken Odometrie-Sensor lesen 00238 */ 00239 ADMUX = (1 << REFS0) | WHEEL_LEFT; // Referenz mit externer Kapazitaet 00240 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00241 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00242 ; 00243 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00244 data [0] = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00245 00246 /* 00247 Rechten Odometrie-Sensor lesen 00248 */ 00249 ADMUX = (1 << REFS0) | WHEEL_RIGHT; // Referenz mit externer Kapazitaet 00250 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00251 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00252 ; 00253 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00254 data [1] = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00255 00256 /* 00257 Autoencode-Betrieb vom ADC-Wandler wiederherstellen. 00258 */ 00259 autoencode = ec_bak; 00260 }
ganz was anderes. Im code oben steht OdometryData, in diesem programm z.b. steht OdometrieData
wie passt das zusammen?Code://* -------- Programm zum Loggen der Odometriedaten ----*/ #include "asuro.h" #include "inka.h" #include <string.h> #include<stdio.h> int main(void) { unsigned int data[200][2]; char c[12]; int i; Init(); WaitforStart(); //motoren vorwärts MotorDir(FWD,FWD); MotorSpeed(160,160); //warten bis motoren drehzahl erreicht haben Msleep (1000); //odo-werte einlesen for (i=0; i<200;i++) { OdometrieData(data[i]); } //motoren stop MotorSpeed(0,0); //formatiert ausgabe odo-werte for (i=0;i<200;i++){ sprintf(c,"%4d\t%4d\n\r",data[i][0],data[i][1]); SerWrite(c,12); } while(1); return 0; }
gruß inka
Lesezeichen