- Reikalingos medžiagos:
- Skaičiuojamas greitis ir nuvažiuotas atstumas:
- Grandinės schema ir techninės įrangos sąranka:
- Modeliavimas:
- PIC16F877A programavimas:
- Darbinis paaiškinimas:
Transporto priemonės ar variklio greičio / apsisukimų dažnio matavimas mums visada buvo įdomus projektas. Taigi šiame projekte mes ketiname pastatyti vieną naudodami pramoninius PIC mikrovaldiklius. Norėdami išmatuoti greitį, naudosime magnetą ir „Hall“ jutiklį. Yra ir kitų būdų / jutiklių greičio matavimui, tačiau salės jutiklio naudojimas yra pigus ir taip pat gali būti naudojamas bet kokio tipo varikliams / transporto priemonėms. Atlikdami šį projektą, mes taip pat patobulinsime savo įgūdžius mokantis PIC16F877A, nes projektas apima pertraukiklių ir laikmačių naudojimą. Šio projekto pabaigoje galėsite apskaičiuoti bet kokio besisukančio objekto greitį ir atstumus ir juos parodyti 16x2 LCD ekrane. Pradėkime nuo šio skaitmeninio spidometro ir odometro grandinės su PIC.
Reikalingos medžiagos:
- PIC16F877A
- 7805 Įtampos reguliatorius
- „Hall“ efekto jutiklis (US1881 / 04E)
- 16 * 2 LCD ekranas
- Mažas gabalėlis magneto
- Jungiamieji laidai
- Kondensatoriai
- Bandomoji Lenta.
- Maitinimo šaltinis
Skaičiuojamas greitis ir nuvažiuotas atstumas:
Prieš pradėdami kurti grandinę, supraskime, kaip naudosimės Hallo jutiklį ir magnetą rato greičiui apskaičiuoti. Anksčiau mes naudojome tą pačią techniką kurdami „Arduino“ spidometrą, kuris rodo „Android“ išmaniojo telefono rodmenis.
„Hall“ jutiklis yra įtaisas, kuris gali nustatyti magneto buvimą pagal jo poliškumą. Ant rato užklijuojame nedidelį magneto gabalėlį ir šalia jo uždedame salės jutiklį taip, kad kiekvieną kartą, kai ratas suktųsi, salės jutiklis jį aptiktų. Tada mes naudojame laikmačių ir pertraukimų pagalbą savo PIC mikrovaldiklyje, kad apskaičiuotume laiką, kurį reikia visam rato pasukimui.
Kai bus žinomas laikas, mes galime apskaičiuoti RPM, naudodami toliau pateiktas formules. Kur 1000 / užtrukęs laikas suteiks mums RPS, o padauginus jį iš 60, gausime RPM
aps./min = (1000 / timetaken) * 60;
Kur (1000 / timetaken) duoda apsisukimų skaičių (apsisukimus per sekundę) ir jis padauginamas iš 60, kad apsisukimai apsisuktų į aps / min (apsisukimai per minutę).
Norėdami apskaičiuoti transporto priemonės greitį, turime žinoti rato spindulį. Savo projekte panaudojome mažą žaislinį ratuką, kurio spindulys yra vos 3 cm. Tačiau, mes prielaidą, kad rato spindulys turi būti 30 cm (0,3M), kad mes galime vizualizuoti rodmenis.
Vertė taip pat padauginta iš 0,37699, nes žinome, kad greitis = (RPM (skersmuo * Pi) / 60). Formulės yra supaprastintos iki
v = rato spindulys * aps / min * 0,37699;
Apskaičiavę greitį, taip pat galime apskaičiuoti nuvažiuotą atstumą taikydami panašų metodą. Naudodami „Hall“ ir magnetų išdėstymą, žinome, kad kiek kartų ratas pasisuko. Mes taip pat žinome rato spindulį, pagal kurį galime rasti rato apimtį, darant prielaidą, kad rato spindulys yra 0,3 m (R), o apskritimo Pi * R * R reikšmės bus 0,2827. Tai reiškia, kad kiekvieną kartą, kai salės jutiklis susitinka su magnetu, ratas įveikia 0,2827 metrų atstumą.
Distance_covered = atstumas_dengtas + apskritimo_apskritimas
Kadangi dabar mes žinome, kaip šis projektas veiks, galime pereiti prie mūsų schemos ir pradėti ją kurti.
Grandinės schema ir techninės įrangos sąranka:
Šio spidometro ir odometro projekto schema yra labai paprasta ir gali būti pastatyta ant duonos lentos. Jei laikėtės PIC mokymo programų, taip pat galite pakartotinai naudoti aparatinę įrangą, kurią naudojome mokydamiesi PIC mikrovaldiklius. Čia mes naudojome tą pačią perf plokštę, kurią sukūrėme LED mirksi su PIC mikrovaldikliu, kaip parodyta žemiau:
PIC16F877A MCU kaiščių jungtys pateiktos toliau pateiktoje lentelėje.
S.Ne: |
PIN kodas |
PIN vardas |
Prisijungęs prie |
1 |
21 |
RD2 |
LCD ekranas |
2 |
22 |
RD3 |
LCD ekranas |
3 |
27 |
RD4 |
D4 skystųjų kristalų ekranas |
4 |
28 |
RD5 |
D5 skystųjų kristalų ekranas |
5 |
29 |
RD6 |
D6 skystųjų kristalų ekranas |
6 |
30 |
RD7 |
D7 skystųjų kristalų ekranas |
7 |
33 |
RB0 / INT |
3 -asis Hall jutiklio kaištis |
Kai sukursite savo projektą, jis turėtų atrodyti panašiai, kaip parodyta žemiau esančiame paveikslėlyje
Kaip matote, aš panaudojau dvi dėžes, kad variklį ir salės jutiklį padėčiau netoliese. Galite pritvirtinti magnetą ant besisukančio objekto ir sugadinti prie jo esantį salės jutiklį taip, kad jis galėtų aptikti magnetą.
Pastaba: Halės jutiklis yra poliariškas, todėl įsitikinkite, kurį stulpą jis aptinka, ir padėkite jį atitinkamai.
Taip pat įsitikinkite, kad naudojate „Pull-up“ rezistorių su salės jutiklio išvesties kaiščiu.
Modeliavimas:
Šio projekto modeliavimas atliekamas naudojant „Proteus“. Kadangi projektas susijęs su judančiais objektais, neįmanoma parodyti viso projekto naudojant modeliavimą, tačiau LCD veikimą galima patikrinti. Paprasčiausiai įkelkite šešioliktainį failą į modeliavimą ir jį imituokite. Galėsite pastebėti, kad skystųjų kristalų ekranas veikia taip, kaip parodyta žemiau.
Norėdami patikrinti, ar veikia spidometras ir odometras, „Hall“ jutiklį pakeičiau „Logic“ būsenos įtaisu. Modeliavimo metu galite spustelėti loginės būsenos mygtuką, kad suaktyvintumėte pertraukimą ir patikrintumėte, ar įveikiamas greitis ir atstumas atnaujinamas, kaip parodyta aukščiau.
PIC16F877A programavimas:
Kaip minėjome anksčiau, naudosime laikmačių ir pertraukiklių pagalbą PIC16F877A mikrovaldiklyje, kad apskaičiuotume laiką, kurį reikia visam rato pasukimui. Mes jau sužinojome, kaip naudotis laikmačiais mūsų perprastoje mokymo programoje. Šio straipsnio pabaigoje pateikiau visą projekto kodą. Toliau aš paaiškinau keletą svarbių eilučių.
Žemiau nurodytos kodo eilutės inicializuoja D prievadą kaip išvesties kaiščius LCD sąsajai ir RB0 kaip įvesties kaištį, kad jį būtų galima naudoti kaip išorinį kaištį. Be to, mes įgalinome vidinį traukimo rezistorių naudodami „OPTION_REG“, taip pat nustatėme 64 kaip išankstinį. Tada mes įgaliname visuotinį ir periferinį pertraukimą, kad įjungtume laikmatį ir išorinį pertraukimą. Norint apibrėžti RB0 kaip išorinį pertraukimo bitą, INTE turėtų būti didelis. Nustatyta, kad perpildymas yra 100, kad kas 1 milisekundę suveiktų laikmačio pertraukimo vėliava TMR0IF. Tai padės paleisti milisekundės laikmatį, kad nustatytumėte laiką, kurį reikia milisekundėmis:
TRISD = 0x00; // PORTD deklaruota kaip sąsajos LCD TRISB0 išvestis = 1; // DE Apibrėžkite kaištį RB0 kaip įvestį, kurį norite naudoti kaip pertraukimo kaištį OPTION_REG = 0b00000101; // „Timer0 64“ kaip išankstinis skalė // Taip pat įgalina PULL UPs TMR0 = 100; // Įkelkite laiko vertę 1 ms; „delayValue“ gali būti tik tarp 0–256 TMR0IE = 1; // Įjungti laikmačio pertraukimo bitą PIE1 registre GIE = 1; // Įgalinti visuotinį pertraukimą PEIE = 1; // Įgalinti periferinį pertraukimą INTE = 1; // Įjungti RB0 kaip išorinį pertraukimo kaištį
Žemiau pateikta funkcija bus vykdoma kiekvieną kartą, kai aptinkamas pertraukimas. Mes galime pavadinti funkciją pagal savo norus, todėl aš ją pavadinau kaip speed_isr (). Ši programa susijusi su dviem pertraukimais, vienas iš jų yra laikinas pertraukimas, o kitas - išorinis pertraukimas. Kai įvyksta laikmačio pertraukimas, vėliava TMR0IF eina aukštai, kad išvalytume ir iš naujo nustatytume pertraukimą, turime jį padaryti žemą apibrėždami TMR0IF = 0, kaip parodyta žemiau esančiame kode.
negaliojantis pertraukimo greitis_isr () {if (TMR0IF == 1) // Laikmatis perlėkė {TMR0IF = 0; // Išvalyti laikmačio pertraukimo vėliavą milli_sec ++; } if (INTF == 1) {rpm = (1000 / milli_sek) * 60; greitis = 0,3 * aps / min * 0,37699; // (Darant prielaidą, kad rato spindulys yra 30 cm) INTF = 0; // išvalyti pertraukimo vėliavą milli_sec = 0; atstumas = atstumas + 028,2; }}
Panašiai, kai įvyksta išorinis pertraukimas, vėliava INTF bus aukšta, tai taip pat turėtų būti išvalyta apibrėžiant INTF = 0. Laiko pertraukimas stebi nustatytą laiką, o išorinis pertraukimas nustato, kada ratas sukasi vieną kartą. Turint šiuos duomenis, kiekvieno išorinio pertraukimo metu apskaičiuojamas rato įveiktas greitis ir atstumas.
Apskaičiavus greitį ir atstumą, juos galima tiesiog parodyti LCD ekrane, naudojant mūsų LCD funkcijas. Jei dar nesinaudojote skystųjų kristalų ekranais, kreipkitės į mūsų sąsajų skystųjų kristalų ekraną su PIC16F877A MCU pamoka.
Darbinis paaiškinimas:
Paruošę techninę ir programinę įrangą, paprasčiausiai įkelkite kodą į savo PIC16F877A. Jei esate visiškai naujas PIC vartotojas, turėtumėte perskaityti keletą vadovėlių, kaip žinoti, kaip įkelti programą į PIC16F877A mikrovaldiklį.
Parodymo tikslais variklio greitį sureguliuoju kintamuoju POT. Taip pat galite naudoti tą patį, norėdami rasti programą realiuoju laiku. Jei viskas veikia taip, kaip tikėtasi, turėtumėte sugebėti įveikti greitį km / val. Ir atstumą metrais, kaip parodyta toliau pateiktame vaizdo įraše.
Tikiuosi, kad jums patiko projektas ir jį pavyko įgyvendinti. Jei ne, galite paskelbti savo abejones naudodamiesi komentarų skiltimi arba forumu.