Archiv verlassen und diese Seite im Standarddesign anzeigen : Strommessung (Differenz) über ADC0 und ADC1
Hallo,
ich habe einen Code für einen Tiny26, mit dem eine Strommessung über einen Shunt realisiert wird:
I = 0 'Strommessung mit internem Verstärker
Wtemp0 = Getadc(&B11001011) 'REFS0 + REFS1 + (ADC +0/-1 20x) Current with int amplifier
Waitus 150
For Btemp = 1 To 16
Enable Adc
Mcucr.se = 1
Mcucr.sm0 = 1
Mcucr.sm1 = 0
!sleep
Wtemp0lo = Adcl
Wtemp0hi = Adch
Disable Adc
I = I + Wtemp0
Next
Shift I , Right , 4
Diese Code soll nun auf einen Mega32 portiert werden. Was mir dabei vollkommen unklar ist, ist die Zeil mit GetADC().
Wieso wird hier der Wert 203 (&B11001011) übergeben? Normalerweise übergebe ich doch nur den Kanal und einen evtl. Offset? Irgendwie hat das wohl mit der Differenzbildung zwischen ADC0 und ADC1 zu tun. Aber wie funktioniert das genau?
Kann mir mal jemand dabei helfen?
Danke.
linux_80
27.01.2007, 01:10
Hallo,
im Prinzip kann man bei GetAdc das komplette Register ADMUX übergeben, darin ist auch die Referenzspannungsquelle angegeben, siehe DB.
Bei GetAdc zwei Parameter zu übergeben (Offset) würde evtl. besser lesbar sein, aber es kommt das selbe dabei raus.
Nicht bei jedem Tiny kann man bei Bascom die Referenz schon beim Config ADC angeben, deshalb wird es so gemacht, als Workaround.
Hallo,
mit dem Datenblatt komme ich nicht so recht weiter. Welchen Wert müsste ich GetADC beim M32 denn übergeben, um das gleiche Ergebnis wie beim Tiny26 zu erzielen?
linux_80
27.01.2007, 21:14
Hi,
Das geht doch eeh so schön, da der Wert schon binär angegeben ist, braucht man nur im DB zu schauen welche Position was bedeutet:
Die oberen 2 Bit geben die Referenz an, beide gesetzt, also intern 2,56V + Kondensator an AREF,
Die unteren 5 Bit geben den Kanal an, da hier aber differential gemessen wird, brauchts etwas mehr,
01011 bedeuted dann pos. Spannung an ADC0, neg. Spannung an ADC1, Gain ist 20x.
Jetzt geht man mit diesem Wissen in das DB vom Mega32 und schaut beim Register ADMUX ob der das auch so kann, und wie.
Im Prinzip kann der das, nur für Gain gibts andere Werte, also muss man da noch etwas anpassen, wohl auch im Rest von der Auswertung des Wertes.
Bei Deinem Auszug geht aber noch einiges ab, denn da wird anscheinend der IRQ des ADC verwendet.
Bei Deinem Auszug geht aber noch einiges ab, denn da wird anscheinend der IRQ des ADC verwendet.
Die Details zum Thema stehen hier: http://www.rclineforum.de/forum/thread.php?threadid=68553.
Die Sache mit dem IRQ kann ich nicht einordnen. Ich meine, das der für mich uninteressant ist.
Ich benötige von dort lediglich die Funktion zur Differenzmessung des Stroms. Die Übergabe des Wertes lt. Datenblatt für den M32 habe ich mittlerweile begriffen. Allerdings gibt es bei einem 1mOhm Shunt (8,5 cm Kupferkabel) nur Werte, mit denen ich nichts anfangen bzw. nicht auf den aktuellen Strom schließen kann.
Was würdest Du empfehlen, wenn ich bis 10A bei max. 20 Volt messen will oder genauer gesagt, die aus einem Akku entnommenen mA zählen will?
linux_80
29.01.2007, 22:36
Für den elektronischen Teil muss sich jemand anders bemühen, ist nicht mein Fach. [-X
Was meinst Du mit den Werten kannst du nix anfangen, was kommt denn so raus ?
Was sagt das Multimeter ?
Das Multimeter sagt, das am Shunt 0,8 mV abfallen.
Dabei werden lt. Labornetzteil 1,5 A gezogen (20 Watt Halogen bei 9 V) und ca. 70 mA für das RN-Board.
Bei 10-facher Verstärkung (&B11001001) habe ich als Differenz (?) beim ADC den Wert 1015 mit Last und 6 ohne Last.
Referenz ist 5V.
linux_80
30.01.2007, 22:59
Wenn Du den Wert ins ADMUX schreibst ist das aber nicht 5V Referenz sondern intern 2,56V,
wenn da dann trotzdem 5V an AREF anliegt kommt der ADC etwas durcheinander !
Du musst also entweder die Referenz richtig einstellen &B00......
oder aussen nur einen Kondensator an AREF, sonst nix dort anklemmen !
Hallo Reinhard.
vieleicht hilft dir das ja weiter:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=27015
Da habe ich mich mit dem Problem befaßt. Die Spannungsmessung funktioniert bereits. (Werte müssen noch korrekt umgerechnet werden)
Die Strommesung sollte vom Prinzip her so funktionieren, hab aber im Augenblick keine Zeit sie zu testen. Ich hab das Prog aus der Bascom Hilfe angepaßt.
Ich messe über Vorwiderstand die Spannung an Ein- (ADC1) und Ausgang (ADC2) des Shunt. Die Differenz ergibt den Spannungsabfall. Daraus (I=u/R) errechne ich den Strom.
Ob die geringe Spannungsdifferenz ausreicht bin ich mir noch nicht sicher, evtl. muß ein OP als Präzisionsverstärker her.
(Anmerkung) Die am ADC anliegende Spannung darf 5V nicht übersteigen, sonst stirbt der ADC. Sie darf auch nicht höher sein als die Referenzspannung sonst läuft das Register über.
Vorgesehen hab ich (bei 30V) als Vorwiderstand eine Reihenschaltung von Widerständen:
Eingangsspannung (ca 30 V) > Widerstand 47K > auf ADCx > auf 4k7 > auf Pot 500R (zum Abgleich) > Masse
Das Ganze drei mal (Ausgangsspannung, Eingang Shunt, Ausgang Shunt)
https://www.roboternetz.de/wissen/index.php/ADC_%28Avr%29
Sieh meinen Beitrag als Denkanstoß. Bin in Eile und kann daher icht alles in Ruhe durchlesen. Viel Spass.
gandalf
--------------------------------------------------------------------------------
Bei der gezielten Lösungssuche helfen auch kleinste Vorversuche ( Dietrich Drahtlos - http://www.b-kainka.de/drahtlos/index.htm )
mit dem problem schlag ich mich schon eine ganze weile rum
tiny26 ADC und bascom
eine messung an ADC0 ist mir noch nie gelungen
Problem an porta bit 4-7 sind led
ADC1 porta.1 ist die zu messende Spannung AVCC ist refference
muss ich da noch einen condensator an VREF anlegen gegen masse oder geht das so mit der VCC an AVCC
gibt es in bascom auch die möglichkeit den Wrd wert des ADc in eine byte variabel zu konvertieren
und ich hab noch nirgends eine schaltung zum testen gefunden
damit man mal aus der VCC saubere volt von 0-vcc zum messen bekommt
hat da jemand ne idee ein LM317 bringt ja minimum1.25volt
sonst sind die werte über 1,25bis vcc sauber zu messen jedenfals bei mir
ich kalibrier den µc auf dies weise
tiny26 hat ja intern 8mhz clock
das ist bei der gröse und den feathers voll klasse für die roboter technik
messen 10kanäle 10bit Steuern 2Kb flash eeprom und sram regeln
15ports
hätte da jemand mal einen funktionierenden code (GETESTET) selberschreiben kann ich auch aber funzen soll er
der den adc(0) sauber wandelt kann auch sein das nach so ca 1500 testflashen der µc was hat
danke
'/////////////////////////////////////////////////////////
'/// BASCOM ISP PROGRAMMER TEST ///
'/// PORT B toggel LED SERVOan portb3 LCD
' ADC1 porta1=signal 0-5V FUNKTION TYNY26 feb 2007
'/////////////////////////////////////////////////////////
$regfile = "AT26def.dat" ' used device
$crystal = 8000000
$hwstack = 32 ' default use 32
$swstack = 10 'default use 10 for
$framesize = 40 'default use 40 for
Ddra = &B11110000
Config Adc = Free , Prescaler = 64 , Reference = Off
Start Adc
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Servos = 1 , Servo1 = Portb.3 , Reload = 10
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portb.5 , Rs = Portb.4
Config Lcd = 20 * 2
Const Teiler = 0.00488
Const Teiler2 = 1.636
Enable Interrupts
'Start Adc
Dim Wertad As Word
Dim Tmp As Word
Dim Wertse As Byte
'Dim A As Byte
'Dim Teiler As Single
Dim Volt As Single
Wertad = 500
'Teiler = 0.00488
Do
Waitms 10
Wertad = Getadc(1)
'If Wertad > 500 Then Set Porta.5
'If Wertad < 500 Then Set Porta.6
If Wertad > 1022 Then Wertad = 1022
If Wertad < 10 Then Wertad = 10
Tmp = Wertad / 4
If Tmp > 150 Then Tmp = 150
If Tmp < 40 Then Tmp = 40
Wertse = Low(tmp)
Servo(1) = Wertse
Volt = Wertad * Teiler
Cls
Lcd "Volt :" ; Volt
Locate 1 , 11 : Lcd " V " '; Fusing(volt , "# . ##")
Lowerline
Wertse = Wertse - 40
Volt = Wertse * Teiler2
Lcd "Grad :" ; Volt
Locate 2 , 13 : Lcd " " '; Fusing(volt , "# . ##")
Waitms 100
Loop
'kein speicherplatz ehr auf dem chip fusing nicht möglich
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.