Hallo zusammen,
ich bin mir sicher das das Problem vor dem Bildschirm liegt, aber ich
komme auch nach stundenlanger Recherche nicht darauf warum mein ADC0 am
ATMEGA32 nicht den vollen Spannungsbereich misst.
Ich baue derzeit eine Schaltung auf um den PH Wert zu bestimmen. Hier
habe ich mich gewundert warum ich über einen ADS1115 eine Spannung on 1V
messen kann, jedoch sobald ich den ADC des uC nutzen ich plötzlich
sowohl bei diesem als auch beim ADS ~2,5V messe.
Wenn ich nun einen simplen Versuch mit einem Poti aufbaue und diesen
dann einmal von links nach rechts drehe bekomme ich über den ADS1115
alle erwarteten Spannungswerte geliefert also von 0-5V.
Beim uC ADC jedoch bekomme ich nur Spannungen zwischen 5V und ~2,4 und
dann springt es auf 0V... mit viel Fingerspitzengefühl beim Poti kann
ich auch mal einen Wert zwischen 2,5 und 0 erwischen, das ist aber recht
schwierig.
Hat jemand eine Idee was ich falsch mache?
Achja, wenn ich den ADC Pin nicht anschließe, dann messe ich konstant 5V
(Port ist beim Startup als Output definiert und Pullup aktiv. Wenn ich
dies nicht tue, dann floatet der wert zw. 3-5V)
Danke für eure Hilfe!
Grup
Tobi
Den C-Code habe ich auf das Mindeste reduziert und sieht folgendermaßen
aus:
1
booleanadctest=true;
2
3
voidsetup()
4
{
5
unsignedchartemp;
6
7
charmy_string[10];
8
uint8_tstatus;
9
10
//bool connected = false;
11
12
//Init Ports
13
DDRA=0xFF;
14
PORTA=0xF0;//disabled pullup makes port floating after setting to input
15
16
//INIT ADC
17
DDRA&=~(0x03);/* Make first two ADC ports as input */
18
ADCSRA=0x87;/* Enable ADC, fr/128 */
19
ADMUX=0x40;/* Vref: Avcc, ADC channel: 0 */
20
21
22
USART_init();
23
USART_putstring("Mainprogramm\n\r");
24
25
if(adctest){
26
uint16_tadc_value=0;
27
charbuffer[5];
28
floatvoltage=0.0;
29
ADCSRA|=((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));// 16Mhz/128 = 125Khz the ADC reference clock
30
ADMUX|=(1<<REFS0);// Voltage reference from Avcc (5v)
31
ADCSRA|=(1<<ADEN);// Turn on ADC
32
ADCSRA|=(1<<ADSC);
33
34
while(1)//Our infinite loop
35
{
36
USART_putstring("Reading channel 0: ");
37
ADMUX&=0xF0;// Clear the older channel that was read
38
ADMUX|=0;// Defines the new ADC channel to be read
39
ADCSRA|=(1<<ADSC);// Starts a new conversion
40
while(ADCSRA&(1<<ADSC));// Wait until the conversion is done
41
adc_value=ADCW;
42
itoa(adc_value,buffer,10);
43
USART_putstring(buffer);
44
USART_putstring(" ");
45
voltage=(float)((adc_value*5.0)/1023);
46
ftoa(voltage,my_string,3);
47
USART_putstring(my_string);
48
_delay_ms(500);
49
USART_send('\r');
50
USART_send('\n');//This two lines are to tell to the terminal to change line
Input setze ich dann hier
DDRA &= ~(0x03)
Schaltung ist mit einem Poti an 5V und Masse. Auf einem steckbrett und
atmega ist auf einem development board. Steckbrett ist über development
board versorgt.
PC0 pin misst dann den mittelabgriff des Poti.
Tobias G. schrieb:> Hat jemand eine Idee was ich falsch mache?
Zu viel Text, zu wenig Schaltplan. Ich kann mir so keinen Reim auf
deinen Aufbau machen. Und zum raten ich keine Lust mehr, das endet hier
immer mit Streit, weil einige davon überzeugt sind, besser als andere zu
raten.
Oft sind auch Fotos hilfreich.
Vermutlich verwirren die vielen Kabel und drahtbrücken mehr als das sie
helfen, aber ich kann nachher mal versuchen ein Bild von dem relevanten
Teil zu machen.
Im Grunde ist es nur ein Atmega32 mit einem Poti an PA0. Als an der
selben Spannungsversorgung.
Hatte gehofft es gibt hierfür eine einfache generelle Erklärung wie das
sein kann mit dem Messbereich.
Komisch ist ja auch das der ADS, welcher über TWI verbunden ist, die
Spannungswerte annimmt wenn ich am gleich Poti mess. Sobald ich den PA0
wegnehmen zeigt der ADS wunderbar den erwarteten Wert an. Also irgendwie
wirkt es so als gebe ich auf den PA0 eine Mindestspannung von 2,5V
drauf. Sobald der Poti nahe Null ist, geht dann auch die Spannung von
2,5 auf um die Null.
Tobias G. schrieb:> Vermutlich verwirren die vielen Kabel und drahtbrücken mehr als das sie> helfen,
Wenn der Aufbau wirklich so primitiv wie dein Text ist, können das nicht
allzu viele Drähte sein. Abgesehen davon, zeichnet man genau aus diesem
Grund Schaltpläne bevor man Fragen zur Schaltung stellt.
> Hatte gehofft es gibt hierfür eine einfache generelle Erklärung...
Kann sein, aber ohne Geschrächsgrundlage lasse ich mich auf keine
Diskussion zur Schaltung ein. Die Menge Text die du dazu geschrieben
hast ist ohne den Plan bereits weit von "einfach" entfernt.
Das Ding ist dass das Poti z. B. von einigen anderen schaltungen umringt
ist, jedoch unabhängig sind. Aber ich verstehe dich Stefan. Hatte
gehofft hier gibt es eine easy Standard Lösung.
Poti ist 100k
Danke euch allen!
EAF schrieb:> Tobias G. schrieb:>> Poti ist 100k>> Das Datenblatt sagt: Maximale Impedanz 10k> Zumindest bei den anderen AVR.
Nunja, das DB sagt auch für den Mega32 was ähnliches. Aber dieser Wert
ist durchaus "interpretationswürdig". Insbesondere ist der (korrekt)
verwendete Begriff "Imdedanz" zu beachten.
Das ist was anderes als "Widerstand", auch wenn's dieselbe Einheit hat!
Sprich: für eine Quelle, die kontinuierlich liefert, aber nur
verhältnismäßig selten gelesen werden muss, kann man massiv tricksen.
Alles, was man dafür braucht, ist ein simpler Kondensator.
Ist denn AVCC überhaupt angeschlossen und auf Betriebsspannung?
Sonst passieren hier die lustigsten Dinge.
Und wenn man VCC mit AREF wählt, kann man auch einen 0,1µF an AREF
hängen.
Es sollte hier keine Rolle spielen, aber beim ATMega32 können 99% aller
User auch JTAG abschalten, falls man mal Port C benutzen wollte.
Tobias G. schrieb:> (Port ist beim Startup als Output definiert und Pullup aktiv. Wenn ich> dies nicht tue, dann floatet der wert zw. 3-5V)
Ja, genau das muss ein offener CMOS Eingang auch tun. Also schließ an
diesen floatenden Eingang deinen Potischleifer an und probiers nochmal.
Tobias G. schrieb:> Beim uC ADC jedoch bekomme ich nur Spannungen zwischen 5V und ~2,4 und> dann springt es auf 0V...
Und was misst du im jeweiligen Fall am uC Pin?
EAF schrieb:> Das Datenblatt sagt: Maximale Impedanz 10k> Zumindest bei den anderen AVR.
Halb so wild, das gilt nur, wenn man eine schnell wechselnde Spannung im
Wechsel mit anderen Kanälen hinreichend genau abtasten will.
Bei einem quasistatischen Signal ohne Kanalwechsel sind lediglich durch
die Leckströme interessant. Und die sind hier hinreichend niedrig.
Zudem hat ein 100k Poti in der Mittelstellung eine Impedanz von 25 kOhm.
Und abseits der Mittelstellung ist die Impedanz (egal ob nach unten oder
nach oben) immer geringer als 25 kOhm.
Tobias G. schrieb:> Vermutlich verwirren die vielen Kabel und drahtbrücken mehr als das sie> helfen, aber ich kann nachher mal versuchen ein Bild von dem relevanten> Teil zu machen.
Zeige einen vernünftigen Schaltplan und stelle selber sicher, dass der
deinem Aufbau entspricht.
AVCC ist angeschlossen an 5V.
Habe dieses Board. Da ist der schaltplan auf Bild 11
https://www.ebay.com/itm/224197466107
An PA0 ist der Poti Schleifer.
Auf dem Board sind 4 VCC und 4GND pins.. Daran ist der Poti versorgt.
Das wars schon.
Lothar, meinst du was ich mit dem Programm Messe oder mit dem
Multimeter?
Beides mal die genannte Spannung. Wenn ich den Poti von 0ohm hochdrehe
habe ich bei gefühlt 5% direkt ca 2,4 Volt. Und geht dann einigermaßen
linear bis 5V
Wenn ich die schaltung umbaue und über den ADS1115 (TWI über den selben
uC) den Poti schleifer messe, dann geht es darüber von 0V bis 5V linear
hoch.
Danke für die vielen Antworten
Tobias G. schrieb:> Beides mal die genannte Spannung.
Das ist schonmal gut, wenn das Messgerät und der ADC das selbe Resultat
haben.
Ist das Poti kaputt? Was passiert, wenn du den Schleifer gar nicht
anschließt?
Was passiert, wenn du die beiden "Potianfänge" tauschst?
Tobias G. schrieb:> AVCC ist angeschlossen an 5V.> Habe dieses Board. Da ist der schaltplan auf Bild 11> https://www.ebay.com/itm/224197466107
Dein Bastelzeugs mit dem Poti ist auf dem Schaltplan nicht zu sehen.
Deine Unstetigkeit beim Drehen des Potis muss einen Grund haben.
Zeige auch gleich den Schaltplan von deinem Aufbau mit dem ADS1115.
Wenn ich den schleifer nicht anschließe floated der adc Wert im Programm
zw 3 und 5V ca.. Aber das ist ja eh undefiniert.
Was das Messgerät am adc pin anzeigt muss ich nachher mal testen.
Poti Anfänge tausche ich nachher auch mal gerne.
Vermute der Poti funktioniert da der ads1115 ja saubere Werte liefert
und Stichproben mit dem Multimeter (ohmmeter) auch plausible Werte
ergab.
also scheinbar ist das Problem ein individuelles von ADC0. Wenn ich
alles lasse wie es ist und nur ADMUX |= 0; in ADMUX |= 1; ändere in der
while Schleife und den Poti Schleifer auf PA1 setze, dann funktioniert
alles wie es soll.
Ich bin noch nicht dahinter gekommen wieso, aber zumindest etwas Licht
im Dunkel. Das Problem scheint also eher in der SW zu liegen.
DDRA = 0xFF;
ist kein guter Stil: wenn der Eingang mit dem Poti auf 0V gestellt,
entsteht ein Kurzschluss, wenn auch für kurze Zeit, bis später auf
Eingang umgeschaltet wird. Evtl. ist PA0 oder das Poti vorgeschädigt
durch solche Aktionen oder durch ESD (electrostatic discharge).
Hast Du einen Ersatzprozessor?
Messe doch mit dem Multimeter den Strom, der in PA0 bei den
verschiedenen Potistellungen (speziell 0V) fließt und poste den Wert
hier.
Dann stellt sich heraus, ob z.B. Pullup doch noch eingeschaltet ist.
Evtl. ist ein Schluss auf der Platine?
Theoretisch wäre es ja auch denkbar, dass der I/O Pin kaputt gegangen
ist. Allerdings gebe ich dabei zu bedenken, dass die AVR relativ robust
sind, so dass das nur selten passiert.
Wenn man sich beim AVR einen Pin zerschießt, ist das aber normalerweise
auch von außen messbar. Also es trifft entweder die Ausgangsstufe oder
die Schutzdioden, die Logik und die Eingangsstufe bleiben so gut wie
immer intakt. Sprich man hat dann einen Pin, der dauerhaft high oder low
ist, wenn man Pech hat (beide FETs der Ausgangsstufe hin oder eine Diode
und gegenseitiger FET) fließt unkontrollierbar Strom, was zu merklicher
Erwärmung des IC führt. Sowas wie 5V messbar am Pin, aber nur 2,5V am
ADC (vorausgesetzt das Programm arbeitet korrekt) ist untypisch.
Ich habe sowas vor einiger Zeit mal mit einem ATMega644 (oder 1284?)
geschafft. Weiß nicht mehr genau wodurch, aber der Pin war dauerhaft
high und der AVR hatte eine tolle zuschaltbare Heizung bekommen, wenn
man diesen Pin low haben wollte. Die 40mA pro Pin bzw. 100mA pro Port
oder was man da immer sagt, werden dabei locker gerissen. Aber solange
man diesen Pin in friedlichem Zustand lässt, funktioniert der Rest des
AVR problemlos.
Ben B. schrieb:> Weiß nicht mehr genau wodurch, aber der Pin war dauerhaft> high und der AVR hatte eine tolle zuschaltbare Heizung bekommen, wenn> man diesen Pin low haben wollte.
Den Effekt kenne ich auch!
Habe bisher 2 ATMega328P getötet.
Einen auf deine Art. Aber auch keinen Nachweis wie.
Da vermute ich eine Kombination aus Steckbrett, 12V und Irrtum/Dummheit.
Und bei einem war das EEPROM kaputt.
Vermutlich (recht sicher) ein Fehler im Programm.
Stefan ⛄ F. schrieb:> Theoretisch wäre es ja auch denkbar, dass der I/O Pin kaputt> gegangen> ist. Allerdings gebe ich dabei zu bedenken, dass die AVR relativ robust> sind, so dass das nur selten passiert.
Ich habe einen Mega32 im Keller, bei dem nach einem unbeabsichtigten
Zusammenschalten von interner und externer Referenz der ADC auch nur
noch ein/aus kennt. Der PIN als digitaler I/O-Pin funktioniert aber nach
wie vor.
Oliver
also ich habe nun mal den Strom gemessen und stelle fest dass ich am PA0
einen 2mA Strom habe wenn ich direkt das Multimeter gegen Masse
anschließe. Zusätzlich leuchtet eine grüne LED auf dem Board. Hier
scheint wohl noch mehr an dem PA0 zu hängen als erwartet. Leider sieht
man diese LEDs nicht auf dem verlinkten Schaltplan oben zu dem ATMEGA32
Development Board.
Ich suche gerade einen besseren Schaltplan zu dem YL-34 Board nur
irgendwie findet man dazu nichts mehr... ich suche weiter.
Danke euch soweit
endlich habe ich den Schaltplan gefunden..
http://myosuploads3.banggood.com/products/20190318/20190318012611mega16.pdf
ist zwar für ein YL-11 Board, jedoch vermute ich das es bei meinem
genauso aufgebaut ist. An PA0 ist über ein 1k Widerstand eine Diode an
VCC was mir dann einen ungewollten Spannungsteiler mit einbaut und wohl
zu dem beschriebenen Effekt führt!?!
Tobias G. schrieb:> An PA0 ist über ein 1k Widerstand eine Diode an VCC was mir dann einen> ungewollten Spannungsteiler mit einbaut und wohl zu dem beschriebenen> Effekt führt!?!
Ja, so ist es. Zeichne einfach mal dein Poti dazu und stelle mental und
rechnerisch ein paar unterschiedliche Werte ein. Bedenke dabei, dass die
LED unter ca. 2,5V nicht leitet (also hochohmig ist) und die
Vorwärtsspannung über ihr nicht wesentlich höher als 2,5V wird.
Björn W. schrieb:> für diesen "Schaltplan"
Ja, Obfuscation schlechthin. Arg viel verwirrender kann man einen
Schaltplan mit grade mal 15 Bauteilen nicht zeichnen. Und dass der C6
ein "zehn mikrofemto" ist, die C1 und C3 aber lapidare "104"er
Kondensatoren sind, das macht die Sache nicht besser.
Zusammenfassend zur ursprünglichen Frage, wo
Tobias G. schrieb:> Hat jemand eine Idee was ich falsch mache?
Du hast die zum Fehler gehörige Schaltung nicht gepostet. Wenn du das
getan hättest, dann wäre die Fehlerursache nach 5 Minuten lokalisiert
gewesen...
Lothar M. schrieb:>> Hat jemand eine Idee was ich falsch mache?> Du hast die zum Fehler gehörige Schaltung nicht gepostet.
Oder: Er hat ein Board mit unbekannter Schaltung verwendet.
Ich hatte die schaltung nicht mehr da ich das Board schon länger habe.
Wie ihr im Verlauf sehen könnt habe ich ihn erst wieder auftreiben
müssen.
Hatte nicht erwartet das an dem pin noch was dran ist.
Mir war wichtig das hier noch aufzulösen falls jemand mal ein ähnliches
Problem hat. Nichts ist ärgerlicher als ein Beitrag bei dem man sein
Problem wieder findet, sich endlos durchliest und dann keine Lösung
gepostet wurde...
Also in dem Fall... Schaltplan anschauen auch wenn man das erstmal nicht
als das wahrscheinlichste Problem sieht
Danke für eure Hilfe und Sorry an diejenigen die ihre Zeit verschwendet
gesehen haben. Der Hinweis mit dem Multimeter den Strom zu messen hat
mich zumindest auf den richtigen Weg gebracht.. Sonst würde ich heute
noch im Code suchen.
Vielen Dank
Tobi
Tobias G. schrieb:> Mir war wichtig das hier noch aufzulösen falls jemand mal ein ähnliches> Problem hat. Nichts ist ärgerlicher als ein Beitrag bei dem man sein> Problem wieder findet, sich endlos durchliest und dann keine Lösung> gepostet wurde...
Dummes Geschwafel. Hilfreich wäre einizig, diesen Thread komplett zu
löschen: Von Anfang an keine vernünftigen Beschreibungen und keine
sinnvollen Reaktionen auf Rückfragen.
Mal abgesehen davon, dass man das per Multimeter und Nachdenken hätte
selbst lösen können! Aber es ist ja so bequem, gleich mal das Internet
vollzumüllen anstatt selbst zu denken versuchen.
Genau, einfach alles löschen, wer braucht schon dieses Forum ...
Ich bin mir sicher, Manfred ist ein Heiliger und hat in seinem Leben
noch niemals etwas dummes getan, hat noch nicht einen einzigen
Transistor gemeuchelt weil irgendwas nicht so funktioniert hat wie
gedacht...
Ben B. schrieb:> Manfred ist ein Heiliger und hat in seinem Leben
... schon deutlich mehr als ein Bauteil in den Halbleiterhimmel
befördert oder es vom magischen Rauch befreit. Manfred hat auch schon
stundenlang triviale Fehler gesucht, weil er sie einfach nicht gesehen
hat!
Lese den gesamten Thread noch einmal nach. Es wurde mehrfach nach
einer konkreten Schaltung und Bildern gefragt und es kamen nur Antworten
wie "habe ich nicht", "muß ich suchen", "Bilder verwirren nur wegen der
vielen Kabel"...
So geht das nicht, wenn man wirklich Hilfe haben will, der Thread ist
für die Mülltonne.
> wer braucht schon dieses Forum ...
Manfred hat es schon einige Male erfolgreich bemüht, aber sein Problem
ganz sicher detaillierter dargestellt. Das Problem war natürlich, wie
immer, zwischen diversem Dummlall die zielführenden Hinweise zu
erkennen.
Manfred schrieb:> So geht das nicht
Ich finde, dass der Threads prima verdeutlicht, warum unsere ständig
wiederholten Fragen nach dem Schaltplan sinnvoll sind.
Nächstes mal, wenn mal wieder jemand sagt "den Schaltplan braucht ihr
nicht" verweisen wir einfach auf diesen Thread.
Hehe, ich wette das hast Du beim nächsten Mal vergessen. ;)
Mir ist sowas egal, solange das Problem in einem Thread gelöst wird,
darf es gerne noch so dumm sein. Irgendwann übersehen wir alle mal sowas
und suchen uns 'nen Wolf wieso irgendwas nicht so funktioniert wie
erwartet - obwohl die Lösung eigentlich trivial wäre.
Gutes Beispiel vielleicht, vor einiger Zeit bin ich gefragt worden, ob
ich mir einen Stapel gefertigter Platinen anschauen könnte, weil sich
der Controller auf diesen Platinen nicht flashen lässt. Mit einer nur
kurz früher gefertigten Charge gab es keine Probleme. Da denkt man über
alles nach, Probleme mit der Spannungsversorgung, irgendwelche
Entkoppelkondensatoren vergessen, Falschbestückung... man misst alles
nach, tauscht sogar einen fertig geflashten Controller von einer alten
Platine auf die der neuen Charge... Platine besteht danach alle Tests,
Controller aber weiter nicht programmierbar. Es dauert eine ganze Weile
bis man herausfindet, daß irgendwer am ISP-Anschluss MISO und MOSI
vertauscht hat. Und angeblich wurde die Platine zwischen beiden Chargen
nicht verändert, natürlich ist niemand dafür verantwortlich. Die Charge
konnte dann recht einfach mit einem Adapterkabel (welches die
MISO/MOSI-Vertauschung korrigiert) gerettet werden, aber sind trotzdem
ein paar Stunden Zeit und 'ne Pizza für so einen dummen bzw. simplen
Fehler draufgegangen.
Ben B. schrieb:> daß irgendwer am ISP-Anschluss MISO und MOSI vertauscht
Am riskantesten sind "kleine" Verbesserungen, die nicht sofort in
Produktion gehen.
Gerne auch bei Einträgen in Konfigurationsdateien. Da fällt der Server
nach einem Stromausfall aus, und alle suchen den elektrischen Defekt,
anstatt in der Datei /etc/network/interfaces.