Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: COM-portin lukeminen (VB)

Sivun loppuun

Jee Jee [21.08.2007 13:19:56]

#

Onkohan mitään tapaa kiertää VB:n timer-funktion ongelma.
Siis kyseessä on mikrobitin balanssi-ohjaimen kytkentä / softa, jolla luetaan COM-portin nastaa ja mitataan impulssien välistä aikaa. Tarkoitus oli käyttää systeemiä moottorin kierroslukuun. (Optoledillä ja reijän omaavalla muovikiekolla)

Ongelma on se, että jos portin nastat sulkee yhteen ja tekee mittauksen, on tulos 0, kuten kuuluukin. Jos taas jättää nastat avonaisiksi, on tulos millloin mitäkin. Ilmeisesti syynä on windowsin moniajo ja ohjelman silmukan kiertämiseen menee joka kerralla hiukan eri aika.

Yksi toimiva systeemi oli lukea biosin kellon ajasta sekunteja ja laskemalla impulssien lukumäärä sekunnin aikana. Sekunti aikana on omaan käyttööni liian pitkä ja impulssien lukumäärän sijaan pitäisi lukea kahden impulssin välinen aika.

Joten onko mitään mahdollisuutta kiertää ongelmaa ohjelmallisesti, vai vaaditaanko systeemiin pakostakin erillinen A/D-muunnin / datalogger, yms. jonka kellopiiriltä saataisiin tarkka aika ?

Antti Laaksonen [21.08.2007 14:14:33]

#

Tarkempia ajastimia on ainakin saatavilla: WinAPIn funktiot timeGetTime ja QueryPerformanceCounter.

Jälkimmäisen käytöstä on koodivinkki:
https://www.ohjelmointiputka.net/koodivinkit/23512-vb6-tarkkaa-ajanmittausta

Tämä keskustelu taitaa liittyä vähän samaan asiaan:
https://www.ohjelmointiputka.net/keskustelu/14323-mousedown

Grez [21.08.2007 14:46:46]

#

Järkevin ratkaisu on laittaa siihen ulkoinen mikrokontrolleri joka mittailee noita aikoja ja ilmoittaa ne numeerisina PC:lle vaikka sen sarjaportin kautta. Kustannukset luokkaa 2 euroa plus koodaukseen menevä aika.

Sarjaportti ei missään tapauksessa ole Windowsista käsin mikään kovinkaan tarkka aikamittaaja.

Jee Jee [21.08.2007 15:10:29]

#

Grez kirjoitti:

Järkevin ratkaisu on laittaa siihen ulkoinen mikrokontrolleri joka mittailee noita aikoja ja ilmoittaa ne numeerisina PC:lle vaikka sen sarjaportin kautta. Kustannukset luokkaa 2 euroa plus koodaukseen menevä aika.

Sarjaportti ei missään tapauksessa ole Windowsista käsin mikään kovinkaan tarkka aikamittaaja.

Nuo tulleet linkit ei lity suoranaisesti tähän ja ne olikin jo tuttuja entuudestaan. (kummastakaan ei ollut apua)

Sitten tuosta mikrokontrollerista, että tämän toteuttaisin ilman muuta, jos riittävän selkeän rakennusohjeen jostain saisi. Oma elektroniikkaosaaminen kun nyt tahtoo rajoittua tasolle: vastuksien, diodien, konkkien ja jänitesuuruuksien jonkinasteiseen (alkeis)ymmärtämiseen. Valmiin A/D muuntimen ostaminenkaan ei oikein kiehdo. Tahtovat hinnat olla sitä luokkaa, että ei tule kysymykseen.

Grez [21.08.2007 15:32:28]

#

No rakentaminenhan on äärimmäisen yksinkertaista. Mikrokontrollerille käyttöjännite, mitattava pulssi yhteen jalkaan (väliin vastus) ja ulostulo COM-portin RX-nastaan (väliin vastus). Jos halutaan parempi kuin noin 4% tarkkuus, eli mikrokontrollerin sisäinen R/C-kello ei riitä, niin sitten lisäksi yksi kide ja kaksi keraamista kondensaattoria mikrokontrollerin kellojalkoihin.

Sen koodin kirjoittaminen mikrokontrollerille on ehkä sitten työläämpi homma, joskin sekin on aika triviaalia kun vähän viitsii opetella.

Jee Jee [21.08.2007 16:23:43]

#

Grez kirjoitti:

No rakentaminenhan on äärimmäisen yksinkertaista...

Suhteellinen käsite :)
Itselleni tuo ohje selitti vain perusperiaatteen. Tuon perusteella en toimivaa saa aikaiseksi. Ohjelmointipuoli taasen olisi itselleni se helpompi osa systeemissä. Taitaa toistaiseksi jäädä homma toteuttamati ja tyytyminen on esim. auton kierroslukumittariin. Sillä vain ei saa muodostettua kierrosten muuttumisnopeudesta käyrästöä, kuten olisi seurattaessa kierroksia tietokonella.

Grez [21.08.2007 17:22:50]

#

Riittävän yksinkertainen?

http://grez.info/putka/kierrosnopeuslaskuri.gif

C1 ja C2 määräytyy sen mukaan minkä kiteen hommaat. Jos kide (Q1) on mitoitettu esim. 30pF kondensaattoreille, niin sitten sekä C1 että C2 on 30pF. Kiteen taajuus 3,6864MHz on valittu sillä perusteella että niitä saa halvalla (noin 20 snt) ja siitä on helppo generoida mikä tahansa RS-232 taajuus, esim 115200 tai 38400 bps.

PIC16F688 on valittu perusteella että maksaa alle euron. Jos tykkäät koodata ennemmin AVR:lle niin sieltäkin löytynee, en vaan tykkää niiden sivujen hakutoiminnoista (tai niiden puutteesta)

X1 on RS-232 -liitin.

Eli tuosta ei puutu mitään muuta kuin koodi.

Jee Jee [21.08.2007 17:59:51]

#

Kiitti. Ihan selkeä kytkentä. Yritetään saada aikaiseksi.
Tuosta signaalin otosta piti vaan vielä kysyä, että minkä suuruista jännitettä tuolle uskaltaa antaa?. (vai onko vastus R2 valittu tuon +5v. jännitelähteen mukaan ?)

Jos tarkoitus on myöhemmin lisätä toinenkin optoled lukemaan toisen moottorin kierroksia, niin muuttuuko kytkentä tuosta kovinkin monimutkaiseksi, vai riittääkö toisen input:in liittäminen johonkin toiseen piirin nastaan ja mikä mahtaisi olla silloin järkevin nasta lukea impulssia com-portista?.
(Siis optoled(it) toimivat rakenteessa kuten katkaisija, joka muuttuu johtavaksi joka kierroksella. Ja kyseessä on polttomoottorin kierrosten seuranta. ei sähkömoottorin, mutta toki tolla optoledillä voidaan kyllä seurata mitä tahansa pyörivää laitetta.)

Toistaiseksi en tarvitse, kuin yhden moottorin kierrosluvun muutoksista saatua dataa, mutta lopullinen fyysinen rakenne tulee ilmeisimmin olemaan 2:n moottorin seuranta (samanaikaisesti). Ihan oikeasti tämä elektroniikkapuoli on mulle suurimmaksiosaksi hebreaa. Ohjelmapuolella taas pärjäänkin.

Grez [21.08.2007 18:15:07]

#

Tuo jännite jolla signaali tulee voi olla aika korkeakin, ainakin 12V menee ihan heittämällä. Tosin ehkä jos tiedetään että signaali on vaikka 12V-15V niin kannattaisi pistää tuohon esim. 100k vastus ja sitten 50k (tai 47k) vastus piirin jalan 13 ja maan välille, jolloin piiri saisi 4-5V tasoista signaalia ja virta olisi vain 0,09mA.

Jos tarvitsee laittaa lisää lähtöjä, niin niitä saa periaatteessa vaikka jokaiseen vapaaseen nastaan. Järkeviä nastoja ovat kaikki A-portin nastat, koska niissä on interrupt-on-change. Tosin sinänsä aika sama, voihan niitä loopissakin pyörittää, jolloin keskeytyksestä ei ole hyötyä.

(Ja noi A-portin nastat löytyy datalehdestä, joudut joka tapauksessa vilkaisemaan sitä kun lähdet koodaamaan. Toi nasta mihin se nyt on kytketty on A1 eli A-portin eka bitti)

Ohjelmapuolella tekisin varmaan niin, että tuohon input-nastaan keskeytys ja se nappais sitten aina laskurista kuinka monta kellojaksoa on edellisestä keskeytyksestä. Tuolla kiteellähän tulee 921600 kellojaksoa sekunnissa. Eli yhdellä pinnillä saat laskettua ajat 1/921600 sekunnin tarkkuudella. Se voisi sitten ulostaa laskurin arvon vaikka heksana sarjaporttiin josta sitten sarjaporttia kuunteleva softa saa yksinkertaisella jakolaskulla laskettua mitä se käytännössä tarkoittaa. Toki jos haluat niin voit tehdä valmiiksi pureskellut luvut suoraan piirissäkin, mutta se voi olla vähän tuskaisampaa kun tuossa piirissä ei muistaakseni ole vakiona jakolaskua...

Jee Jee [21.08.2007 20:34:06]

#

Kiitän.
Jos tuo ei tunnu onnistuvan, niin pitänee sitten perehtyä sarjaportin suoralukuun ihan puhtaassa dossissa ilman winukan sotkemista.

groovyb [24.08.2007 19:51:30]

#

siis rakennatko takometriä?

millaiselle moottorille?

meinaan sä voit suorittaa laskemallakin tuon kierrosnopeuden.
jos tiedät jännitteen millä sitä ajat sitä moottoria meinaan.

tasavirtamoottorin kierrosnopeus kun muuttuu pelkästään jännitettä muuttamalla,
muuta ei tarvita.

Tasavirtamoottorin vääntömomenttisäätökin on yksinkertaista, koska ankkurivirta määrää suoraan verrannollisesti vierasmagnetoidun tasavirtakoneen vääntömomentin.

com portin jännitteenlähetyskyvystä ei ole tietoa, saako sieltä lähetettyä portaattomasti millaisia jännitteitä. vai onko vaan %V ja GND / TTL HIGH ja TTL LOW

Legu [24.08.2007 20:10:22]

#

Jee_Jee kirjoitti:

kyseessä on polttomoottorin kierrosten seuranta. ei sähkömoottorin

Tässä on sytytystulpalle tulevista pulsseista laskeva (ei kylläkään sisällä kuin tuon ohjelman).

Jee Jee [24.08.2007 20:54:35]

#

groovyb kirjoitti:

...tasavirtamoottorin kierrosnopeus kun muuttuu pelkästään jännitettä muuttamalla, muuta ei tarvita...

Ei ole sähkö, vaan polttomoottori.

Myöskään tulpan impulssien luku ei onnistu, koska kyseessä on diesel moottori.
Ja selitetään nyt sitten nopeasti systeemi.

Eli moottorin kierrokset on tarkoitus lukea ja saada muodostettua impulssien käyrä suhteessa aikaan.
Tämä on ensimmäinen vaihe. Seuraavaksi pitää saada variaattorin takavariaattorinkin kierrokset selville. Homma toimii aivan samoin, kuin moottorin mittauksessakin.
Tarkoitus on tutkia ja kehittää omaa ideaa variattorista. Periaatteessa siinä pitäisi olla kitkahäviöt pienemmät, mitä normaalisti käytetyissä scootterimopoissa ja moottorikelkoissa.
Variaattorin välityssuhteen pystyy laskemaan min ja max asennoissa ja tältä väliltäkin, mutta se taas miten välityssuhde muuttuu kierrosten aikana on matemaattisesti tehtynä todella vaikeaa. (Koska variaattorin muuttuma välityssuhde on riippuvainen variaattorin jousivoiman suuruudesta, menee laskemalla tehty välitysuhteen muuttuminen suhteessa kierroslukuun erittäin vaikeaksi.)

On helpompaa mitata moottorin ja takavariaattorin kierrosnopeudet ja laskea välityssuhde ja sitäkautta saadaan todellinen kiihtyvyys selville ja laskennallisesti kitkahäviöt. Inertiaan perustuvalla kiihtyvyyden mittauksella välityssuhde on välttämätön ottaa huomioon.
Samaa hommassa siis takana mitä inertiadynamometreissä:
http://www.probyte.fi/info/autolog.htm

groovyb [24.08.2007 21:58:21]

#

okei. sitte homma vähän hankaloittuu.

pistän mietintämyssyyn.

Jee Jee [27.08.2007 17:59:40]

#

Hmm.. Näyttäisi siltä, että ongelma ratkesi.
Taidan toteuttaa systeemin äänikortilla.
http://www.kvi.nl/~nijboer/wwwtimemeasurement/timemeasurement.htm
Pitää vaan tehdä oma ohjelma, jolla saan luettua tallennetusta tiedostosta stereokanavasta impulssit. (vasempaan kanavaan tallennetaan toisen optoledin pulssit ja oikeaan toisen)

Meitzi [27.08.2007 18:14:38]

#

Mielenkiintoinen idea.

Grez [27.08.2007 19:54:44]

#

Joo, äänikortilla olen itsekin tehnyt erilaisia logiikka-analysaattorihommia jos käytetty tutkittavan signaalin/signaalien taajuus on ollut riittävän alhainen. Sinänsä ihan fiksu ajatus. Prossuaikaahan tossa menee hukkaan, mutta se on halpaa nykyään :D

groovyb [10.09.2007 22:40:43]

#

voit myös käyttää valmiita komponentteja tuohon.
Esim DXVUmeter (löytyy ainakin NET ympäristölle)

http://software.xfx.net/activex/dxvu/index.php


http://software.xfx.net/netcl/dxvunet/index.htm

DXVUMeter is an ActiveX control for monitoring audio and displaying it as digital vus, wave form and as a spectrum.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta