Verschil in resultaat verklaren

Arduino specifieke Software
Gebruikers-avatar
Berichten: 39
Geregistreerd: 09 Jan 2015, 15:09

Verschil in resultaat verklaren

Berichtdoor hv0805 » 04 Okt 2019, 13:04

Tav Shooter.
Ik had reeds een vraag gesteld via Engeltalig Forum (https://forum.arduino.cc/index.php?PHPSESSID=c2n7vqns4s8teol29hbnt9dbr2&topic=638792.0)

Ben intussen vanaf nul begonnen en vond volgende info om het AnalogRead sneller te maken.http://www.optiloading.be/willem/Arduino/speeding.pdf. Dit vertaald zich in het programma als volgt.

Het verhoogt de inlees snelheid van de analog inputs aanzienlijk.

Code: Alles selecteren
// *************   Speedup the analogRead() function  **************
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// *************   Speedup the analogRead() function  **************


void setup()
{
  // *************   Speedup the analogRead() function  **************
  // Prescale ADPS2 ADPS1 ADPS0 Clock freq (MHz) Sampling rate(KHz)
  //     2      0      0     1       8               615
  sbi (ADCSRA, ADPS2) ;
  cbi (ADCSRA, ADPS1) ;
  cbi (ADCSRA, ADPS0) ;
  // *************   Speedup the analogRead() function  **************

  Serial.begin(115200);
}


Heb dit nu toegepast in mijn (test) programma en kom tot rare resultaten.
Dit is mijn code:
Code: Alles selecteren
// *************   Speedup the analogRead() function  **************
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// *************   Speedup the analogRead() function  **************

const unsigned int numReadings = 100;
unsigned int analogVals[numReadings];
unsigned int i = 0;

void setup()
{
  // *************   Speedup the analogRead() function  **************
  // Prescale ADPS2 ADPS1 ADPS0 Clock freq (MHz) Sampling rate(KHz)
  //     2      0      0     1       8               615
  sbi (ADCSRA, ADPS2) ;
  cbi (ADCSRA, ADPS1) ;
  cbi (ADCSRA, ADPS0) ;
  // *************   Speedup the analogRead() function  **************

  Serial.begin(115200);
}

void loop()
{
  arrayVullen();
  arrayPrinten();
}

void arrayVullen()
{
  for (i = 0; i < numReadings; i++)
  {
    analogVals[i] = analogRead(A0);
    //     Serial.print(analogVals[i]);
    //     Serial.print(",");
  }
  //  Serial.println();
}

void arrayPrinten()
{
  for (i = 0; i < numReadings; i++)
  {
    Serial.print(analogVals[i]);
    Serial.print(",");
  }
  Serial.println();
}


Als ik nu in de loop arrayPrinten() in commentaar zet en de resultaten laat uitprinten in de functie arrayVullen() (eerst de commentaar lijnen // terug actief zetten) krijg ik het resultaat in de console.

Deze lijn copieer ik in Excell en maak hiermee een grafiek om het resultaat te zien (een sinus, wat de input is).
res1.jpg
res1.jpg (35.68 KiB) 265 keer bekeken


Laat ik echter de array uitprinten via de functie in de loop() (dus daar commentaar weghalen en commentaar zetten in arrayVullen() voor de Serial.print dan krijg ik dit resultaat (geen sinus meer, wat wel degelijk de input is) .
res2.jpg
res2.jpg (33.04 KiB) 265 keer bekeken
.

De vraag: Waarom???

Dank U

Herman

Advertisement

Gebruikers-avatar
Berichten: 2192
Geregistreerd: 06 Aug 2016, 01:03

Re: Verschil in resultaat verklaren

Berichtdoor Koepel » 04 Okt 2019, 20:22

Eén kanaal, dat is één waarde per regel zonder komma en met een cr-lf achteraan.

Code: Alles selecteren
void arrayPrinten()
{
  for (i = 0; i < numReadings; i++)
  {
    Serial.println(analogVals[i]);
  }
}


De vraag waarom het op een vreemde manier mis gaat vind ik niet interessant. Zorg dat het in orde is.

Gebruikers-avatar
Berichten: 39
Geregistreerd: 09 Jan 2015, 15:09

Re: Verschil in resultaat verklaren

Berichtdoor hv0805 » 05 Okt 2019, 10:48

Koepel,
Als je goed kijkt naar de code zal je zien dat er maar één kanaal gelezen wordt A0. Als ik graag de waarde achter elkaar laat zien met een comma ertussen is dat toch mijn probleem. Ik wil gewoon weten of wat er in de array gelezen wordt ook de waarden van het signaal bevatten. Ik heb nadien enkel de min en max waarde nodig. Het uitprinten is gewoon ter controle, als alles goed is moet ik niks meer uitprinten. Blijft de vraag waarom worden er 2 verschillende waarden uitgeprint?

Herman

Gebruikers-avatar
Berichten: 39
Geregistreerd: 09 Jan 2015, 15:09

Re: Verschil in resultaat verklaren

Berichtdoor hv0805 » 05 Okt 2019, 11:18

Ik heb het probleem gevonden.
Als ik GEEN Serial.print instructie geef is de loop gewoon te snel en zijn de 100 waarden (numReadings = 100) te vlug ingelezen.
In de loop zet ik nu een delay(1) van 1 mircoseconde en nu werkt alles zoals het zou moeten.

Code: Alles selecteren
void arrayVullen()
{
  for (i = 0; i < numReadings; i++)
  {
    analogVals[i] = analogRead(A0);
     //    Serial.print(analogVals[i]);
     //    Serial.print(",");
     delay(1);
  }
  // Serial.println();

}

Gebruikers-avatar
Berichten: 2192
Geregistreerd: 06 Aug 2016, 01:03

Re: Verschil in resultaat verklaren

Berichtdoor Koepel » 05 Okt 2019, 15:45

Oeps, sorry :oops:
Ik dacht dat je een grafiek in de seriële plotter van Arduino wilde laten zien. Uit de sketch zelf bleek het probleem niet.

Een delay(1) is 1 milliseconde.

Die link naar het pdf-bestand die heeft ook de mogelijkheid om een timer te gebruiken met een interrupt en in de interrupt het register van de analoge waarde lezen. Dat is eigenlijk de normale situatie voor een microcontroller zonder Arduino.

Ik heb mijn twijfels over een millis() timer voor 1ms. Die 1ms is niet nauwkeurig. Bij 10ms is het redelijk.

Kun je beschrijven wat de bedoeling is ?

Er zijn 6 analoge kanalen. Daar worden een tiental samples van genomen met een interval van 1 milliseconde (dat wordt lastig). Die 6 kanalen worden achter elkaar of tegelijkertijd gesampled. De opname van het signaal van een analoge ingang is maar heel kort, daarna gebeurt er een hele tijd niets. In die tijd wordt het verstuurd via de seriële poort. De volgende seconde begint het opnieuw.

Berichten: 2901
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Verschil in resultaat verklaren

Berichtdoor shooter » 06 Okt 2019, 14:33

serieel duurt veel te lang voor jouw snelle analog poort, dus eerst de waardes ophalen en daarna pas printen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 39
Geregistreerd: 09 Jan 2015, 15:09

Re: Verschil in resultaat verklaren

Berichtdoor hv0805 » 07 Okt 2019, 09:35

Koepel,

Ik ben bezig met de vermogens van enkele stroomkringen in de woning te monitoren. (kwestie van bezig te blijven nu ik met pensioen ben). Ik heb het idee van https://openenergymonitor.org/. Aangezien ik niet zo graag alles letterlijk copieer, bouw ik het met eigen middelen en kennis (soms komt ik daar een beetje te kort). De spanning en stroom uitlezen lukt. Al is het nog zoeken naar de juiste factor.
Ik meet de sinuswaarden van spanning (via 12v AC transfo) en stroom (via een CT sensor https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/yhdc-sct-013-000-ct-sensor-report#yhdc-sct-013-000-current-transformer). Daarvan bepaal ik de Max en Min waarde en heb dus het verschil tussen deze 2. Aan de hand van deze waarden (bv 170) weet ik dus dat 238v AC spanning (ik lig kort bij een hoogspanningscabine, vandaar dat de netspanning behoorlijk hoog is thuis) overeenkomt met 170. Mijn spanningsfactor is dus 170/238.
Hetzelfde doe ik voor de stroommeting.
Alleen is het nog een beetje zoeken naar de juiste factoren, vooral de stroom schommelt nogal in de meting.
Wat kan ik het best gebruiken om de stroom te ijken? ik gebruik nu 2 gloeilampen van 40W, maar hoe ben ik er zeker van dat die effectief 40 watt verbruiken? Een weerstand van een gloeilamp schommelt sterk naargelang ze opwarmt.
Voorlopig laat ik alles zien in de console, de bedoeling is dat alles doorgestuurd wordt naar een webserver (enkel de verschillen tussen Min en Max per kanaal) en ik verder via PHP en javascript hier een website rond bouw.
Ik heb nu reeds een webserver op Raspberry waar de waarden per 30min terug te vinden zijn van verbruik van leidingwater, regenwater, gas en elec.

Herman

Gebruikers-avatar
Berichten: 2192
Geregistreerd: 06 Aug 2016, 01:03

Re: Verschil in resultaat verklaren

Berichtdoor Koepel » 08 Okt 2019, 04:15

Als de stroom schommelt, dan kan dat komen door de manier waarop je de samples neemt met analogRead().
Het kan ook komen omdat er iets inductief in de buurt van de CT-transformator zit.
Heb je een "burden" weerstand bij de CT-transformator ? Ik weet niet beter dan dat de meting pas nauwkeurig is met een "burden" weerstand.

Gelukkig heb je geen ACS712, die meet de stroom met een Hall-sensor, en die pikt allerlei inductieve storing op.

De OpenEneryMonitor is een mooi project. Dat kun je niet zomaar even nadoen.

Een gloeilamp komt redelijk in de buurt van een ohmse weerstand. Heb je een multimeter met een wisselstroom stand ?

Gebruikers-avatar
Berichten: 4961
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Verschil in resultaat verklaren

Berichtdoor nicoverduin » 08 Okt 2019, 08:42

Burden weerstand is gewoon een belasting weerstand. je moet de trafo belasten om een juiste meting te krijgen. Onbelast zijn de metingen altijd te hoog.

edit:
Je kan ook de stroom meten door de uitgangstrafo af te vlakken met een bruggelijkrichter. Die vervolgens goed afvlakken en een smoorspoeltje ipv een series weerstand. Hierdoor filter je gelijk een heleboel rommel die op het lichtnet zit van allerlei schakelende voedingen in huis.
Daarna met een goede stroom tang en spanningsmeter de zaak ijken omdat je een correctie moet maken in de formule vanwege de spanningsval over de diodes. als over de interne weerstand van de transformator (het koperdraad).
Tenslotte zou je nog gebruik kunnen maken van een voortschrijdend gemiddelde (zie: https://github.com/nicoverduin/MovingAverage) waardoor je eventuele korte schommelingen uit metingen haalt.

Een ander alternatief is bijvoorbeeld een hele kleine weerstand (in de milliohms) in serie zetten met de stroom. Via een ADC, optokoppelaars en een galvanisch gescheiden voeding (waardoor de meting rechtstreeks aan de HV zit terwijl de meting naar TTL levels gaat met 2-4Kv lucht scheiding). Dit is in feite de mooiste oplossing maar kost wel wat uitzoek werk. Ik heb die truuk jarenlang toegepast voor het meten van stroom (tot 1A) in 400-500V anode leidingen in buizenversterkers.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 39
Geregistreerd: 09 Jan 2015, 15:09

Re: Verschil in resultaat verklaren

Berichtdoor hv0805 » 08 Okt 2019, 09:04

Nico, dank voor de info. Kan je hiervan eens een tekening maken? Ik weet niet juist wat je bedoeld met dat spoeltje.
Ik heb een Fluke 77 series 2 meter. Alleen bij de stroom meting op 10a stand staat het display op 0.07 als er niets aanhangt. Trek ik die waarde dan af van het gemeten resultaat. Bv een gloeilamp geeft als stroom op display 1.4 A in werkelijkheid zou dit dan 1.33A zijn. Klopt dit?
Herman

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: jean-paul en 0 gasten