Frekvencia mérése

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Dailydose
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2014. szeptember 18. csütörtök, 19:58

Frekvencia mérése

Hozzászólás Szerző: Dailydose »

Sziasztok!

Szeretnék segítséget kérni Arduinoval való frekvenciamérés ügyében. Egy alap Arduino-Unom van, a mért jel egy 12 Voltos PWM jel, amelynek frekvenciája 3-30 Hz-es tartományban változtatható.
Ezen kívül szeretném a PWM kitöltési tényező értékét is kiíratni.
Találtam is erre egy angol oldalt https://www.electronicsblog.net/arduino ... cle-meter/.
A probléma ott kezdődik, hogy kezdőként ezen annyira nem is tudok kiigazodni, másrészt ahogy az oldalon olvasom erre a feladatra már egy komolyabb Arduino, a Mega2560-as típusú lenne alkalmas.
Aki esetleg tudna bármilyen ötletet, leírást, segítséget nyújtani, annak nagyon megköszönném!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Frekvencia mérése

Hozzászólás Szerző: Robert »

A timer 1 regisztert nézd meg. Mi van a M2560 és mia M328P-ben.
Ez az egy a különbség.
De a hozzászólások közta 4. az is ezt taglalja.
És simán UNO-ra fordítod. Készen is van.....
Dailydose
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2014. szeptember 18. csütörtök, 19:58

Re: Frekvencia mérése

Hozzászólás Szerző: Dailydose »

Köszönöm a segítséget! A másik dolog, hogy a 12 Volt viszont az adatlap alapján nem jó az Unonak, a M2560 elbírja.
Ezzel valamit nem lehetne csinálni? (jó lenne, ha nem kéne vennem egy M2560-ast :? )
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Frekvencia mérése

Hozzászólás Szerző: Robert »

Melyik 12V?
Betáp?
Az simán mehet. Azonos a 2 chip tápfeszkezelése.

Mérendő feszültség?
Ott mind2 esetben ellenállásosztó kell....
Dailydose
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2014. szeptember 18. csütörtök, 19:58

Re: Frekvencia mérése

Hozzászólás Szerző: Dailydose »

A mérendő feszültségről van szó, ellenállásosztóra gondoltam én is, de az az eredeti mért jelet nem módosítja? Cél az, hogy simán rámérjek valahogy a működő kapcsolás 12 Voltos PWM jelére.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Frekvencia mérése

Hozzászólás Szerző: Robert »

Elméleti válasz: Minden módosít mindent.
Gyakorlatban ha nem akarod:
- indukciószegény ellenállásból építkezel, 10..100 kohm nagyságban (a PWM mennyire terhelhető?)
- 1:1 műveleti erősítővel fogod meg, ami nagy (>1Mohm) bemenő ellenállású

Előző 2 kombinált: a műveleti erősítő felezi/harmadolja a jelszintet (műv erősítő tápfesze min. a bemenő fesz.

Bár ha PWM jel, akkor mennyire kell precíznek lenned? Milyen hiba engedhető meg?
Dailydose
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2014. szeptember 18. csütörtök, 19:58

Re: Frekvencia mérése

Hozzászólás Szerző: Dailydose »

A PWM jelnek elég precíznek kellene lennie, egy LED-lámpát hajt meg. Strobofelvételek készítéséhez van szükség a változtatható frekvenciára és PWM-re.
Ha simán levenném a jelet a kimenetről és közvetlenül menne az Arduino analog input-jába, az lenne a tökéletes igazából, csak ugye nem tudom ezt megcsinálni valamilyen feszültségredukálás nélkül. Ha meg redukálom a fesz-t egy ellenállásosztással pl, akkor a kimenetet is gyengíti gondolom. Bocsi, hogy nyakatekerten fogalmazok, de sajnos annyira nem vagyok képben ezzel a dologgal kapcsolatban :|
Az indukciószegény ellenállást az osztóba gondoltad? Ezáltal nem változtatná meg annyira a kimenetet?
A műveleti erősítővel talán feszültségcsökkentőt tudnék csinálni, kérdés, hogy ugye az is a közös 12 Volttal lenne tápolva, és, hogy nem e húzná le nagyon a kimenetet?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Frekvencia mérése

Hozzászólás Szerző: Robert »

Műszaki fórum. Kérlek definiáld:
"A PWM jelnek elég precíznek kellene lennie"

Milyen tűréssel kell Frekvenciát mérni? a PWM kitöltési %-ot?
10%? 5%? 1%? 0.1%?


A kimeneti PWM-ed mit tud? Milye terhelés köthető rá?
Szóval előbb kérlek pontosíts a paramétereken....
Dailydose
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2014. szeptember 18. csütörtök, 19:58

Re: Frekvencia mérése

Hozzászólás Szerző: Dailydose »

Jogos!! A terhelés egy 2 Wattos lámpa, így kb 170 mA áram folyik át rajta max kitöltésnél.
A PWM jel mérés pontossága kb 1-2%-os tűréssel tökéletes lenne, a frekvencia mondjuk 1 Hz tűréssel.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Frekvencia mérése

Hozzászólás Szerző: Robert »

Ellenállosztó a mérőlábra 1:2 arány, Pl. 10k + 22k.
A korábban linkelt Mega-ra megírt szoftver ezt innentől tudja is kezelni.
Dailydose
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2014. szeptember 18. csütörtök, 19:58

Re: Frekvencia mérése

Hozzászólás Szerző: Dailydose »

Köszönöm szépen!! így valóban csak 4 Volt jut majd az analóg bemenetre. Már csak azt nem tudom biztosan, hogy a 3. kommentben elvileg leírják az Uno-ra vonatkozó kódot, de pl kapcsolást sehol nem látok. Elég, ha csak az LCD-t kötöm be, illetve a bemenetre a mért jelet, vagy kell valami nyomógomb is, mert valami ilyesmiket olvastam benne, hogy az interrupt miatt kell valamilyen nyomógomb?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Frekvencia mérése

Hozzászólás Szerző: Robert »

Nyomógomb: bármely szabad láb. A képernyők közti váltásért felel.
Gbor32768
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2016. október 18. kedd, 20:14

Re: Frekvencia mérése

Hozzászólás Szerző: Gbor32768 »

Sziasztok !
A téma nyitó bejegyzésében hivatkozott linken https://www.electronicsblog.net/arduino ... cle-meter/. található frekvenciamérő programot pici módosítások árán elindítottam egy nano-n.

Kód: Egész kijelölése

//Arduino frequency counter/duty cycle meter
//www.electronicsblog.net/

#include <LiquidCrystal.h>
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd(12, 11, 5, 4, 3, 6); 

/* 
Az interrupt 0 kedvéért felszabadítottam a 2-es pin-t !
A jelforrás egy CD4060 32768Hz-s kristállyal 5V tápfesztől működtetve.
32768 , 2048 , 1024 , 512 , 256 , 128 , 64 , 32 , 8 , 4 Hz állt rendelkezésre.
*/

//#define Button 52
#define Button 7
int divider[6] = {0, 1, 8, 64, 256, 1024};
int prescaler = 5;
int b = 0;
int screen = 0;
double count = 0;
double middle = 0;
double usage = 0;
char x = 0;

ISR(TIMER1_OVF_vect) {
  if (prescaler < 4) {
    prescaler++;
  }
}
void interrupt()
{
  if (!x) {
    count = TCNT1;
    TCNT1 = 0x000;
    TCCR1B = prescaler;
    //attachInterrupt(2, interrupt, FALLING);
    attachInterrupt(0, interrupt, FALLING);
  }
  else {
    middle = TCNT1;
    //attachInterrupt(2, interrupt, RISING);
    attachInterrupt(0, interrupt, RISING);
  }
  x = ~x;
}

void setup()   {

  lcd.begin(16, 2);

  pinMode(Button, INPUT);
  digitalWrite(Button, HIGH); //pull up resistor

  TIMSK1 = 0x01; // enabled global and timer overflow interrupt;
  TCCR1A = 0x00; // normal operation page 148 (mode0);
  //attachInterrupt(2, interrupt, RISING);
  attachInterrupt(0, interrupt, RISING);

}

void loop()
{
  /// screen modes
  switch (screen) {

    case 0:
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("Freq ");
      lcd.print(16000000.0 / divider[prescaler] / count);
      lcd.print(" Hz");
      lcd.setCursor(0, 1);
      lcd.print("Duty ");
      lcd.print(middle / count * 100);
      lcd.print(" % ");
      lcd.print("    ");
      break;

    case 1:
      lcd.setCursor(0, 0);
      lcd.print("Period: ");
      lcd.setCursor(0, 1);
      lcd.print(0.0000625 * divider[prescaler]*count);
      lcd.print(" ms     ");
      break;

    case 2:
      lcd.setCursor(0, 0);
      lcd.print("H ");
      lcd.print(0.0000625 * divider[prescaler]*middle);
      lcd.print(" ms    ");
      lcd.setCursor(0, 1);
      lcd.print("L ");
      lcd.print(0.0000625 * divider[prescaler] * (count - middle));
      lcd.print(" ms    ");
      break;

    case 3:
      lcd.setCursor(0, 0);
      lcd.print("Prescaler /");
      lcd.print(divider[prescaler]);
      lcd.setCursor(0, 1);
      lcd.print("Count.use ");
      usage = count / 65536 * 100;
      lcd.print(usage);
      lcd.print("%  ");
      break;

  }
  delay(250);

  if (prescaler > 1) {

    if (usage < 0.15) {
      prescaler--;
      delay(200);
    }

  }

  ///button /////////

  if (!digitalRead(Button) && !b) {

    screen++;
    if (screen == 4) {
      screen = 0 ;
    }
    lcd.clear();

    b = 3;

  };

  if (!b == 0) b--;

}

Sajnos pontatlanul mér . A cikkben olvasottak értelmében (1K felett nem pontos) 512Hz-re fókuszáltam , helyette 514 Hz-et láttam a kijelzőn.
peldaprogi.jpg

Oszcilloszkóppal ellenőríztem a jelgenerátoromat (CD4060 32Khz-s kristállyal)
szkop.jpg
Egy másik programot (szintén netes gyűjtésből) átírtam a kezdő arduinós tudásommal a saját célomnak megfelelően. Ez is magasabb értéket mutat , ráadásul veszettül ugrálnak a tizedes jegyek . Ha egy külső osztót alkalmazok 1Mhz felett csak 10Khz-es ill. annál rosszabb felbontással tudok így frekit mérni.
sajat.jpg
Mivel jelenleg nincs másik arduino board a fiókomban és még kezdő is vagyok arduinóilag , nem tudom eldönteni az eszközöm hibás e vagy ebben a fejlesztői környezetben itt van a lehetőségek határa.

Kód: Egész kijelölése

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 6);

float freki;
//unsigned long hi, hiave;
//unsigned long lo, loave;
float hi, hiave;
float lo, loave;
float korrekcio;
int i;
int Bemenet = 2;

void setup() {
  lcd.begin(16, 2);
  pinMode(Bemenet, INPUT);
  //digitalWrite(Bemenet, HIGH); //Felhúzó ellenállás bekacsolás
  korrekcio = 0.9935;
}

void loop () {
  hiave = 0;
  loave = 0;
  for (i = 0; i < 3; i++) {
    hi = pulseIn(Bemenet, HIGH);
    hiave += hi;
    delay(1);
    lo = pulseIn(Bemenet, LOW);
    loave += lo;
    delay(1);
  }
  hi = hiave / i;
  lo = loave / i;
  freki = (hi + lo) / 1000;
  freki = 1000 * (1 / freki);
  //freki=1000000/(hi+lo);
  freki = freki * korrekcio;
  
  lcd.setCursor(0, 0);
  lcd.print("               ");
  lcd.setCursor(0, 0);
  lcd.print(freki,DEC);
  lcd.print("Hz");
  lcd.setCursor(0, 1);
  lcd.print("               ");
  lcd.setCursor(0, 1);
  lcd.print(freki,1);
  lcd.print("Hz");
  delay(300);
}

Pontos freki mérővel rendelkezem ugyan mert anno a 90-es években 3kg TTL IC és 2q LED kijelző 1T tápegység felhasználásával készítettem pontos freki mérőt, de kellene egy ami 2gr-ot nyom és nem veszi fel egy ötköbméteres fagyasztóláda teljesítményét a hálózatból. Szükségem van egy olyan műszerre ami egy 9V-os elemről bárhol beindítható és akár több órán keresztül is üzemeltethető.
Mivel a programozásban kezdő vagyok ha valaki tudna írni javasolni valamit , merre induljak (a PIC-sába pl :( ) tovább azt meg köszönném.
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Frekvencia mérése

Hozzászólás Szerző: kapu48 »

Igazán nem értelek!?

Sajnálod a pénzt a Megára! Aztán sírsz, hogy a gyengébb vas nem hozza az ígért eredményt!
Pedig le írták, hogy a megában 16 BIT-es a timer1, az Unoban pedig csak 8BIT-es timer 1-es van!
Innentől kezdve csak azt a pontosságot kapod, amit bír a rendszer!
Gbor32768
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2016. október 18. kedd, 20:14

Re: Frekvencia mérése

Hozzászólás Szerző: Gbor32768 »

Tisztelt kapu48 !

Először is amikor valakinek írásban üzenek , egy köszönést ,egy megszólítást odabiggyesztek az elejére az a minimum.
Másodszor , egy szóval sem említettem a költségeket mindössze azt ecseteltem , hogy a TTL IC-s frekimérő nem alkalmas telepes üzemmódra . Szükségem van egy alacsony fogyasztású mobilizálható eszközre .A nano volt kéznél itthon , ezért azzal próbáltam valamit elérni de magamtól is beláttam , hogy másfelé kell elindulni.
Harmadszor pedig megköszönöm az építő jellegű hozzászólásodat sokat tanultam belőle...

Üdvözlettel,
Gbor32768
Válasz küldése