Arduino paneelmeter

Hallo allemaal,

Na even weg te zijn geweest nu weer tijd om mijn hobby op te pakken. Eindelijk weer een beetje lekker prutsen! :D

Ik heb mezelf weer eens een lekkere uitdaging gesteld, het hele project is dat ik zelf domotica wil gaan maken. Ik wil dit maken uit losse units die via een bus met elkaar in verbinding staan en gevoed worden uit 1 bron zodat ik het stroomverbruik een beetje in de gaten kan houden. Hiervoor wil ik dan ook een digitale paneelmeter maken met behulp van een ATMEGA328pu die in een arduino zit. Met de arduino wil ik dan een LCD display aansturen die de stoom en spanning aangeeft.

Het schema zoals ik dat nu heb opgesteld:

code:


                                                      -----------
  +12V---------+---------------------------------+---| 0.4 ...W |---+---------------O
               |                                 |    -----------    |
               |                                 |                   |
               |                                 |                   |
               -                                 -                   |
              |1|                               | |                  |
              |0|                               |1|                  |
              |0|                               |M|                  |
              |K|                               | |                  |
              | |                               | |                  |
               -                                 -                   |
               |           -----   arduino       |                   |
               +------+---| 1M  |-+--A1          +------||-----------
Supply         |      |    -----  |              |      1nF                        Load
               -      -           |              |
              |1|    |1|          |              A0
              |0|    |0|          |            arduino
              |0|    |0|          = 1nF
              |K|    |K|          |
              | |    | |          |
               -      -           |
               |      |           |
               +------+-----------
               |
               |
               |
  0V-----------+---------------------------------------------------------------------O

De supply:
Een +12V 150W supply (12.5A)

De spanningmeter:
De arduino kan tot +5V= meten dus middels een spanningsdeling wil ik een derde van de spanning aanbieden aan de arduino. De weerstanden heb ik zo gekozen dat er een stroom verbruik van 1mA wat ik schappelijk vind.

De stroommeter:
Met een shunt weerstand van 0.4Ohm; kom ik op een spanning van 5V bij een stroom van 12.5A. Deze 5V wordt ook weer gemeten door de arduino.

Nu heb ik een aantal vragen.
1. Ik heb al gelezen dat de voeding van de meter (arduino) apart moet zijn van de voeding die ik wil meten, dit is geen probleem maar de arduino meet t.o.v. 0V moet ik hiervoor de 0V van de arduino (en dus ook van zijn voeding) verbinden met de 0V van de voeding die ik wil meten?
2. In een aantal artikelen hebben ze het over een galvanische scheiding van meter en voeding, is dit alleen als je een analoge meter wil of heb ik dit ook nodig? En zo ja, waar moet ik die dan plaatsen?
3. Hoeveel Watt moet de shuntweerstand zijn? Ik ging ervan uit dat deze ook 150 Watt moest zijn omdat de volledige stroom hier doorheen gaat. Echter, een shuntweerstand van 150 Watt lijkt me een beetje veel.

Ik heb echt al uren zitten lezen over een dergelijke schakeling maar deze vragen blijf ik houden. Kan iemand mij hier antwoord op geven?

Alvast hartstikke bedankt voor jullie medewerking!

Groet Diver

Diep nadenken is een kwestie van de goede baan uitkiezen

Je kunt de grounds doorverbinden, dan gaat de spanningsmeting goed, maar de stroommeting kan zo dan niet.
Daar kun je een ic bij nemen, een high side current sensor.

Ik ben zelf ook nog maar een beginner dus ik kan je lang niet met alles helpen, maar het volgende weet ik wel:

De stroommeter zul je op een andere manier moeten maken. Het aantal Watt bij een shunt betreft het verbruik van de shunt zelf (net zoals bij andere weerstanden). Je had zelf al uitgerekend dat er bij 12,5A 5V over de shunt staat. De shunt dissipeert dus 12,5 * 5 = 62,5W.
En dat is nog steeds heel veel.
Wat je nu hebt is een mooi voorbeeld van "burden voltage": het feit dat het meten van de stroom tot een lager voltage leidt. Die 5V over de shunt houdt namelijk automatisch in dat er maar 7V over is voor de rest! Van de 150W die je aan het circuit levert gebruik je ruim 40% voor het meten.
Paneelmeters meten vaak in een bereik van enkele honderden millivolts. Dat scheelt dus meer dan een factor 10 met jouw circuit en resulteert in een veel lager burden voltage.

De beste manier om dit op te lossen laat ik liever aan de meer ervaren leden over (ik vermoed zelf dat het met een opamp moet kunnen).

Heb je die 12.5A trouwens wel nodig? Zoals ik het nu lees gebruik je je 12V alleen voor de aansturing van domotica-apparatuur en dan lijkt 150W mij wel erg ruim ingeschat.

Klinkt allemaal erg logisch en duidelijk :D. Ik ben me even verder gaan verdiepen en kwam uit op bijv. een Maxim MAX4137T als High Side Current Sensor. Die heeft een input van 150mV dus dan kom ik bij 12.5A op 0.012Ohm en 1.875W, wat een stuk acceptabeler klinkt als wat ik eerst had bedacht! Tnx marbu en Zonnepaneeltje.

Mijn schema komt er dan als volgt uit te zien:

code:



                                                     --------------
  +12V---------+---------------------------------+--| 0.012 1.875W |+----------------O
               |                                 |   -------------- |
               |                                 |       Shunt      |
               |                                 |                  |
               -                               --+------------------+--  
              |1|                             | Rs+                Rs- |
              |0|                             |                        |
              |0|                    +5V in---+Vcc     Current Sensor  |
              |K|                             |        (MAX4137T)      |
              | |                             |  GND            Out    |
               -                               ---+--------------+----- 
               |           -----   Arduino        |              |
               +------+---| 1M  |-+--A1           |              |
 Supply        |      |    -----  |               |              A0                Load
               -      -           |               |            arduino
              |1|    |1|          |               |
              |0|    |0|          |               |
              |0|    |0|          = 1nF           |
              |K|    |K|          |               |
              | |    | |          |               |
               -      -           |               |
               |      |           |               |
               +------+-----------                |
               |                                  |
               |                                  |
               |                                  |
  0V-----------+----------------------------------+----------------------------------O

Is dit dan de bedoeling of zit ik ernaast?
Is er ook iemand die ervaring heeft met een high end current sensor en deze kan aanbevelen? De MAX4137T heb ik van google maar een andere met een nog lagere ingangsspanning zou ook interessant kunnen zijn.

Diep nadenken is een kwestie van de goede baan uitkiezen

Verdiep je eerst eens in de hardware, een ATMega368 heeft bv:

- Selectable 1.1V ADC Reference Voltage

Daarmee word je shunt al een stuk kleiner 1,1V / 12.5A = 0.09Ω

De ATMega328 is niet de beste keuze voor dit klusje, een ATtiny861 heeft:

- 15 Differential ADC Channel Pairs with Programmable Gain (1x, 8x, 20x, 32x)

- Selectable 1.1V / 2.56V ADC Voltage Reference

En daarmee kun je dan zonder extra harware en met een kleine shunt je meter maken.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Na wat verder nazoeken en advies van marbu maar besloten om de stroom terug te brengen naar 5A, gaat een hoop schelen.

Roland, de ATMega328 wil ik gebruiken voor communicatie naar andere onderdelen, naar een computer en voor de aansturing van een LCD. Vandaar de ATMega328. Wil jij dan de ATtiny861 gebruiken als high end current sensor?

Diep nadenken is een kwestie van de goede baan uitkiezen

Nee, de ATtiny861 heeft 16 I/O, daarvan heb je er 2 nodig voor spannings / stroom meting en 2 voor serieele communicatie, dan zijn er dus nog genoeg over voor een LCD. In de 8K kun je nog een fors programma kwijt.

Dit is nu een prima voorbeeld van het nadeel van het Arduino platform, "one size fits all" bestaat niet, waarom zouden er anders zoveel verschillende AVR's en PIC's zijn...

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Ah op die manier :).

Ik had voor de ATmega328 gekozen omdat ik die ken en kan programmeren. Ik ga me inlezen in de ATtiny861 en een nieuw schematje opzetten.

In ieder geval bedankt voor de tip! Lang leve fora :D

Diep nadenken is een kwestie van de goede baan uitkiezen

Ben ik weer,

Ik heb de ATtiny861 onder de loep genomen maar het programmeren daarvan wordt een stuk lastiger... Ik denk toch dat ik voor een ATMega328 ga met een High End Current Sensor.

Iemand een idee welke ik daar het beste voor kan gebruiken?

Groet Diver

Diep nadenken is een kwestie van de goede baan uitkiezen

Ik heb de ATtiny861 onder de loep genomen maar het programmeren daarvan wordt een stuk lastiger...

Naar aanleiding van dit topic even in Bascom zitten frutten:

code:

'******************************************************************************
'                                                                             *
'    Filename: attiny861_volt.bas                                              *
'    Date: 20-11-2011                                                         *
'    File Version: 0.1                                                        *
'                                                                             *
'    Author: Roland van Leusden                                               *
'                                                                             *
'******************************************************************************


'********** Configuration Settings **********
$regfile = "attiny861.dat"                                  ' use ATTiny861
$crystal = 8000000


Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Dim Voltage As Word
Dim Current As Word

Dim Voltage_lcd As String * 4
Dim Current_lcd As String * 4
Dim Temp_lcd As String * 4

'*********** Functions ***********************

Declare Sub Do_measurement()


'*********** Main program ********************
Do
   Call Do_measurement()

   Voltage = Voltage * 2.93                                 '30V / (1023 <10 Bit ADC>) = 0,0293V / step
   Temp_lcd = Str(voltage)
   Voltage_lcd = Format(temp_lcd , "00.00")

   Current = Current * 0.488                                '5A / (1023 <10 Bit ADC>) = 0,00488A / step
   Temp_lcd = Str(current)
   Current_lcd = Format(temp_lcd , "0.00")

   Cls
   Upperline
   Lcd "Voltage " ; Voltage_lcd ; "V"
   Lowerline
   Lcd "Current " ; Current_lcd ; "A"
Loop

End                                                         'end program

'*********** Functions ***********************
Sub Do_measurement()

Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Start Adc

'The ADC features a noise canceler that enables conversion during sleep mode. This reduces
'noise induced from the CPU core and other I/O peripherals.

Power Adcnoise

'now read A/D value from channel 0 (Voltage / Pin 20 / PA0)

Voltage = Getadc(0)

'Getadc(channel,offset)
'An optional numeric variable of constant that specifies gain or mode.
'The offset will be added by the channel value and inserted into the ADMUX register.

' Settings for full range: I = 5A Rshunt = 0.011 Ohm Gain = 20 => 5 * 0.011 * 20 = 1,1V (Vref)

' 7     6     5     4    3    2    1    0    Bit
' Refs1 Refs0 Adlar Mux4 Mux3 Mux2 Mux1 Mux0 Admux

' REFS1 REFS0 Voltage Reference Selection
' 1     0     Internal 1.1V voltage reference

' MUX5:0 Differential Input Positive   Negative   Gain
' 001110                    ADC2 (PA2) ADC1 (PA1) 20x


'Admux = b10001110 => 142

'now read A/D value from channel 1,2 (Current / Pin 18 & 19 / PA1 & PA2)

Current = Getadc(142)

'The first conversion results after changing settings should be discarded.

Current = Getadc(142)

Stop Adc

End Sub 

Deze code is nog niet getest, dat word komend weekend pas.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Ik waardeer je hulp heel erg! Alleen heb ik weinig verstand van Bascom, hoewel het er redelijk duidelijk uitziet. Ik programmeer toch liever in C for Arduino wat ik ken en waarin ik in een later stadium eventueel aanpassingen kan doen. Dan hoef ik niet steeds iemand om hulp te vragen.

Daarbij word het ook lastig om de ATtiny861 fysiek te programmeren. Voor de ATMega328 heb ik een boarduino die ik aan mijn computer kan hangen via een USB-kabel en dan proggen maar. Voor de ATTiny861 heb ik deze spullen niet.

Nogmaals wel erg bedankt voor de moeite!

Diep nadenken is een kwestie van de goede baan uitkiezen

Doe het ook voor mezelf, er ligt hier nog een voeding waar meters op moeten, in de paneelmeters met de ICL7106 / 7107 heb ik geen zin vanwege de benodigde gescheide voedingen.

Een losse programmer hoeft niet veel te kosten:

USBASP USBISP AVR Programmer
Ebay Item number: 370532286436 $3.99 incl verzenden.

http://i.ebayimg.com/00/$%28KGrHqUOKkUE3V,GknS3BN4z5Y2Kbw~~_35.JPG

Daarnaast vind ik een Mega328 enigzins overkill voor deze toepassing en gaat een losse current chip ook nog geld kosten. Maxim heeft high side current sensors (MAX4372 1,63@mouser), die praktisch netzo veel kosten als een ATTiny861 (1,86@mouser).

Je ziet in mijn code dat ik aan een kleine weerstand van 0.011Ω genoeg heb voor 5A. In die weerstand word dan maar 0.275W verstookt, een 1/2w weerstand is ruim voldoende.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Ik moet zeggen dat ik nu steeds serieuzer ga nadenken om toch een ATtiny861 te gaan gebruiken.

Ik denk dat ik die programmer een keer ga bestellen en kijken waar ik de ATtiny861 het beste weg kan halen.

Ik hoop wel dat ik jou dan vaker kan contacten om hulp te vragen ;-).

Volgens mij meet jij trouwens tot 30V. Kan ik het simpel omzetten naar 15V door de volgende code te gebruiken?

bascom code:


  Voltage = Voltage * 1.47                                 '15V / (1023 <10 Bit ADC>) = 0,0147V / step

Groet Diver

Diep nadenken is een kwestie van de goede baan uitkiezen

Bij 15V wil je op je ADC ingang 1.1V hebben. Je spanningsdeler bestaat dan uit een weerstand van 1K1 en een weerstand van 13K9.
In praktijk neem ik een 1K5 multiturn trimpot, en een weerstand van 13K9 1%. Dan klopt je aanname idd.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Zo, weer even verder nagedacht en kom ik op het volgende schema:

code:



                                                     --------------
  +12V---------+---------------------------------+--|  0.011 0.5W  |+----------------O
               |                                 |   -------------- |
               |                                 |       Shunt      |
               |                                 |                  |
               -                               --+------------------+--  
              | |                             | PA1                PA2 |
              |1|                             |       ATtiny861        |
              |5|                    +5V in---|Vcc                     |
              |K|                             |                     PB0|---LCD D4
              | |                             |                     PB1|---LCD D5
               -                              |                     PB2|---LCD D6
               |                              |                     PB3|---LCD D7
               +------------------------------|PA0                  PB4|---LCD Enable
 Supply        |  _                           |                     PB5|---LCD Reset
               -  /|                          |                        |
              | |/                            |                        |
              |1/                             |                        |
              |K|                             |  GND                   |
              /5|                              ---+--------------------             Load
             /| |                                 |
            /  -                                  |
           |   |                                  |
            ---+                                  |
               |                                  |
               |                                  |
               |                                  |
  0V-----------+----------------------------------+----------------------------------O

Gezien een 13K9 beetje lastig is om te vinden heb ik maar een 15K genomen (heb ik nog liggen ook :P) en dan zou de 1K5 op 1K2 moeten komen te staan ipv 1K1 dus ook dat is te doen.

Als er aanmerkingen zijn hoor ik dat graag!

Groet Diver

Diep nadenken is een kwestie van de goede baan uitkiezen

Schema is fout, de shunt moet in de ground-lijn.

Precies, nu krijgt de ADC van de Tiny 15V op zijn ingang, terwijl de voedingspanning maar 5V is.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Bij deze een herziene versie

code:



  +12V---------+---------------------------------------------------------------------O
               |
               |
               |
               -                               ------------------------  
              | |                             |                        |
              |1|                             |       ATtiny861        |
              |5|                    +5V in---+Vcc                     |
              |K|                             |                     PB0+---LCD D4
              | |                             |                     PB1+---LCD D5
               -                              |                     PB2+---LCD D6
               |                              |                     PB3+---LCD D7
               +------------------------------+PA0                  PB4+---LCD Enable
 Supply        |  _                           |                     PB5+---LCD Reset
               -  /|                          |                        |
              | |/                        ----+GND                     |
              |1/                        |    |                        |
              |K|                        |    | PA2                PA1 |
              /5|                        |     --+------------------+--             Load
             /| |                        |       |                  |
            /  -                         |       |                  |
           |   |                         |       |                  |
            ---+                         |       |                  |
               |                         |       |                  |
               |                         |       |      Shunt       |
               |                         |       |  --------------  |
  0V-----------+-------------------------+-------+-|  0.011 0.5W  |-+----------------O

Is hij zo goed?

Diep nadenken is een kwestie van de goede baan uitkiezen

Hallo allemaal,

Ik ben net even met BASCOM AVR, en dan vooral de simulatie, bezig geweest en heb daarbij gebruik gemaakt van de code van Roland. Ik heb alleen volgens mij een klein foutje ontdekt. De variabele Voltage (en ik denk ook Current maar dat heb ik niet geprobeerd) kan je alleen maar vermenigvuldigen met hele getallen. Bij 1.47 wordt de maximale waarde uit de ADC 1023 en bij 1.6 word dit 2046. Is het type variabele (nu Word) wel goed of moet dat iets anders zijn zodat er wel beter mee gerekend kan worden?

Groet Diver

Diep nadenken is een kwestie van de goede baan uitkiezen

Was nog niet getest idd, compileerde wel zonder fouten.

code:

 Voltage = Voltage * 47 '(max: 1023 * 47 = 48081)
 Shift Voltage , Right , 5  '(max: Voltage / 32 => 1502) 
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Is hij zo goed?

Bijna, de GND van de Tiny & het LCD moet aan de kant van PA1, nu word PA1 negatiever dan de GND van de Tiny en dat mag niet.

Voor de puristen, je meet nu idd het verbruik van de Tiny en het LCD mee, dit valt in de software te compenseren.

[Bericht gewijzigd door Roland van Leusden op donderdag 24 november 2011 14:03:36 (35%)

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Kijk, dat gaat al een stuk beter! Super!

Voor mij maakt het trouwens niet uit als het verbruik van de LCD en Tiny ook meegemeten worden, ik wil de totale belasting van de voeding weten en daar hoort dat ook bij.

Ik heb jouw trucje trouwens ook toegepast voor de current:

bascom code:


   Current = Current * 2
   shift Current , right , 2

Imax is nu 5.11A prima te doen denk ik.

Ik krijg nu alleen wel in beeld: "Voltage 15.020.0V". Kan het zijn dat er iets in het format verkeerd gaat? Als de waarde onder de 2 digits voor de komma (bijv. 7.5) komt geeft hij wel netjes "Voltage 7.50V" aan.

Na even verder te hebben gezocht kwam ik erachter dat hij de waarde van de stroom achter de waarde van de spanning in het zelfde stukje weg schrijft.
Voorbeeld:
voltage is 12.49
current is 2.47
Hij schrijft nu: 12.492.47V
De variabele Temp_lcd is op dat moment 1502 maar Voltage_lcd is 12.492.47 ... Ik snap er even niks meer van :(

Nog even verder prutsen om te kijken waar dat probleem zit

Diep nadenken is een kwestie van de goede baan uitkiezen

Fout gevonden en verholpen :D.

Ik heb alle strings 5 characters lang gemaakt ipv 4. Dan gaat het wel helemaal goed. Erg wazig maar wel opgelost!

Diep nadenken is een kwestie van de goede baan uitkiezen

Goed bezig ! Ik ga 'm dit weekend fysiek op breadbord zetten.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Heel goed, ik ben benieuwd!

Ik ben nog bezig om overal mijn spullen vandaan te halen, de programmer en LCD zijn inmiddels besteld in China, nu de ATtiny861 nog, weet iemand waar ik die het beste kan halen? Ik wil er meteen een stuk of 10 bestellen en dan het liefst met 10 voetjes erbij.

Groet Diver

De code zoals ik hem momenteel werkend heb is:

bascom code:


'******************************************************************************
'*                                                                            *
'*    Filename: Panelmeter.bas                                                *
'*    Date: 24-11-2011                                                        *
'*    File Version: 0.2                                                       *
'*                                                                            *
'*    Author: Roland van Leusden                                              *
'*    Edit by: Peter Groeneweg                                                *
'*                                                                            *
'******************************************************************************

'********** Configuration Settings **********
$regfile = "attiny861.dat"                                  'Use ATtiny861
$crystal = 8000000
$sim                                                        'Teporary for simulation. Remove before programming!

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Dim Voltage As Word
Dim Current As Word

Dim Voltage_lcd As String * 5
Dim Current_lcd As String * 5
Dim Temp_lcd As String * 5

'*********** Functions ***********************

Declare Sub Do_measurement()


'*********** Main program ********************

Do
   Call Do_measurement()

   Voltage = Voltage * 47                                   'Max : 1023 * 47 = 48081)
   Shift Voltage , Right , 5                                'Max : Voltage / 32 => 15.02
   Temp_lcd = Str(voltage)
   Voltage_lcd = Format(temp_lcd , "0.00")

   Current = Current * 2                                    'Max: 1023 * 2 = 2046
   Shift Current , Right , 2                                'Max : Current / 4 => 5.11
   Temp_lcd = Str(current)
   Current_lcd = Format(temp_lcd , " 0.00")

   Cls
   Upperline
   Lcd "Spanning " ; Voltage_lcd ; "V"                      'Message in dutch (Voltage)
   Lowerline
   Lcd "Stroom   " ; Current_lcd ; "A"                      'Message in dutch (Current)
Loop

End

'*********** Functions ***********************

Sub Do_measurement()

Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Start Adc

'Power Adcnoise                                                        'Remove ' before progamming!

Voltage = Getadc(0)

'Getadc(channel,offset)
'An optional numeric variable of constant that specifies gain or mode.
'The offset will be added by the channel value and inserted into the ADMUX register.

' Settings for full range: I = 5A Rshunt = 0.011 Ohm Gain = 20 => 5 * 0.011 * 20 = 1,1V (Vref)

' 7     6     5     4    3    2    1    0    Bit
' Refs1 Refs0 Adlar Mux4 Mux3 Mux2 Mux1 Mux0 Admux

' REFS1 REFS0 Voltage Reference Selection
' 1     0     Internal 1.1V voltage reference

' MUX5:0 Differential Input Positive   Negative   Gain
' 001110                    ADC2 (PA2) ADC1 (PA1) 20x

'Admux = b10001110 => 142

'now read A/D value from channel 1,2 (Current / Pin 18 & 19 / PA1 & PA2)

Current = Getadc(142)

'The first conversion results after changing settings should be discarded.

Current = Getadc(142)

Stop Adc

End Sub
Diep nadenken is een kwestie van de goede baan uitkiezen