|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
peterv6i Član
Pridružen-a: Tor 22 Jan 2008 13:30 Prispevkov: 116 Aktiv.: 0.58 Kraj: Izola
|
Objavljeno: Ned Feb 28, 2016 10:36 am Naslov sporočila: Merjenje frekvence z mikrokontrolerjem |
|
|
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č...
Opis: |
|
Download |
Ime datoteke: |
screenshot_112[1].png |
Velikost datoteke: |
6.87 KB |
Downloadano: |
4 krat |
|
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5342 Aktiv.: 24.66 Kraj: Domzale
|
Objavljeno: Ned Feb 28, 2016 11:22 am Naslov sporočila: |
|
|
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 |
|
|
peterv6i Član
Pridružen-a: Tor 22 Jan 2008 13:30 Prispevkov: 116 Aktiv.: 0.58 Kraj: Izola
|
Objavljeno: Ned Feb 28, 2016 11:59 am Naslov sporočila: |
|
|
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!
Opis: |
|
Velikost datoteke: |
32.23 KB |
Pogledana: |
6 krat |
|
Nazadnje urejal/a peterv6i Ned Feb 28, 2016 12:11 pm; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2069 Aktiv.: 9.25 Kraj: Ljubljana
|
Objavljeno: Ned Feb 28, 2016 12:03 pm Naslov sporočila: |
|
|
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 |
|
|
peterv6i Član
Pridružen-a: Tor 22 Jan 2008 13:30 Prispevkov: 116 Aktiv.: 0.58 Kraj: Izola
|
Objavljeno: Ned Feb 28, 2016 12:12 pm Naslov sporočila: |
|
|
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 |
|
|
peterv6i Član
Pridružen-a: Tor 22 Jan 2008 13:30 Prispevkov: 116 Aktiv.: 0.58 Kraj: Izola
|
Objavljeno: Pon Feb 29, 2016 4:23 pm Naslov sporočila: |
|
|
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 |
|
|
peterv6i Član
Pridružen-a: Tor 22 Jan 2008 13:30 Prispevkov: 116 Aktiv.: 0.58 Kraj: Izola
|
Objavljeno: Tor Feb 14, 2017 10:11 am Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 97 dni
Powered by phpBB © 2001, 2005 phpBB Group
|