Kirjoittaja Aihe: arduino pwm  (Luettu 4663 kertaa)

Poissa Scroll

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 2437
Vs: arduino pwm
« Vastaus #45 : 08.06.18 - klo:16:18 »
En tunne Arduinoa, mutta pikagooglaus väittää mm. näin:

Juu, osassa kirjastoja on käytetty C++:aa totta, mutta tuo ehdottamasi koodirakenne ei suoritu sellaisenaan Processing ympäristössä.

Tottahan Arskan kääntäjä C++:n konekieleksi vääntää koska viimekädessä prosessori ei tiedä mitä se koodi on alunperin ollut.

Koodissasi on kuitenkin pakko olla tiettyjä Processing-ohjelmointialustan elementtejä, muuten se ei suoritu. Nyt siitä puuttuu ne, mm. main() funktio. Vai oliko tuo vain osa siitä koodista?

Miten ajattelit toteuttaa tämän ehdotuksesi: "Voit myös halutessasi muuttaa calcIrms laskennan ns. rinnakkaiseksi."
alan amatihenkilö

Poissa repomies

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 7072
Vs: arduino pwm
« Vastaus #46 : 08.06.18 - klo:17:10 »
Juu, osassa kirjastoja on käytetty C++:aa totta, mutta tuo ehdottamasi koodirakenne ei suoritu sellaisenaan Processing ympäristössä.
Tottahan Arskan kääntäjä C++:n konekieleksi vääntää koska viimekädessä prosessori ei tiedä mitä se koodi on alunperin ollut.
Miten ajattelit toteuttaa tämän ehdotuksesi: "Voit myös halutessasi muuttaa calcIrms laskennan ns. rinnakkaiseksi."

tj86430 ei väittänyt mitään aiheesta "ns. rinnakkaiseksi." vaan sen teki nimimerkki mk. Ja tuosta noin aika äkkiä kyllä näkee että ajatuksena on muuttaa emon librarya siten että se käpistelee kerralla useampaa pinniä, sen sijaan että tehtäisiin useampi emon-instanssi ja kutsutaan erikseen jokaista instanssia odotellen. TÄLLÄ on ehkä jo merkittävä vaikutus suoritusaikoihin, toisin kuin if-siistinnällä. Sittenkin voi olla että eniten tulisi nopeutta lisää parantamalla analog readien nopeutta nostamalla ADC kelloa. Mutta lisättäköön ettei minun mielestäni jollan kannata vieläkään lähteä optimoimaan nopeutta ellei ole havaittua suorituskykyongelmaa.
« Viimeksi muokattu: 08.06.18 - klo:21:24 kirjoittanut Samppa »
AIT PWZSV9 MLP, Fujitsu AWY17 ILP, OKT 165/198m2 Pirkkala (sekä 3x Chunlan mökeillä)

Poissa mk

  • Konkari
  • ****
  • Viestejä: 620
Vs: arduino pwm
« Vastaus #47 : 09.06.18 - klo:15:56 »
Pari virhettä löytyi.
Esim. taulukkomuuttujan alustus vaatii aaltosulut.

Lisäsin funktion calcIarv8.
(Average Rectified Values)
Sisäinen looppi ei sisällä liukulukuja.
Sisäisen summan tyyppi on long joten pari miljoonaa näytettä mahtuu.
Vastaavan tyylinen Irms kestää sekin yli 10000 näytettä.
Float/long suoritusnopeuksien eroista en osaa sanoa, jossain oli jotenkin testattu, ettei suuria eroja olisi.

Funktio ei palauta arvoa.
Tuotokset löytyy Iarv8[] muuttujasta.
Alustus kuten aiemmin.

Arvo on keskiarvo * muuntosuhde * tarkkuus

Esim.
Setuppiin
...
emon.current8Reset();
emon.current8(1, 5, 68);
emon.current8(2, 6, 68);
emon.current8(3, 9, 68);

Looppiin
...
emon.calcIarv8(1480);
...
Serial.print(emon.Iarv8[1]);
Serial.print(" ");
Serial.print(emon.Iarv8[2]);
Serial.print(" ");
Serial.print(emon.Iarv8[3]);
Serial.print(" ");

Poissa repomies

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 7072
Vs: arduino pwm
« Vastaus #48 : 10.06.18 - klo:21:02 »
Mk, vaikka sinänsä voikin olla fiksua lukaista kaikki virtatiedot kerralla, jollan ei välttämättä kannata lähteä kuitenkaan pelkästä optimoinnin ilosta laittamaan enempi vähempi kehitysasteella olevaa koodia ns. tuotantoon, kun kuulemma sen 100ms viiveen lisäys looppiin ei toimintaa muuta mihinkään. Nopeus ei nyt ole se tärkein juttu vaan laskennan virheettömyys tuossa virtojen muuttamisessa pwm-ohjauksiksi. Nykyisessä kuosissaan se emon-kirjasto on kuitenkin aika laajalti koeponnistettu ja siten todennäköisesti melko vähäbuginen. Sanoisin että jos se ei ole rikki, ei kannata koskea. KISS-periaatteella vaan eteenpäin.

Sinänsä tuo kontribuutiosi vaikuttaa ihan ok suunnalta. Ehkä voisit tehdä siitä patchin ja viskata sen emon-kirjaston kehittäjille arvioitavaksi.
AIT PWZSV9 MLP, Fujitsu AWY17 ILP, OKT 165/198m2 Pirkkala (sekä 3x Chunlan mökeillä)

Poissa mk

  • Konkari
  • ****
  • Viestejä: 620
Vs: arduino pwm
« Vastaus #49 : 13.06.18 - klo:12:38 »
Toki näin.

Edellinen yritys oli vielä aivan täysin testaamatta.
Tämä nykyinen on sentään käännetty onnistuneesti.
(Uno R3 löytyy myös, kun löytyy)

Tekelehän on ihan vaan mielenkiinnosta, jos sitä siis on.

calcIarv8 vaihtui muotoon calcI88, joka tuottaa molemmat arvot ilman liukulukuja.
Säädettävä filtteri tuli myös matkaan, jonka arvo on kaikille mittauksille sama.
Palautuvat arvot on n/1024 murtolukuja, kokonaisosa siten n>>10 ja murto-osa n&1023.

Käyttö:
current8Reset(max ADC muutosnopeus per 2 mittausta) // pinnit nollautuu samalla
current8(pinnin indeksi, pinni, kalibrointi)
calcIrms8(Number_of_Samples) // arvot Irms8[]
calcI88(Number_of_Samples) // arvot Irms88[] ja Iarv88[]


Poissa jolla

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 2652
Vs: arduino pwm
« Vastaus #50 : 10.09.18 - klo:10:16 »
jetti&mopokelit on nyt ilmeisesti takanapäin ja kehittelen edelleen paremmaksi tuota paneleilta>varaajaan systeemiä

ongelma on että että tehon kasvaessa virta muuttuu senverran huonoksi mk2pvrouter systeemissä, mikä tällähetkellä on penkissä, että etenkin hybridi ajaa tehonsa pahimmassa välkkymisvaiheessa osittain alaspäin, pahimmillaan miltei kokonaan, toiminta on kuitenkin mahdollista kun manuaalisesti kytkimistä lisää kuormaa tai oikeasti triacilla potikasta väännän sopivan kuorman, silloin ei ongelmia suuremmillakaan kuormilla

joten onko seuraava koodi käyttökelpoinen, miten se oikeaoppisesti pitää laittaa kun haluan ensin pin7 ylös ja sitten pin7+pin8 ylös ettei tuossa ensimmäisessä tilanteessa pin8 jää ylös ja ensimmäisen arvon alittuessa molemmat ovat alhaalla, tää ajatuksen juoksun taso on taas tällä hetkellä nyt vaan tätä

Koodia: [Valitse]
   if ((realPower >= 1700) && (realPower < 3400))
    {
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin7, LOW);
    }
    if ((realPower >= 3400) && (realPower < 6000))
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin8, LOW);
    } 

~kilowatin teholla mk2pv dataa sähkömittarista
8.0
7.8
2.1
20.8
7.3
13.7
9.3
5.4
-23.4
18.0
4.3
9.5
-0.5
24.5
36.9
21.4
-2.1
8.1
4.4
-3.2
7.4
-1.1
-4.1
11.9
-1.8
-3.8
25.8
-3.5
« Viimeksi muokattu: 10.09.18 - klo:10:38 kirjoittanut jolla »

Poissa repomies

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 7072
Vs: arduino pwm
« Vastaus #51 : 10.09.18 - klo:12:36 »
Tuo data näyttää heiluvan niin paljon ettei siitä muutaman sekunnin vilkaisulla viisastu.

Koodi on hankalalukuista koska sisennyksiä ei ole käytetty, mutta näyttää olevan kaksi erillistä if-else lauseketta joiden molempien ajon jälkeen vasta näkee mitkä on outputtien tilat. Toisinaan on selkeämpää tehdä niin, että vain yksi lohko ajetaan eli jatkaa if () {} else if () {} else if() {}.. jolloin vain yksi lohko suoritetaan. Siinä pitää sitten asetella kaikki hipelöitävät muuttujat.

Minusta näyttää että realpowerin ollessa alle 1700 taikka suurempi tai yhtä suuri kuin 6000 niin ajetaan molemmat else-haarat, ja molemmat outputit on LOW.

Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.

Toivottavasti tuo oli myös mitä yritit. Itse olisin kirjoitellut if-else-if-else ketjuna jossa joka lohkossa asetetaan molemmat outputit ja if-ehdot kattavat koko realpowerin lukualueen ilman päällekkäisyyttä.
AIT PWZSV9 MLP, Fujitsu AWY17 ILP, OKT 165/198m2 Pirkkala (sekä 3x Chunlan mökeillä)

Poissa jolla

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 2652
Vs: arduino pwm
« Vastaus #52 : 10.09.18 - klo:12:51 »
Tuo data näyttää heiluvan niin paljon ettei siitä muutaman sekunnin vilkaisulla viisastu.

Koodi on hankalalukuista koska sisennyksiä ei ole käytetty, mutta näyttää olevan kaksi erillistä if-else lauseketta joiden molempien ajon jälkeen vasta näkee mitkä on outputtien tilat. Toisinaan on selkeämpää tehdä niin, että vain yksi lohko ajetaan eli jatkaa if () {} else if () {} else if() {}.. jolloin vain yksi lohko suoritetaan. Siinä pitää sitten asetella kaikki hipelöitävät muuttujat.

Minusta näyttää että realpowerin ollessa alle 1700 taikka suurempi tai yhtä suuri kuin 6000 niin ajetaan molemmat else-haarat, ja molemmat outputit on LOW.

Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.

Toivottavasti tuo oli myös mitä yritit. Itse olisin kirjoitellut if-else-if-else ketjuna jossa joka lohkossa asetetaan molemmat outputit ja if-ehdot kattavat koko realpowerin lukualueen ilman päällekkäisyyttä.

tätä haen
Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.
ja alle 1700 molemmat LOW

sähkömittarin datalla ei tähän ole merkitystä, laitoin vain kuinka mk2pv hoitelee hommansa.....ihan hyvin

koko arduinon, joka ohjaa on/off ssr,  koodi on
Koodia: [Valitse]
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3

#include "EmonLib.h"             // Include Emon Library
EnergyMonitor emon1;             // Create an instance
int upPin7 = 7;
int upPin8 = 8;

void setup()
{
  pinMode(upPin7,OUTPUT);
  pinMode(upPin8,OUTPUT); 
  Serial.begin(9600);
 
  emon1.voltage(2, 234.26, 1.7);  // Voltage: input pin, calibration, phase_shift
  emon1.current(1, 14.0);       // Current: input pin, calibration.
}

void loop()
{
  emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
  emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
 
  float realPower       = emon1.realPower;        //extract Real Power into variable
  float apparentPower   = emon1.apparentPower;    //extract Apparent Power into variable
  float powerFActor     = emon1.powerFactor;      //extract Power Factor into Variable
  float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable
  float Irms            = emon1.Irms;             //extract Irms into Variable
 
    if ((realPower >= 1700) && (realPower < 3400))
    {
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin7, LOW);
    }
 /*   if ((realPower >= 3400) && (realPower < 6000))
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin8, LOW);
    digitalWrite(upPin7, LOW);
    }
  */ 
}

tällä pääsee ilman ongelmia 3400 saakka

Poissa repomies

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 7072
Vs: arduino pwm
« Vastaus #53 : 10.09.18 - klo:13:03 »
No sitten se kai pelaa. Toivottavasti ei haittaa että realpowerin lipsahtaessa arvoon 6000 tai enemmän, molemmat outputit putoaa alas.

Sellainen kommentti vielä että tuolla välillä 3400-6000 se pin7 räpsähtää ensin alas ihan mikroskooppiseksi ajaksi kunnes tuo jälkimmäinen if-lauseke ajetaan ja se nostaa sen ylös. Nyt riippuen siitä mitä tehdään tämän jälkeen se joko on ongelma tai ei ole. Jos noita iffejä ajetaan tiukassa loopissa niin se räpsyy ylös-alas jatkuvasti tuolla välillä. Eli tee se if-else-if-else ketju kuten ehdotin niin tätä ei tapahdu. Voin toki illemmalla näyttää miten, jos harjoitus ei suju.
AIT PWZSV9 MLP, Fujitsu AWY17 ILP, OKT 165/198m2 Pirkkala (sekä 3x Chunlan mökeillä)

Poissa mk

  • Konkari
  • ****
  • Viestejä: 620
Vs: arduino pwm
« Vastaus #54 : 10.09.18 - klo:14:04 »
tätä haen
Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.
ja alle 1700 molemmat LOW

Yli 6000 on määrittelemättä.

Koodia: [Valitse]
if (realPower < 1700)
{
  digitalWrite(upPin7, LOW);
  digitalWrite(upPin8, LOW);
}
else
{
  digitalWrite(upPin7, HIGH);
  if (realPower >= 3400)
    digitalWrite(upPin8, HIGH);
}

Poissa jolla

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 2652
Vs: arduino pwm
« Vastaus #55 : 10.09.18 - klo:14:18 »
No sitten se kai pelaa. Toivottavasti ei haittaa että realpowerin lipsahtaessa arvoon 6000 tai enemmän, molemmat outputit putoaa alas.

Sellainen kommentti vielä että tuolla välillä 3400-6000 se pin7 räpsähtää ensin alas ihan mikroskooppiseksi ajaksi kunnes tuo jälkimmäinen if-lauseke ajetaan ja se nostaa sen ylös. Nyt riippuen siitä mitä tehdään tämän jälkeen se joko on ongelma tai ei ole. Jos noita iffejä ajetaan tiukassa loopissa niin se räpsyy ylös-alas jatkuvasti tuolla välillä. Eli tee se if-else-if-else ketju kuten ehdotin niin tätä ei tapahdu. Voin toki illemmalla näyttää miten, jos harjoitus ei suju.

oli 6000vähän, mutta tällä näyttäis ylämäkeen menevän muttaa ei osaa tiputtaa lukeman pienentyessä

edit
vaihdoin tähän toimivan koodin, tällä pelaa

Koodia: [Valitse]
    if ((realPower >= 1700) && (realPower < 3400))
    {
    digitalWrite(upPin7, HIGH);
    digitalWrite(upPin8, LOW);
    }
    else if ((realPower >= 3400) && (realPower < 4300))
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, LOW);
    }
    else if ((realPower >= 4300) && (realPower < 8000))
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin8, LOW);
    digitalWrite(upPin7, LOW);
    } 
« Viimeksi muokattu: 10.09.18 - klo:15:00 kirjoittanut jolla »

Poissa repomies

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 7072
Vs: arduino pwm
« Vastaus #56 : 10.09.18 - klo:14:25 »
Ei varmaan koska laitoit alueita päällekäisiksi, mitä kehoitin jo varomaan. Tuo if-ehto 3400-8000 sisältää alueen 4300-8000 joten sitä jälkimmäistä ei ajeta, else-haaraan ei mennä.

Älä tee päällekäisiä if-ehtoja. Aseta molemmat outputit jokaisen noiden {} -blokkien sisällä. Näin tulee simppeli ja luettavampi ratkaisu.
AIT PWZSV9 MLP, Fujitsu AWY17 ILP, OKT 165/198m2 Pirkkala (sekä 3x Chunlan mökeillä)

Poissa jolla

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 2652
Vs: arduino pwm
« Vastaus #57 : 10.09.18 - klo:14:29 »
Ei varmaan koska laitoit alueita päällekäisiksi, mitä kehoitin jo varomaan. Tuo if-ehto 3400-8000 sisältää alueen 4300-8000 joten sitä jälkimmäistä ei ajeta, else-haaraan ei mennä.

Älä tee päällekäisiä if-ehtoja. Aseta molemmat outputit jokaisen noiden {} -blokkien sisällä. Näin tulee simppeli ja luettavampi ratkaisu.

kiitos, nyt lähti toimimaan , 8000 oli kahteen kertaan ja molemmat pinnit piti määritellä eikä vain toista, muuten jäi HIGH

sopivasti aurinkokin piikitti liki 7k eikä mitään valojen välähtelyjä kun mk2pv hoitelee vain hienosäädön ja toinen arduino hoitelee karkeasäädön ssr kanssa

kiitos avusta

Poissa repomies

  • Lämpöpumppuaktiivinen
  • *****
  • Viestejä: 7072
Vs: arduino pwm
« Vastaus #58 : 10.09.18 - klo:14:30 »
Yli 6000 on määrittelemättä.

Koodia: [Valitse]
if (realPower < 1700)
{
  digitalWrite(upPin7, LOW);
  digitalWrite(upPin8, LOW);
}
else
{
  digitalWrite(upPin7, HIGH);
  if (realPower >= 3400)
    digitalWrite(upPin8, HIGH);
}

Tuokaan ei pudota outputtia alas oikein kun realpower alkaa laskea. Laittaa nyt vaan ne molemmat outputit jokaiseen if-ehtoon ja niin että ehtojen alueet eivät mene päällekäin, ja ketjuttaa if-elsenä..
AIT PWZSV9 MLP, Fujitsu AWY17 ILP, OKT 165/198m2 Pirkkala (sekä 3x Chunlan mökeillä)

Poissa mk

  • Konkari
  • ****
  • Viestejä: 620
Vs: arduino pwm
« Vastaus #59 : 10.09.18 - klo:14:48 »
Aivan.

Koodia: [Valitse]
if (realPower < 1700)
{
  digitalWrite(upPin7, LOW);
  digitalWrite(upPin8, LOW);
}
else
{
  digitalWrite(upPin7, HIGH);
  if (realPower >= 3400)
    digitalWrite(upPin8, HIGH);
  else
    digitalWrite(upPin8, LOW);
}

7 low < 1700 > high
8 low < 3400 > high