Reparera Design möbel

ATmega. PWM pulsräknare. Vi ansluter Arduino till elmätaren Arduino projekterar reversibel räknare på led-indikatorer

3

Du kan inte bara göra det utan en avbrottshanterare, du kan göra det med lite eller ingen programvara och hantera de snabbare pulserna som är möjliga med mjukvarupolling eller avbrottsräkning.

Atmel AVR att de flesta Arduinos är baserade på räknare/timer-hårdvara som kommer att räkna pulsen vid ingångsstiftet direkt. Allt du behöver göra är att ställa in räknarens hårdvara och läsa räknarregistret. Det finns en liten komplikation för 16-bitars räknare på en 8-bitars enhet, men detta är lätt att övervinna. Arduino ställer in timers för PWM-operationer som standard, men detta kan åsidosättas enligt beskrivningen (se AVR-användarmanualen för detaljer) - du måste använda timern/räknaren i CTC-läge.

Arduninos-baserade ARM och nästan alla andra mikrokontroller kommer att ha liknande hårdvara; vissa är mer flexibla så att stift kan användas för att räkna utrustning.

På AVR har du 8 och 16 bitars räknare, om du behöver stora räkningar kan du behöva hantera ett spillavbrott. Om du kontrollerar räknaren regelbundet kan du hantera även det utan avbrott, eftersom du kan polla med en mycket långsammare och möjligen aperiodisk takt än ingångspulsfrekvensen genom att helt enkelt polla överflödesflaggan före nästa bräddavlopp.

I ditt fall behöver du förmodligen avläsa antalet pulser under en vanlig period, vilket är mindre än den tid som räknaren kommer att svämma över vid den maximala förväntade pulsfrekvensen. Så, till exempel, om du använde en 8-bitarsräknare och maxpulsen var 1kHz, skulle du behöva polla var 256/1000:e sekund eller mindre, men du kan få största möjliga noggrannhet genom att göra denna period så lång som möjligt . Så, till exempel, kan du ha något i stil med följande (det här är inte riktig kod, bara ett utdrag):

For(;;) ( delayMS(250) ; frekvens = 4 * readCounter() ; )

Ett alternativ som kommer att få ett mer linjärt svar, men ett icke-deterministiskt antal, kommer att undersöka överflöden och mäta den tid det tar att räkna ett fast antal pulser, och därför definierar din mätning från tidpunkten för en fast räkning, inte till en räknas inom en bestämd tid.

For(;;) ( int start = getMillisec() ; while(!counterOVF()) ( // Gör ingenting (eller något användbart men snabbt) ) int t = getMillisec() - start ; frequency = 256 * t/1000 ; )

0

Tack så mycket för din fråga. Om jag förstår det rätt är din första idé att stänga av pulserna via hårdvara, och den andra är hela tiden som CPU:n är upptagen. Problemet är att min mikrokontroller är fulladdad (så en enkel ISR som ökar räknarvariabeln kommer inte att fungera) och kan inte pollas eftersom den måste göra andra uppgifter. Dessutom har jag inte längre maskinvaruräknare. Finns det andra alternativ? Jag har hört att detta är möjligt med de analoga portarna (beroende på likhet med PWM). Tack så mycket - manattatta 28 aug 14 2014-08-28 08:16:36

0

I båda fallen räknar hårdvaruräknaren, i det andra exemplet kontrollerar min omröstning efter spillflaggan, men det är bara för att demonstrera principen, det är inte ett grundläggande beslut; det kan likaså vara en avbrottshanterare - fördelen är att du får ett avbrott för varje 256 puls (förutsatt 8 räknarbitar) snarare än varje puls, så avbrottsoverheaden är mycket lägre. - Clifford 28 aug 14 2014-08-28 11:10:07

0

Du kan bara använda en analog ingång om sensorns utgång är en fast PWM-frekvens (och du har lagt till lämplig analog filtrering med en cutoff något under den frekvensen), men din fråga antyder att det är en variabel frekvens, inte PWM (hur skulle annars hjälp med pulsräkning? -

För ytterligare en uppgift

kretsschema

Schema på brödbrädan

notera

    I det här experimentet använder vi en IC för första gången, i det här fallet 74HC595-utgångsskiftregistret. Mikrokretsar är användbara eftersom de låter dig lösa ett specifikt problem utan att montera en standardkrets varje gång.

    Utgångsskiftregistret ger oss möjligheten att "spara" de digitala utgångarna genom att endast använda 3 istället för 8. Registerkaskaden skulle tillåta 16, och så vidare. signaler genom samma tre stift.

    Innan du använder mikrokretsen måste du noggrant studera diagrammet över dess anslutning i databladet. För att förstå var man ska räkna benen på mikrokretsen har de en halvcirkelformad skåra på ena sidan. Om vi ​​placerar vår 74HC595 med skåran till vänster, kommer den nedre raden att ha ben 1-8 och den översta raden 16-9.

    I det schematiska diagrammet för vårt experiment är benen ordnade i en annan ordning så att det inte uppstår förvirring i anslutningarna. Pintilldelningarna enligt databladet är signerade inuti mikrokretsbilden, bennumren är utanför.

    Kom ihåg att på bilden av sjusegmentsindikatorn är numren på dess ben och deras motsvarighet till segmenten undertecknade.

Skiss

För att överföra en del av datan som kommer att skickas genom skiftregistret vidare måste vi applicera LOW på låsstiftet (chipets ST cp-ingång), sedan överföra data och sedan skicka HÖG till låset stift, varefter den överförde en kombination av höga och låga signalnivåer.

Vi använde funktionen shiftOut(dataPin, clockPin, bitOrder, value) för att överföra data. Funktionen returnerar ingenting, och som parametrar måste den berättas

  • Arduino-stift, som är anslutet till DS-ingången på mikrokretsen (datastift),

Nej, den här artikeln handlar inte om ett annat sätt att lura denna olyckliga enhet. Så här använder du Arduino och LabView för att förvandla din elmätare till en effektmonitor eller till och med en amperemeter!


Den allra första elmätaren var induktion. Principen för dess funktion är löjligt enkel - i själva verket är det en elektrisk motor, vars rotor är en aluminiumskiva som roterar ratten. Ju mer ström den drar, desto snabbare snurrar skivan. Enheten är rent analog.

Men idag tappar induktionsmätare mark och ger vika för sina billigare elektroniska motsvarigheter. Och bara en av dessa kommer att bli experimentell:

Funktionsprincipen har inte förändrats mycket - i det här fallet ersätts skivan av elektronik som genererar pulser i enlighet med mängden el som förbrukas. Som regel, i de flesta enheter, visas dessa pulser av en LED-indikator. Följaktligen, ju snabbare detta ljus blinkar, desto dyrare kW förbränns.
På frontpanelen på alla enheter finns det dessutom ett motförhållande A- antal pulser per 1 kWh. Som framgår av bilden är det experimentella A = 12800. Från denna information kan följande slutsatser dras:

Med varje puls registrerar mätaren en förbrukning lika med 1/12800 av 1 kWh. Om du sätter på belastningen till mätaren och börjar helt enkelt räkna pulserna, är det lätt att få mängden el som förbrukas av den (kWh) genom att dividera antalet pulser med utväxlingsförhållandet.

Eftersom indikatorn ändrar hastigheten på dess blinkning är det möjligt att härleda förhållandet mellan effekt (kW) och tiden för en meter puls, vilket gör det möjligt att få data om effekt / ström.
Vi kommer inte att ladda artikeln med beräkningar, men om det behövs, då

här är de

Mätarens utväxlingsförhållande är verkligen en stor sak, eftersom du känner till det kan du uttrycka både kraft och ström:
Låt oss göra en proportion från vårt utväxlingsförhållande (A=12800 imp/kW*h) och okänt utväxlingsförhållande, som kommer att vara vid belastning X och under en enda puls (lampan blinkar):

Här är X den okända effekten och t är tiden för en puls. Vi uttrycker den okända kraften härifrån och här är den:

Strömmen beräknas med hjälp av följande proportion av utväxlingsförhållanden och kända och okända strömmar vid last X.:


Vilket i allmänhet leder till en identisk formel, men för ström (ström mäts i ampere och indexen betyder belastningen vid vilken denna ström kommer att vara):

Här kan du se en fallgrop - du behöver veta strömmen vid en idealbelastning på 1 kW. Om det behövs god noggrannhet är det bättre att mäta det själv, och om inte, kan du ungefär beräkna det med formeln (spänning och effekt är kända), men det blir mer grovt, eftersom effektfaktorn inte tas med i konto.


Allting vilar alltså på att mäta tiden för en impuls (blinkande av indikatorn). I min forskning förlitade jag mig på detta utmärkta projekt. En viss italienare gjorde ett gränssnitt för att övervaka effekt i Labview-miljön och kom på en krets för att mäta pulser. Men det fanns ett stort fel i hans projekt - det var bara lämpligt för mätare med ett utväxlingsförhållande på 1000 imp / kWh.

Den övre grafen är medeleffekten över 5 minuter, den nedre grafen är i realtid. Gränssnittet är ganska flexibelt och kan enkelt modifieras för att passa dina behov. Om du inte har hanterat LabView-miljön än rekommenderar jag att du bekantar dig.

För att allt skulle fungera visade det sig vara tillräckligt att introducera ett enda block i programalgoritmen, i enlighet med formeln ovan.

Det ser ut så här


Det verkar enkelt, men innan dess måste du fortfarande tänka på det!

Så om du fortfarande bestämmer dig för att implementera effektövervakning, finns det två alternativ:

1. Din disk är stängd och förseglad efter bästa förmåga. Det betyder att pulser endast kan avläsas med ett fotomotstånd som reagerar på en glödlampas blinkande. Den måste fästas med blå eltejp mittemot LED-indikatorn på mätarens frontpanel.
Schemat kommer att se ut så här:

Schema för beröringsfri pulsupptagning


Programmet jämför helt enkelt resistansvärdet på fotoresistorn och potentiometern. Dessutom låter den senare dig ställa in känsligheten för en sådan sensor för att undvika falska larm och justera till ljusstyrkan på indikatorn.

2. Du har tillgång till mätarens pulsutgång. Många modeller har en pulsutgång som duplicerar blinkandet av en älskling. Detta görs för att kunna koppla enheten till det automatiserade redovisningssystemet. Det är en transistor som öppnar när indikatorn är på och stänger när den är av. Att ansluta direkt till det är inte svårt - det kräver bara ett pull-up motstånd. Men innan du gör detta, se till att detta är en pulsutgång och inte något annat! (det finns alltid ett schema i passet)

Schema för anslutning till telemetriutgång


I mitt fall är tillgången full, så jag brydde mig inte för mycket. Installera LabView och börja mäta! Alla grafer representerar effekt (W) i realtid.
Den tålmodiga tekannan var den första som delades ut. Kepsen säger att den har en effekt på 2,2 kW, men av schemat att döma förbrukar den regelbundet bara 1700 watt. Observera att förbrukningen är mer eller mindre konstant över tiden. Detta innebär att värmeelementet (mest troligt nikrom) ändrar sitt motstånd väldigt lite under hela kokningsprocessen.

En limpistol är en helt annan sak - den deklarerade effekten är 20 W. Den beter sig i enlighet med fysikens lagar - när den värms upp ökar värmarens motstånd, och strömmen minskar i enlighet därmed. Jag kollade det med en multimeter och allt finns där.

Gammal radiomottagare "Spring". Här gick grafen upp i början på grund av att jag startade mätningen under impulsen, och följaktligen påverkade detta data. Diagrammen på grafen visar hur jag vred på volymratten. Ju högre - desto mer äter radion.

Perforator med en deklarerad effekt på 700 watt. Jag tryckte på knappen hela vägen, väntade lite och släppte det, men inte smidigt. Grafen visar tydligt startströmmen vid start av motorn. Det är därför lampan blinkar när en god granne börjar dunka på sin älskade vägg.

Och nu det mest intressanta. Jag gjorde ett litet experiment med min gamla bärbara dator, vars resultat visas på bilden:

Den orange pricken markerar tiden då jag körde flera "tunga" program samtidigt. Som du kan se har CPU-belastningsdiagram och ökad förbrukning något gemensamt. Nyligen var

Den här artikeln innehåller all information om den Arduino-baserade elmätaren, inklusive diagram, firmware, kommentarer om revideringen av den aktuella firmwareversionen och designen.

Så här ser det ut i slutändan.

Till en början bröt jag upp all information i en stor hög med små artiklar - vilket gjorde det väldigt obekvämt att söka efter den och överhuvudtaget upprepa den här enheten. Den här artikeln korrigerar denna situation.

Del 1. Idé, design och tänkande högt.

För en tid sedan installerade jag en elmätare med två zoner för att dra fördel av den bättre nattpriset (50 % från 2300 till 0800). Det visade sig att vi förbrukar 45 % av elen på natten. Men svaret är hur konsumtion uppstår i samband med konsumtionsställen. Naturligtvis gör inte den här enheten.

Därför fanns det ett behov av en mer detaljerad presentation av konsumtionsdata. Inledningsvis beslutades det att göra en enhet som visar följande data:

  1. Aktuell lasteffekt
  2. Konsumtion sedan början av dagen
  3. Konsumtion sedan början av månaden
  4. Andel nattkonsumtion i %

Dessutom måste enheten överföra, till en konfigurerbar internetadress, förbrukningsdata för de senaste 24 timmarna, i form av 24 avläsningar. Sändningsintervall — inställt i minuter 1…120.

Parametrar inställda i menyn:

  1. Timme i RTC
  2. Minute i RTC
  3. Dag på RTC
  4. Månad i RTC
  5. År på RTC
  6. Räkneintervall 1…120
  7. nätverksadress som indikerar positionstecken: "a-z0-9_-/: ". Teckenet som redigeras måste markeras så att det är tydligt vad som redigeras.

Den ursprungliga versionen av enheten kommer att göras baserat på följande uppsättning moduler:

  1. (förtydligande angående anslutningen av indikatorn till mega 2560)

Apparaten är av intresse för att klargöra hur mycket verkstaden, mediaapparater, köksredskap förbrukar. Som ett resultat måste du få data i form av grafer, på Internet eller på en lokal nätverksserver ()

Det initiala anslutningsschemat för mätnoden.

Jag lånade schemat för att mäta effekt och spänning. Den genomsnittliga effekten beaktas, och inte bara många andra parametrar, såsom frekvens, effektfaktor. Först måste du montera ett så litet stativ för mätning.

Jag tar en brödbräda, letar efter en lämplig transformator för att mäta spänningen (jag tar den från ATX-tjänstrummet), och går vidare.

UPD. Mätenhet

Del 2.1 Anteckningar om de fantastiska funktionerna hos ENC28J60

Underbar sak. Idag började jag gräva en modul för att arbeta med ezernet, för "räknaren"-projektet. Vem skulle ha tvivlat, det var kul, och allt löste sig till slut.

Genom anslutning. Vi letar var vi kan hitta SPI-gränssnittet med Arduino "Mega", ja, eller ditt. Vi ansluter. Vi hänger CS-utgången (chipval) var vi vill, den ställs sedan in separat i biblioteksinitieringen. Jag "hängde" den på 42:a stiftet, du kanske har någon annan. De återstående MOSI / MISO / SS / OV / 3.3V är anslutna till motsvarande Arduino-stift.

Det visade sig att för att minska minnesanvändningen bestämde sig utvecklaren för det "underbara" EtherCard-biblioteket och skickade några strängar för en GET-förfrågan till programmets minne. Det vill säga tänk dig att en frilansande programmerare plötsligt bestämde sig för att göra sig själv till en disk. För att göra allt smart, bestämde han sig för att redigera URL-raden dit data skickas dit. Och gjorde även detta idag:

Och så ansluter han biblioteket och tror att han nu enkelt kommer att göra en förfrågan till en extern server. Ett nej. Trots allt satte han servern som en sträng. En sträng är tyvärr inte programminne. Harvard arkitektur. Allt är delat.

Ingenting, jag klättrade snabbt in i biblioteket, hittade platsen där förfrågan fylldes i, förvrängde den, tog bort allt "extra" enligt min mening, förstås. I slutändan fungerar allt utmärkt.

Jag bifogar ett bibliotek och ett exempel på att arbeta med en server som fungerar för strängar. och inte bara för oföränderliga värden i programmet. Tillsammans med ett exempel -

Under projektets gång återstår bara att lösa problemet med mätdelen, allt annat är redan löst. Det svåraste i programmet var att redigera URL-strängen.

Anslutningsfunktionen är bara DHCP, jag tänker inte göra statiska ip- och urvalsuppgifter, allt fungerar helt korrekt och det finns ingen anledning att lägga till funktionalitet som jag inte behöver.

Del 3. Inledande felsökning av räknarprogramvaran

Idag pysslade jag lite med att felsöka räknarens programvara. Faktum är att jag inte av misstag installerade ett nedtrappningsmotstånd, för mycket spänning penetrerade CT-sensorn och som ett resultat trängde för mycket brus in i ingången. Korrigerad, lödd 150 ohm parallellt med ST-sensorn, i allmänhet kom ca 100 ohm ut.

Jag var tvungen att korrigera koefficienterna något i programmet Jag justerade ... enligt den kinesiska räknaren. Sen på en voltmeter. Fick det så nära som möjligt.

Som ett resultat visade mätning av EH-förbrukningen för att koka vattenkokaren samma sak som på den kinesiska wattmätaren. Det är redan bra, men jag måste kolla på huvuddisken på något sätt.

Bokstaven h efter kW fick inte plats på displayen, men det ska förstås att den finns där. Siffran visar förbrukningen sedan början av den aktuella timmen. I slutet av timmen skickas den till servern och nollställs. Då kommer jag förmodligen att återställa den en gång om dagen.

Räknarprogramvara, i sin nuvarande form -

Del 4. Att göra den första delen av kroppen

Jag gjorde ett fodral idag, materialet är detsamma som förra gången - 11 mm caprolon. Fästning är sant på M4 imbusskruvar, förra gången var det M3 överallt. Det är för svagt för kroppen.

För skala, sätt musen "luft" inuti.

Det återstår att göra frontpanelen, fixa modulerna, göra fräsning för USB och 12V ström. I fallet med den här enheten kommer förmodligen 0,7A att räcka, det vill säga något litet kan användas.

Del 5 Tillverkning av frontpanelen

Del 9. Uppdaterad programvara, baserad på resultatet av enhetens drift

Under operationen i ungefär en månad kom jag till slutsatsen att det är nödvändigt att lägga till överföringen av den nuvarande förbrukade kraften, först i månaden. Dessutom flyttade jag insamlingswebbservern in i mitt subnät och slutade överföra data utanför. För vissa klarade sig inte. Således har tillförlitligheten för datainsamling ökat. Tja, faktiskt, här är den senaste firmware - .

Uppdaterad 2015-09-23. Idag skrev jag ett gränssnitt för visning av övervakningsdata. Samtidigt optimerade jag firmwaren, hittade fel i den. Jag höjde den interna DNS-servern, på "" är detta en fråga om minuter.

Visade precis de senaste 48 timmarna (jag tappade statistiken, så det är mindre på diagrammet) i form av ett utjämnat diagram. Splash är början på tvättmaskinen, enligt U - priset i hryvnian för den aktuella timmen, med hänsyn till nattpriset, naturligtvis. Med X — datum/tid.

Nu kan vi ta en titt på vad som händer. En liten nyans - jag placerade allt på hemnätverket, för större stabilitet.

Jag skrev redan tidigare att jag provade en standardprogramvara för att visa förbrukningen av elektriker (emoncms). Jag förstår inte paradigmet och tillvägagångssättet. Där skickar den var tredje sekund data till servern och visar något. Jag gjorde det annorlunda - enheten samlar data i 1 timme och skickar den sedan för de senaste 24 timmarna. Webbservern är inte igång, det är en lågeffekts NAS.

UPD. Det visade sig att det här inte är internet jag har, den här enheten överför ibland inte data. Det är inte klart vad som hänger ihop med, och det är svårt att fånga, så jag gick åt andra hållet - genom att beräkna mellanvärden utifrån den aktuella förbrukningen. För en dag någonstans 1-2 gånger är det ett misslyckande. Detta schema låter dig vägra lagra timdata i sin bransch, vilket inte heller fungerar helt korrekt av någon anledning.

UPD. Slutförde en del mjukvara för webbplatsen som visar data. Nu finns det en spänning per timme, tim- och dagliga kostnader.

Jag funderar på att hosta programvaran på github. Kanske. så blir det.