www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Merjenje frekvence z mikrokontrolerjem

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
peterv6i
Član
Član



Pridružen-a: Tor 22 Jan 2008 13:30
Prispevkov: 116
Aktiv.: 0.59
Kraj: Izola

PrispevekObjavljeno: Ned Feb 28, 2016 10:36 am    Naslov sporočila:  Merjenje frekvence z mikrokontrolerjem Odgovori s citatom

Lep pozdrav vsem,
Zanima me na kakšen način bi lahko natančno izmeril frekvenco, katero mi na izhodu pošilja temperaturna sonda..

Je pri tem postopku mogoče uporabiti arduino?
Obstaja kakšen drugi način kako z arduinom zajeti natančno vrednost?
Obstajajo morda kakšni pretvorniki tipa frekvenca v i2c (da bi na eni strani meril frekvenco na drugi pa bi po vodilu i2c dobil vrednost v mikrokontroler)?

Specifikacije sonde je tukaj:

http://www.seabird.com/sbe3s-temperature-sensor

"Intended primarily for use on moored and fixed-site temperature measuring systems, the SBE 3S can also be used as a component in custom systems or for high-accuracy industrial and environmental temperature monitoring applications. The low noise characteristics of the SBE 3S allow the use of hybrid frequency measuring techniques to obtain rapid sampling with very high resolution; 40 μ°C resolution can be readily obtained at a 6 Hz sampling rate."


Lahko mi seveda priporočate tudi kaj drugega? žal se na svet mikrokontrolerjev ne spoznam preveč...



screenshot_112[1].png
 Opis:

Download
 Ime datoteke:  screenshot_112[1].png
 Velikost datoteke:  6.87 KB
 Downloadano:  4 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5327
Aktiv.: 24.78
Kraj: Domzale

PrispevekObjavljeno: Ned Feb 28, 2016 11:22 am    Naslov sporočila:   Odgovori s citatom

Pri tvojih frekvencah ranga par khz enostavno zvezi na INT0 in povecuj counter, na 1s pa glej rezultat.
_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
peterv6i
Član
Član



Pridružen-a: Tor 22 Jan 2008 13:30
Prispevkov: 116
Aktiv.: 0.59
Kraj: Izola

PrispevekObjavljeno: Ned Feb 28, 2016 11:59 am    Naslov sporočila:   Odgovori s citatom

mucek je napisal/a:
Pri tvojih frekvencah ranga par khz enostavno zvezi na INT0 in povecuj counter, na 1s pa glej rezultat.


Torej.. če uporablja arduino uno (tega imam pač doma) pa mega imam tudi..
Je to vhod pin 2 in 3

oziroma ali je vseeno preko katerega vhoda merim?

Slike dodajaj na forum!



screenshot_12[1].jpg
 Opis:
 Velikost datoteke:  32.23 KB
 Pogledana:  6 krat

screenshot_12[1].jpg




Nazadnje urejal/a peterv6i Ned Feb 28, 2016 12:11 pm; skupaj popravljeno 2 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Ned Feb 28, 2016 12:03 pm    Naslov sporočila:   Odgovori s citatom

Frekvenco in čas se da merit zelo natančno.
Seveda bi šlo tudi z arduino ploščicami.

Princip je enostaven. V določenem časovnem oknu šteješ impulze sonde.
Najbolj natančno se da to izvesti s timerji in števci, ki jih že vsebuje mikroprocesor.
Za res natančno meritev, bi moral uC poganjati s temperaturno kompenziranim oscilatorjem, vendar bo v tvojem primeru verjetno zadosti navaden kristalni oscilator.
Pazi le, da uC ne bo deloval z internim RC oscilatorjem.

V tvojem primeru izhodni signal sonde ni direktno kompatibilen z logičnimi nivoji.
Za pretvorbo potrebuješ komparator.
Dobro bi bilo, da z šibko pozitivno povratno vezavo poskrbiš za malo histereze.

Pazi tudi na ustrezno zaščito elektronike proti vlagi.
Vlaga in sol znata zelo hitro narediti škodo na nezaščiteni elektroniki.

_________________
Kdor ni skregan, ni Slovenc !
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
peterv6i
Član
Član



Pridružen-a: Tor 22 Jan 2008 13:30
Prispevkov: 116
Aktiv.: 0.59
Kraj: Izola

PrispevekObjavljeno: Ned Feb 28, 2016 12:12 pm    Naslov sporočila:   Odgovori s citatom

int47 je napisal/a:
Frekvenco in čas se da merit zelo natančno.
Seveda bi šlo tudi z arduino ploščicami.


To me zanima.. ker je enostavno za uporabo..
Imam pa 2 sonde za merit.. ena je za temperturo druga je za prevodnost.. ampak obe imata na izhodu frekvenco..

Na razpolgo imam arduino uno in arduino mega.. lahko pa mi priporočite tudi kaj drugrga samo da ne potrebujem kakšnih dodatnih programatorjev in orodij, ki so plačljiva..
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
peterv6i
Član
Član



Pridružen-a: Tor 22 Jan 2008 13:30
Prispevkov: 116
Aktiv.: 0.59
Kraj: Izola

PrispevekObjavljeno: Pon Feb 29, 2016 4:23 pm    Naslov sporočila:   Odgovori s citatom

nekako študiram uporabiti timer interrupt + 2 pin interrupt-a za merjenje signala?
Se mi zdi bolj natančno kot če bi čas gledal v loop zanki?
kaj pravite?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
peterv6i
Član
Član



Pridružen-a: Tor 22 Jan 2008 13:30
Prispevkov: 116
Aktiv.: 0.59
Kraj: Izola

PrispevekObjavljeno: Tor Feb 14, 2017 10:11 am    Naslov sporočila:   Odgovori s citatom

Evo nekako sem skvačkal...

Torej pri merjenju sem uporabil komparator po vaših predlogih in izdelal takšnega:



Vezje sem najprej probal s simulatorjem TINA



Na vhod sem pripeljal sinus +- 0.5V na izhodu sem dobil pravokoten signal:



Prototip:



Program sem pa tako naredil:

Signal iz komparatorja sem pripeljal na vhod 2..

V kodi sem določil, da se na prekinitev na vhodu 2 pokliče metoda, ki poveča števec za 1..
Definiral sem še timer interrupt na 1 sekundo v katerem potem dobim število impulzov..
Zadevo sem testiral s funkcijskim generatorjem tja do 15 kHz in napaka je 1Hz moram pa povedati da sem imel težave saj sem najprej uporabljal nek kitajski klon DcDuinoMega, ki očitno nima kristala!? tam je bila napaka po 6-7 Hz..
Potem sem ploščico pripopal na drugi klon, ki ima kristal in je zadeva funkcionirala..

Na sam arduino sem priklopil še LAN modul. Spisal sem kodo tako, da na request dobim (frekvenco) temperaturo v XML formatu..
Spisal sem še enostaven programček v javascriptu, ki na vsake nekaj sekund pokliče Arduin-a in iz pridobljenega "stream"-a pobere podatke in izriše graf...


Če kdo potrebuje prilagam še kodo, ki je seveda testna in vsebuje kar nekaj "smeti"..

[code]#include <SPI.h>
#include <Ethernet.h>
#include <Math.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define LEDPIN 13

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);

const byte interruptPinTemp = 2;
const byte interruptPinSlanost = 3;

//konstante za SBE-3 6kHz-13kHz
const double g = 4.85424599e-003;
const double h = 6.77144804e-004;
const double i = 2.64564244e-005;
const double j = 2.05642835e-006;
const double f = 1000.0;

volatile int cnt = 0;
volatile int cnt1 = 0;

volatile double slanost = 0;
volatile double slanost1 = 0;
int timer1_counter;
boolean bData = false;

volatile int dvesek = 1;

void beriTemperatura(){
cnt++;
}

void beriSlanost(){
slanost++;
}


double calcTemp(double frekvenca)
{
double logRes = log(f / frekvenca);
return 1.0 / (g + (h * logRes) + (i * pow(logRes, 2.0)) + (j * pow(logRes, 3.0))) - 273.15;
}


void setup() {

Serial.begin(9600); // inicializacija serijskega porta
noInterrupts(); // disable all interrupts
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());

pinMode(interruptPinTemp, INPUT_PULLUP);
pinMode(interruptPinSlanost, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(interruptPinTemp), beriTemperatura, RISING);
attachInterrupt(digitalPinToInterrupt(interruptPinSlanost), beriSlanost, RISING);

// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B

// set compare match register to desired timer count:
OCR1A = 15624;
// turn on CTC mode:
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
}

//Timer interrupt na 1 sekundo
ISR(TIMER1_COMPA_vect) // interrupt service routine
{
TCNT1 = timer1_counter; // preload timer


cnt1 = cnt ; // prepisemo vrednost v cnt1
bData = true; // postavimo flag
cnt = 0; // resetiramo counter
digitalWrite(LEDPIN, !digitalRead(LEDPIN));

}


void loop() {
// če je postavljen flag, da so podatki jih izpišemo ali naredimo karkoli drugega
if (bData == true)
{
bData = false;
Serial.println(calcTemp(cnt1), 3);
Serial.println("Temperatura");
Serial.println(cnt1);

}

EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);

if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/xml;charset=UTF-8");
client.println("Access-Control-Allow-Origin: *");
client.println("Connection: close");

client.println();
client.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
client.print("<TEMP>");
client.print(calcTemp(cnt1), 3);
client.print("</TEMP>");

break;
}
if (c == '\n') {

currentLineIsBlank = true;
} else if (c != '\r') {

currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}

}


Zanimivo, kako radi lepite slike na neke zunanje strežnike na našega pa nikakor ne.
Ali je na našem to toliko težje narediti?
Gre namreč za to, da čez nekaj časa teh slik na teh strežnikih ne bo več in je tak prispevek brez vrednosti!
Jaka
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group