Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Arduino Uno Atmega328- Voltmetar- pomoć

[es] :: Elektronika :: Mikrokontroleri :: Arduino Uno Atmega328- Voltmetar- pomoć

Strane: < .. 1 2 3 4

[ Pregleda: 6563 | Odgovora: 64 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 19:10 - pre 52 meseci
Citat:
Brkic:
Ok prihvatam mišljenje ali ne znam kako da ga sproverem, ako može neki primer.

Sada
1.ulaz očitavam A5 sa AD u jedan varijablu i posle 1 sec varijablu podelim sa brojem čitanja gde mi je za 19.4v imao ulaz 727.4

Sada trebam primeniti 2.ulaz sa referentnim naponom od 5v u izračunavanje 1.ulaza

AREF mi je 2.5v

sa 7805 napajam Arduino


Bogdan je stari vuk, on ti je objasnio direktno ono što treba da uradiš.

Moja preporuka je samo da konverziju radiš u interaptu, ako želiš filtriranje.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 19:21 - pre 52 meseci
Citat:
Brkic:
Ok prihvatam mišljenje ali ne znam kako da ga sproverem, ako može neki primer.


ne mozes tek tako da se igras sa interaptom na 328, posebno kad koristis arduino ide....

elem, imas
FrequencyTimer2 library

i onda nesto tipa:

Code:

#include <FrequencyTimer2.h>

volatile unsigned long keetah = 0;
unsigned long count;

void kita(void) {
  keetah++;
}

void setup() {
  Serial.begin(9600);
  delay(2);
  FrequencyTimer2::setPeriod(200);
  FrequencyTimer2::setOnOverflow(kita);
  FrequencyTimer2::enable();
}

void loop() {
  noInterrupts();
  count = keetah;
  interrupts();     
  Serial.println(count, DEC);
  delay(1000);
}


iliti u tvom slucaju nesto tipa

Code:

#include <FrequencyTimer2.h>

volatile unsigned long keetah = 0;
volatile unsigned long VIN = 0;

void kita(void) {
  static unsinged long adcdata=0;
  if (++keetah > 7) {
    adcdata += analogRead(A0);
  } else {
    // VIN = adcdata * 4 / 8
    VIN = adcdata / 2; // odbaci zadnji bit
    keetah = 0;
    adcdata = 0;
  }
}

void setup() {
  Serial.begin(9600);
  delay(2);
  FrequencyTimer2::setPeriod(100);
  FrequencyTimer2::setOnOverflow(kita);
  FrequencyTimer2::enable();
}

void loop() {
  unsigned long v;

  noInterrupts();
  v = VIN;
  interrupts();     
  Serial.print("Vin = ");
  Serial.print(v);
  Serial.println("mV");
  delay(1000);
}



obrati samo paznju D11 ce ti imati output 50% DC sa freq 1000000 / period
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 19:24 - pre 52 meseci
i, da, obrati paznju, kucao sam direkt u ES poruku, moguce da ima neki bug :D, al valjda razumes ideju

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 19:29 - pre 52 meseci
ako oces floating average onda nesto tipa:

Code:

#include <FrequencyTimer2.h>

volatile unsigned long VIN = 0;

void kita(void) {
   VIN =  (VIN * 3 + analogRead(A0) *4 ) / 4; // neka kompajler odluci sta ce kako shiftuje, svakako je brz matis
}

void setup() {
  Serial.begin(9600);
  delay(2);
  FrequencyTimer2::setPeriod(100);
  FrequencyTimer2::setOnOverflow(kita);
  FrequencyTimer2::enable();
}

void loop() {
  unsigned long v;

  noInterrupts();
  v = VIN;
  interrupts();     
  Serial.print("Vin = ");
  Serial.print(v);
  Serial.println("mV");
  delay(1000);
}

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 19:32 - pre 52 meseci
ovako ti je bas jak filter
Code:

void kita(void) {
   VIN =  (VIN * 3 + analogRead(A0) *4 ) / 4; 
}


tu realno biras kako oces da seces pikove .. mozes da ides i naopacke tipa vrlo slab filter

Code:

void kita(void) {
   VIN =  (VIN  + analogRead(A0) * 12 ) / 4; 
}


ili neki srednji


Code:

void kita(void) {
   VIN =  (VIN  + analogRead(A0) * 4 ) / 2; 
}


 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 20:39 - pre 52 meseci
Bogdane, možda si napravio omašku, ili nisi dodatno objasnio.

Ako se uzme da se meri konstantni napon, onda po prvom napisanom kodu Vin -> Va0

Po drugom i trečem Vin -> 4*Va0.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 20:48 - pre 52 meseci
na koji deo mislis?


VIN = (VIN * 3 + analogRead(A0) *4 ) / 4;
VIN = (VIN + analogRead(A0) * 12 ) / 4;
VIN = (VIN + analogRead(A0) * 4 ) / 2;


analogread * 4 je VIN

u prvom imamo 3 * vinstari + vin = 3 stara merenja + 1 novo merenje i kada to onda podelimo sa 4 imamo filtrirano velicinu 1x

u drugom imamo 1x vinstari + 3 * vin, znaci 1 staro merenje + 3x novo merenje i podelimo sve sa 4 opet dobije 1x

u trecem 1x vinstari + 1x vin dakle 1 staro + 1 novo pa podelimo sa 2 opet dobijemo 1x


analogread() cita 0-1024, ako nam to predstavlja 0 do 4096mV znaci da 4 * analogread() daje vin


znaci u sve 3 varijante imamo dobar red velicine kao izlaz samo sto u prvom stara vrednost vredi 3/4 a nova vrednost 1/4, dakle jak filter koji ne sljivi mnogo brze promene, u drugom nova vrednost vredi 3/4 a stara 1/4 (dakle skroz obrnuto) sto znaci da reagujemo na brze promene ali ih ipak malo usporavamo, i treci, stara vrednost vredi 50% nova vredi 50% .. znaci nesto izmedju

 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć06.12.2019. u 21:17 - pre 52 meseci
Ako je Va0 konstanta, kako vreme teče onda Vin novo teži Vin staro, pa se na kraju izjednače.

I: VIN = (VIN * 3 + analogRead(A0) *4 ) / 4;

4*Vin = 3*Vin+Va0
Vin = Va0

II: VIN = (VIN + analogRead(A0) * 12 ) / 4;

4*Vin = Vin+12*Va0
3*Vin = 12Va0
Vin = 4*Va0

II: VIN = (VIN + analogRead(A0) * 4 ) / 2;

2*Vin = Vin+4*Va0
Vin = 4*Va0

Proverio sam i numerički u MathCad-u.

Obrazac za ovu vrstu filtriranja je:

Vin = ((n-1)*Vin+Va0)/n

pa se dobija

n*Vin = (n-1)*Vin+Va0
Vin = Va0
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 00:24 - pre 52 meseci
Uzgred, formula:

Vin = ((n-1)*Vin+Va0)/n

može da ima zgodniji oblik:

n*Vin = n*Vin-Vin+Vao

odnosno

Vin = Vin+(Va0-Vin)/n

gde nema množenja sa (n-1), a n može da se izabere da bude 2^m, pa da se deljenje svede na šiftanje udesno.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 09:42 - pre 52 meseci
Citat:
korak:
II: VIN = (VIN + analogRead(A0) * 12 ) / 4;

4*Vin = Vin+12*Va0
3*Vin = 12Va0
Vin = 4*Va0




kako si ovo izracunao :D

VIN = (VIN + analogRead(A0) * 12 ) / 4;

Va0 = analogRead(A0) * 4

dakle

analogRead(A0) * 12 = Va0 * 3

dakle

4 * Vin = Vin+3xVa0




 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.sowireless.org.



Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 12:49 - pre 52 meseci
Probao sam oba koda i isto rade uz izmene al imam pitanja


sa ovim codom izračunava 1767mV-1768mV a unimer meri 18.85 V
Code:
#include <FrequencyTimer2.h>

volatile unsigned long keetah = 0;
volatile unsigned long VIN = 0;
static unsigned long adcdata=0;

void kita(void) {
  
  //keetah++;
  if (++keetah < 7) // ovde treba < umesto >
  { 
    adcdata += analogRead(A4);
  } 
  else 
   { 
     VIN = adcdata * 2.495 / 6;  // ovde 6 umesto 8 i 2.495 jer mi je AREF 2.495v
     //VIN = adcdata / 2; // odbaci zadnji bit
     keetah = 0;
     adcdata = 0;
   }
}

void setup() {
  analogReference(EXTERNAL);
  pinMode(5, OUTPUT);
  analogWrite(5,255);
  
  Serial.begin(9600);
  delay(2);
  FrequencyTimer2::setPeriod(400); // kada je 100 blokira se LOOP, na 400 proradi
  FrequencyTimer2::setOnOverflow(kita);
  FrequencyTimer2::enable();
}

void loop() {
  unsigned long v;
  noInterrupts();
  v = VIN;
  interrupts();     
  Serial.print("Vin = ");
  Serial.print(v);
  Serial.print("mV / IN ");
  Serial.println(analogRead(A4));
  delay(1000);
}


isti je rezultat i sa ovim codom 1767mV-1768mV a unimer meri 18.85 V
Code:

#include <FrequencyTimer2.h>

volatile unsigned long VIN = 0;

void kita(void) {
   //VIN =  (VIN * 3 + analogRead(A0) *4 ) / 4; // neka kompajler odluci sta ce kako shiftuje, svakako je brz matis
   VIN =  (VIN * 3 + analogRead(A0) *2.495 ) / 4;
}

void setup() {
  Serial.begin(9600);
  delay(2);
  FrequencyTimer2::setPeriod(400); // 100
  FrequencyTimer2::setOnOverflow(kita);
  FrequencyTimer2::enable();
}

void loop() {
  unsigned long v;

  noInterrupts();
  v = VIN;
  interrupts();     
  Serial.print("Vin = ");
  Serial.print(v);
  Serial.println("mV");
  delay(1000);
}



FrequencyTimer2::setPeriod(400); - koliki je ovo period, 1000=1 sec ??

kada sam na A0 pustio referentni napon od 5v i da bi mi ispisivao 5000mV trebala je formula
VIN2 = (adcdata2 * 2.444)*2, ispada da je IREF 2.444v ili grešim ?
Tu na tih 18.85v treba dodati još 0.0909 jer prolazi preko otpornika 10k i 1k da bi se uopšte mogao meriti

[Ovu poruku je menjao Brkic dana 07.12.2019. u 14:39 GMT+1]
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 15:49 - pre 52 meseci
Shvatio sam da ti razdelnik čine otpornici 10K i 1K, što znači da ulazni napon deli sa 11.

ADC je 10-to bitni, daje vrednosti u opsegu od 0 do 1023- Zato malo doradi iskaz

VIN = adcdata * 2.495 / 6;

u:

VIN = (adcdata*2495*11/1024)/6

treba da dobiješ oko 18900-

Ako su ti otpornici u razdelniku 5% onda ocekuj toliku moguću grešku. Ako si u mogućnosti zameni ih sa 1%.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 15:51 - pre 52 meseci
Citat:

FrequencyTimer2::setPeriod(400); - koliki je ovo period, 1000=1 sec ??


mora pogledas FT2 dokumentaciju, ako se dobro secam to generise pwm 1000000 / x Hz na D11 pinu dakle setuje timer1/2 sa tim preskalerom ALI ti onda sa FrequencyTimer2::setOnOverflow(kita); zakacis funkciju kita() da se izvrsi na overflow, e sad ne secam se dal je overflow 8bit ili 16bit ako je 8bit onda ti se kita() izvrsi u slucaju setPeriod(1000)

1000000/1000 = 1000Hz
1000Hz / 256 = 3.9 puta u sekundi ti se izvrsi kita()

ako je 16bitni onda jos sporije ...

znaci tvojih 400 bi trebalo da izvrsava kita() 9.7 puta u sekundi

TREBALO!!!!

moz proveris tako sto ces u kita() upalis ugasis led umesto sto radis sve ovo pa izmeris :D ili pravilnije procitas doc za FT2 library :D ... ja sam ga koristio za generisanje frekvencije na D11 pre milion godina tako da ovo ostalo je vise manje educated guess



e sad, sto se tice citanja, poenta tih fancy referenci od 20-50din je da ubrza matis i pojednostavi stvari, odatkle 4.095-4.096 referenca, 2.047-2.048, 1.023-1.024 etc..

krenes za pocetak bez ikakvog filtriranja

Code:

#include <FrequencyTimer2.h>
#define REFERENCA 2495

volatile unsigned long VIN = 0;

void kita(void) {   
   // https://www.arduino.cc/reference/en/language/functions/math/map/

   VIN =  map( analogRead(A0), 0, 1023, 0, REFERENCA);
}

void setup() {
  Serial.begin(9600);
  delay(2);
  FrequencyTimer2::setPeriod(400); // 100
  FrequencyTimer2::setOnOverflow(kita);
  FrequencyTimer2::enable();
}

void loop() {
  unsigned long v;

  noInterrupts();
  v = VIN;
  interrupts();     
  Serial.print("Vin = ");
  Serial.print(v);
  Serial.println("mV");
  delay(1000);
}


to je da vidis sta ti je na A0 ... e sad sta si ti turio pre A0, nisam citao celu temu mnogo ste zakomplikovali .. ali dovedi napon sa baterije na A0 i vidi sta ces dobiti
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 16:17 - pre 52 meseci
Citat:
bogdan.kecman:
Citat:
korak:
II: VIN = (VIN + analogRead(A0) * 12 ) / 4;

4*Vin = Vin+12*Va0
3*Vin = 12Va0
Vin = 4*Va0




kako si ovo izracunao :D

VIN = (VIN + analogRead(A0) * 12 ) / 4;

Va0 = analogRead(A0) * 4

dakle

analogRead(A0) * 12 = Va0 * 3

dakle

4 * Vin = Vin+3xVa0





Vrlo prosto, u prethodnom postu posle 8 sumiranja imaš iskaz:

VIN = adcdata / 2; // odbaci zadnji bit

što nisam povezao sa sledećim postom na koji sam se oslonio u odgovoru.

To je to.
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.sowireless.org.



Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 16:45 - pre 52 meseci
@korak
otpornici su mi 1%
VIN = (adcdata*2495*11/1024)/6
sada sa ovom formulom je OK, razlika izmedju unimera i Arduina je neka neznatna i razlika je konstantna na svim naponima kliko sam mogao na brzinu ispitati.

Ja sam u medjuvremenu uzeo formulu mereći Ref 5v na drugom Input i dobio
VCC=(5000.000/(adcdata2/6))/2; // VCC=2.444; AREF=4.495v

kada taj VCC ubacim dobijem za 0.05v više od tvoje formule ali konstantna je ralika
VIN = (adcdata * VCC / 6)/0.0909;


 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 23:41 - pre 52 meseci
Nisam dobro razumeo ovo sa 5V.

Kao doveo si na jedan ADC kanal 5V a referentni napon ti je 2,5V (2,495V). Ne verujem da si tako nešto uradio, jer znaš da napon koji se uvodi u ADC kanal ne treba da bude veći od referentnog napona, pa sam zbunjen.

 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.sowireless.org.



Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć07.12.2019. u 23:57 - pre 52 meseci
Nećeš verovati da sam u svoj zbrci to uradio i sve je ostalo čitavo.
I ja sam kasnije skontao šta sam uradio i još merio napon i radilo je to...
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć08.12.2019. u 00:08 - pre 52 meseci
Nisam očekivao da će nešto da crkne, ali samo merenje je nepredvidivo, nije pravljeno za tu situaciju.
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.sowireless.org.



Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć08.12.2019. u 00:12 - pre 52 meseci
Sa tvojom formulom sada lepo meri, probao sam i na bateriju i na trafo i lepo radi.
Hvala na pomoći.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.exe-net.net.



+7 Profil

icon Re: Arduino Uno Atmega328- Voltmetar- pomoć08.12.2019. u 01:01 - pre 52 meseci
Nema potrebe za zahvaljivanjem, forum i postoji za to.

Pomogao sam ti oko opštih stvari, ništa posebno, inače ako izuzmemo ARM ja radim sa mikrokontrolerom sa kojim niko ne radi na ovom forumu, ali svi se oni vrte oko istih stvari.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Arduino Uno Atmega328- Voltmetar- pomoć

Strane: < .. 1 2 3 4

[ Pregleda: 6563 | Odgovora: 64 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.