Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Steinhart-Hart egyenlet, wikipedian megtalálod, nem tudok telefonról linkelni. De az NTC eleve nem túl pontos, kalibrálnod kell majd szerintem
Szerintem luxus a tizedfokos hőmérséklet mérés NTC-vel. Bár magának megcsinálja az ember fia. A digitális hőmérők egymás mellett is más-más hőmérsékletet mérnek. Az NTC-nek meg legalább egy klasszissal nagyobb a szórása. Ráadásul, ha egyszer jól megmelegíted a thermistort, akkor az már nem fog visszaálni az eredeti ellenállás értékére. Nem is beszélve a görbe karakterisztikáról és az öregedésről.
Ámbár, meg kell hagyni, amatőr viszonylatokban jól néz ki a tizedes fok kijelzés. A potyo listatársunk által idézett Steinhart-Hart összefüggéssel jól lehet kezelni az NTC görbe karakterisztikáját. Ajánlatos lenne felvenni az egész méréshatárra vonatkozó BETA értékét, mert a katalógus csak egy kis tartományban adja meg. pl. 25-50C között. Ezért negatív hőmérsékleteknél nagy hibával fog mérni a szerkezet. Igy a két végén lesz pontos a mérés, a közepén meg több foknyi eltérés. Vagy ahogy te is gondoltad, kell csinálni egy nagy táblázatot és azokat az értékeket olvasgatni. Lehet, hogy elég lenne 2 fokonként tárolni a táblázatban. A kettő között meg "kitalálni" a hiányzó hőfokot. Egyébként: Steinhart-Hart A Tx hőmérséklet Celsiusban: Tx=1/(1/BETA)*Ln(Rt/R25)+1/T25) ahol: Rt=thermistor pillanatnyi értéke (ohm) R25=thermistor értéke 25C nál (ohm) BETA= katalógusból kiolvasva (vagy kézzel felvéve/kiszámolva) T25=25C Kelvinben (298.15K) behelyettesítve egy példában: 10k tehermistor, Beta=4400 Tx =1/( 2.272*1e-4*Ln(0.0001*Rt) + 3.354*1e-3))- 273.15 Ide már csak be kell helyettesíteni az Rt thermistor pillanatnyi értékét és megkapod a hőfokot Celsiusban. Melegen (höhö... érted, ugye) ajánlom: Dogan Ibrahim Micrkontroller-based Temperature Monitoring and Control című könyvet. ISBN: 0750655569 Erről a témáról szinte mindent elmond, szájbarágós és PIC példaprogramok vannak benne. Én is a 125. oldal környékétől vagyok ennyire okos. Nekem több példányban is jól mért ezzel az összefüggéssel a thermistoros megoldás. Persze, a tizedfokos mérés csak ábránd maradt.
Na, végülis azt a megoldást választottam, hogy táblázatba beirogattam az értékeket, egyelőre 5 fokos felbontásban, a köztes értékeket meg kiszámoltatom a PIC-cel a köztes szakasz meredeksége és eltolása alapján. Majd megnézem a gyakorlatban mennyire pontos.
Úgy gondolom, hogy az 10k-s NTC-t sorba kötöm egy 10k-s ellenállásal, NTC lesz a föld felé, másik ellenállás megy a +5V-ra, a közös pont meg megy az analóg bemenetre. Remélem a bemenet nem viszi el észrevehetően az így kialakított feszültségosztót. Igazából a tized fokokra nem a mérés pontossága miatt van szükség, hanem a szabályozás finomhangolásához.
Ha valaki tud okosságot a könyvhöz megköszönném... nekem nem sikerült találnom!
Valami ilyesmit akartam javasolni én is. A PIC analóg bemenete nem nagyon terheli a 10k feszültségosztót. Pontosabban, nem változik dinamikusan a terhelése. Így nem eget verően fontos elválasztó erősítőt alkalmazni.
Küldtem.
Miért pont NTC? Ha analóg jelet akarsz mérni, arra is vannak olcsó szenzorok, amivel akár a tizedes pontosság is elérhető. Ezeknek 1 nagy előnye van, tényleg lineáris a karakterisztikájuk.
A hozzászólás módosítva: Márc 7, 2015
Meglévő rendszerben ilyen szenzorok vannak...
Helló!
beszereztem egy PIC16F1788-as kontrollert, de sajna a PICkit2 nem ismeri. Az lenne a kérdés, hogy ilyenkor mit lehet így utólag tenni. Nem szeretném a PICkit3-at is megvenni, inkább valami 5letes megoldás lenne jó.... köszi! Üdv: P
Átnézni a másik topikba.
....upps, köszi! Máris.
Írtam egy szép hosszú programot ...
Fordításkor kiírta hogy a ROM=80% ... Beszúrtam még négy sort és ezt az üzenetet kaptam: *** Error 71 "main.c" Line 994(0,1): Out of ROM, A segment or the program is too large KijelzoValtas Seg 01000-017FF, 079B left, need 081E Seg 01800-01FFF, 0800 left, need 081E Seg 00000-00003, 0000 left, need 081E Seg 00004-00030, 0000 left, need 081E Seg 00031-007FF, 0012 left, need 081E Seg 00800-00FFF, 0046 left, need 081E A programban már szerepelt hasonló kódrészlet mint amit a végén beírtam és ott max 1-2%-al növelte az elfoglalt ROM -ot. Ez mitól lehet?
Van legalább egy függvény, aminek 2078 utasíáshely kellene, de a 16F -eken egy program memória lap 2048 utasítás méretű. Ezeket a függvényeket fel kell "vágni" több kisebbre.
Hm ... Nekem ránézésre úgy tűnik, hogy rövidke függvényeket írtam ... igaz abból jó sokat...
Ha egy függvényből újabb függvényt hívok, majd abból újabb függvény stb. az jó lesz, vagy az egymásba ágyazott függvényeket is "összeadódnak"?
Hogyan tudom CCS-C-ben lekérdezni egy kimenet állapotát?
if (blabla) output_high(PIN_A1); //ezzel beállítom hogy 1 legyen ha jól tudom akkor az input_state(pin) az átállítja bemenetnek, és azt figyeli hogy kivülről mit küldök rá ... de nekem az kéne, hogy mit küldtem ki... Van erre C parancs? Továbbá köszönöm az eddigi segítségeket, egész jól alakul a hőmérőm... Mindenféle kaplibráció nélkül a szobai hőmérőhöz képest 1 fok az eltérés, a vizforralóban felforralt vizet 97 fokosnak méri (miután kikapcsolt és besétáltam vele a szobába), a jeges vízes próba még hátra van... A hozzászólás módosítva: Márc 13, 2015
Megvolt a jeges vizes próba is ... 0,4fok eltérés!
Úgy látszik jól számolgattam!
input_state: This function reads the level of a pin without changing the direction of the pin as INPUT() does.
igen ... ezt én is megtaláltam a súgóban...
... de zero angol tudással a google translate sem győzőtt meg róla, hogy ez az ami nekem kell...
Szerintem nyugodtan próbáld ki és/vagy szimuláld le.
LCD kijelzőn szeretnék megjeleníteni egy egész típusú változót bináris alakban. van erre valami egyszerű módszer vagy nekem kell meghatározni az egyes bitek értékét és bitenként kitenni az LCD-re?
Erre programot kell írnod.
Sziasztok,
Egy órát építek, DS1302 RTC-vel és PIC16F876A-val. CCS-C compilerrel. 6 digites hétszegmenses LED kijelző lesz a megjelenítő és azt szeretném, ha egy nyomógomb megnyomásakor az időkijelzés átváltana a dátumra. Eddig megy is minden, csak azt nem tudom megoldani, hogy a nyomógomb elengedése után pár másodpercig még a dátumot mutassa, és csak utána váltson vissza az idő kijelzésre. A vonatkozó programrészlet a következő:
Ezzel azt értem el, hogy a gomb megnyomásakor elment minden érték a kijelzőről... for ciklussal is próbáltam, de az sem az igazi (villog a kijelzés) Van valakinek ötlete, hogyan csináljam? Előre is kösz.
Közben megvilágosodtam és a for ciklus finomításával elértem, amit szerettem volna. Hátha valaki hasznát veszi:
Az 5-ös compilernél olvastam valami olyasmiről, hogy a printf függvény után gondok vannak a megszakítássokkal... van erre valami okosság?
(Lécci ne valami angol szöveget adjatok mert abból nem sokat értek!)
Még jó megoldás a lenyomott gomb figyelése, hogy csak felengedés után induljon a késleltető ciklus. Pl. While(KEY1); Ezzel a kis programrésszel addig itt áll a program futása, amíg el ne engeded a gombot.
Milyen gondok vannak a megszakítással?
CCS IDE verzió: 5.011, PIC16F690
Nálam ez a szitu, a printelés ideje alatt le van tiltva a GIE, majd úgy is marad!
Tán pont ebben a fórumban olvastam, hogy a printf függvény letiltotta a megszakításokat az 5-ös verzióban ...
Multkor véletlenül az 5 össel fordítottam le egy programot és nem működött a PIC ... aztán a 4-essel fordítva tökéletesen ment... azt sajnos nem tudom hogy hol fagyott le a program mert debuggerem nincs... de van egy LED amit a Timer1 megszakításából kapcsolgatok és az sem ment ... szóval eszembe jutott hogy lehet valami ilyesmi gond lehet ...
Hahó!
PIC16F1788-al akarok AD konverziót csinálni. Sajna a CCS függvényei nem jók ennél az típusnál így a regisztereket direkbe állítgatom. Az a tapasztalatom, hogy ha a pozitív referencia a tápfesz (+5V) akkor szépen megy a ADC de ha a FVR-et (4.096V) akarom referenciának használni akkor nagyon zajos az ADC (3-4%). A regiszterbeállítások a következők: FVRCON = 0b11000011; ADCON0 = 0b00000101; ADCON1 = 0b11010011; ADCON2 = 0b00001111; van esetleg valami 5let, tapasztalat a fixed voltage reference használatával kapcsolatban? Köszi! P
Szerintem inkább használj pergésmentesítőt.
A for() ciklusod folyamatosan újra frissíti a kijelzőt kb 1ms-os időközönként. subi már javasolta is a jó megoldást:
A te megoldásod hibás, mert ameddig KEY1 alacsony szinten van addig a feltétel folyamatosan teljesül. Persze itt feltételezzük, hogy több mint 800ms ideig tartod nyomva a nyomógombot. |
Bejelentkezés
Hirdetés |