From 8d7fb39c4650399ae237e7b991010d4c0da76bb5 Mon Sep 17 00:00:00 2001 From: Christian Zufferey Date: Mon, 16 Sep 2019 19:25:39 +0200 Subject: [PATCH] =?UTF-8?q?L=C3=A0,=20j'ai=20vachement=20bien=20simplifi?= =?UTF-8?q?=C3=A9=20le=20calcul=20de=20l'offset=20et=20du=20coup=20am?= =?UTF-8?q?=C3=A9lior=C3=A9=20la=20stabilit=C3=A9=20de=20la=20mesure=20:-)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mesures/solar_pv_energy/0_get_data.lua | 29 +++----- .../0_get_data.lua.190916.1911 | 66 +++++++++++++++++++ 2 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 Mesures/solar_pv_energy/0_get_data.lua.190916.1911 diff --git a/Mesures/solar_pv_energy/0_get_data.lua b/Mesures/solar_pv_energy/0_get_data.lua index c4fed64..a5a0a37 100644 --- a/Mesures/solar_pv_energy/0_get_data.lua +++ b/Mesures/solar_pv_energy/0_get_data.lua @@ -1,6 +1,6 @@ -- Lit le convertisseur ADC connecté sur le transformateur de courant -- pour mesurer le courant électrique de l'installation PV -print("\n 0_get_data.lua zf190916.1904 \n") +print("\n 0_get_data.lua zf190916.1925 \n") -- Astuce de mesure: -- au lieu de découper la sinusoïde en 100 parties, c'est à dire toutes @@ -13,13 +13,12 @@ print("\n 0_get_data.lua zf190916.1904 \n") -- quelque soit sa forme ! -- On le somme sur 2.1 secondes avec une moyenne glissante sur 3 valeurs -zadc_offset=550 +zadc_offset=548 zpow_cal=401 zadc_cal=189 zadc_err=-5 -zadc_min=zadc_offset zadc_max=zadc_offset -zadc_sum=0 zadc_min_sum=0 zadc_max_sum=0 znb_mes=0 +zadc_sum=0 zadc_offset_sum=0 znb_mes=0 zadc_rms1=0 zadc_rms2=0 zadc_rms3=0 if adc.force_init_mode(adc.INIT_ADC) @@ -40,10 +39,7 @@ end) function read_adc() zadc=adc.read(0) - if zadc<=zadc_min then zadc_min=zadc end - if zadc>=zadc_max then zadc_max=zadc end - zadc_min_sum=zadc_min_sum+zadc_min - zadc_max_sum=zadc_max_sum+zadc_max + zadc_offset_sum=zadc_offset_sum+zadc zadc=zadc-zadc_offset if zadc<=0 then zadc=zadc*-1 end zadc_sum=zadc_sum+zadc znb_mes=znb_mes+1 end @@ -51,16 +47,11 @@ end function calc_rms() zadc_rms=math.floor(zadc_sum/znb_mes)+zadc_err if zadc_rms<=0 then zadc_rms=0 end - zadc_rms1=zadc_rms2 zadc_rms2=zadc_rms3 zadc_rms3=zadc_rms - zadc_rms=math.floor((zadc_rms1+zadc_rms2+zadc_rms3)/3) - - zadc_min=math.floor(zadc_min_sum/znb_mes) - zadc_max=math.floor(zadc_max_sum/znb_mes) - zadc_offset=math.floor((zadc_min+zadc_max)/2) - - zpower=math.floor(zadc_rms*zpow_cal/zadc_cal) - print(zadc_min,zadc_max,zadc_max-zadc_min,zadc_offset,zadc_rms,zpower.."W") +-- zadc_rms1=zadc_rms2 zadc_rms2=zadc_rms3 zadc_rms3=zadc_rms +-- zadc_rms=math.floor((zadc_rms1+zadc_rms2+zadc_rms3)/3) + zadc_offset=math.floor(zadc_offset_sum/znb_mes) + zpower=math.floor(zadc_rms*zpow_cal/zadc_cal) + print(zadc_offset,zadc_rms,zpower.."W") zadc_min=zadc_offset zadc_max=zadc_offset - zadc_sum=0 zadc_min_sum=0 zadc_max_sum=0 znb_mes=0 - + zadc_sum=0 zadc_offset_sum=0 znb_mes=0 end diff --git a/Mesures/solar_pv_energy/0_get_data.lua.190916.1911 b/Mesures/solar_pv_energy/0_get_data.lua.190916.1911 new file mode 100644 index 0000000..c4fed64 --- /dev/null +++ b/Mesures/solar_pv_energy/0_get_data.lua.190916.1911 @@ -0,0 +1,66 @@ +-- Lit le convertisseur ADC connecté sur le transformateur de courant +-- pour mesurer le courant électrique de l'installation PV +print("\n 0_get_data.lua zf190916.1904 \n") + +-- Astuce de mesure: +-- au lieu de découper la sinusoïde en 100 parties, c'est à dire toutes +-- les 0.2ms (5'000x /s), pour en faire l'intégrale. On lit l'adc toutes +-- les 11ms (91x /s) beaucoup plus lentement. +-- Comme la sinusoïde fait 20ms et est répétitive, on balaye (par décalage) +-- statistiquement la sinusoïde. +-- On redresse l'alternance par rapport à la masse fictive (env 0.5), +-- ce qui nous permet d'estimer une valeur RMS du courant +-- quelque soit sa forme ! +-- On le somme sur 2.1 secondes avec une moyenne glissante sur 3 valeurs + +zadc_offset=550 +zpow_cal=401 +zadc_cal=189 +zadc_err=-5 + +zadc_min=zadc_offset zadc_max=zadc_offset +zadc_sum=0 zadc_min_sum=0 zadc_max_sum=0 znb_mes=0 +zadc_rms1=0 zadc_rms2=0 zadc_rms3=0 + +if adc.force_init_mode(adc.INIT_ADC) +then + node.restart() + return +end + +tmr_read_adc=tmr.create() +tmr_read_adc:alarm(11, tmr.ALARM_AUTO, function() + read_adc() +end) + +tmr_calc_rms=tmr.create() +tmr_calc_rms:alarm(2.1*1000, tmr.ALARM_AUTO, function() + calc_rms() +end) + +function read_adc() + zadc=adc.read(0) + if zadc<=zadc_min then zadc_min=zadc end + if zadc>=zadc_max then zadc_max=zadc end + zadc_min_sum=zadc_min_sum+zadc_min + zadc_max_sum=zadc_max_sum+zadc_max + zadc=zadc-zadc_offset if zadc<=0 then zadc=zadc*-1 end + zadc_sum=zadc_sum+zadc znb_mes=znb_mes+1 +end + +function calc_rms() + zadc_rms=math.floor(zadc_sum/znb_mes)+zadc_err + if zadc_rms<=0 then zadc_rms=0 end + zadc_rms1=zadc_rms2 zadc_rms2=zadc_rms3 zadc_rms3=zadc_rms + zadc_rms=math.floor((zadc_rms1+zadc_rms2+zadc_rms3)/3) + + zadc_min=math.floor(zadc_min_sum/znb_mes) + zadc_max=math.floor(zadc_max_sum/znb_mes) + zadc_offset=math.floor((zadc_min+zadc_max)/2) + + zpower=math.floor(zadc_rms*zpow_cal/zadc_cal) + print(zadc_min,zadc_max,zadc_max-zadc_min,zadc_offset,zadc_rms,zpower.."W") + zadc_min=zadc_offset zadc_max=zadc_offset + zadc_sum=0 zadc_min_sum=0 zadc_max_sum=0 znb_mes=0 + +end