Loyihangizni qurganingizdan so'ng, u quyidagi rasmda shunday ko'rinishi kerak
Ko'rib turganingizdek, motorni va zal sensorini yaqin joyga joylashtirish uchun ikkita qutidan foydalandim. Siz magnitni aylanadigan ob'ektingizga o'rnatishingiz va unga yaqin joylashgan zal sensorini magnitni aniqlay oladigan tarzda mahkamlashingiz mumkin.
Eslatma: Hall sensori qutblarga ega, shuning uchun u qaysi qutbni aniqlayotganiga ishonch hosil qiling va uni mos ravishda joylashtiring.
Bundan tashqari, zal sensorining chiqish piniga ega bo'lgan tortishish qarshiligidan foydalanganingizga ishonch hosil qiling.
Simulyatsiya:
Ushbu loyiha uchun Simulyatsiya Proteus yordamida amalga oshiriladi. Loyiha harakatlanuvchi ob'ektlarni o'z ichiga olganligi sababli, simulyatsiya yordamida to'liq loyihani namoyish qilish mumkin emas, lekin LCD ishini tekshirish mumkin. Hex faylni Simulyatsiyaga yuklang va uni simulyatsiya qiling. LCD displey quyida ko'rsatilganidek ishlayotganini ko'rishingiz mumkin.
Spidometr va odometr ishlayotganligini tekshirish uchun men Hall sensorini Logic state qurilmasiga almashtirdim. Simulyatsiya paytida siz uzilishni ishga tushirish uchun mantiqiy holat tugmasini bosishingiz va tezlik va masofa yuqorida ko'rsatilganidek yangilanayotganligini tekshirishingiz mumkin.
PIC16F877A-ni dasturlash:
Yuqorida aytib o'tilganidek, biz g'ildirakning bir marta to'liq aylanishi uchun zarur bo'lgan vaqtni hisoblash uchun PIC16F877A mikrokontrolleridagi taymerlar va uzilishlar yordamida foydalanamiz. Taymerlardan qanday foydalanishni biz oldingi darsimizda allaqachon bilib oldik . Men ushbu maqolaning oxirida loyihaning to'liq kodini berdim. Keyinchalik men quyida bir nechta muhim qatorlarni tushuntirdim.
Quyidagi kod satrlari D portini LCD interfeysi uchun chiqish pinlari va RB0 ni tashqi PIN sifatida ishlatish uchun kirish pinlari sifatida ishga tushiradi. Bundan tashqari, biz OPTION_REG yordamida ichki tortishish rezistorini yoqdik va 64 ni oldindan sotuv sifatida o'rnatdik. Keyin taymer va tashqi uzilishni yoqish uchun Global va periferik uzilishni yoqamiz. RB0 ni tashqi uzilish biti sifatida aniqlash uchun INTE yuqori bo'lishi kerak. To'ldirilishi qiymati 100 qilib o'rnatiladi, shunda har 1 millisekundda TMR0IF taymer uzilish bayrog'i ishga tushadi. Bu millisekundda olingan vaqtni aniqlash uchun millisekundli taymerni ishga tushirishga yordam beradi:
TRISD = 0x00; //PORTD LCD interfeysi uchun chiqish sifatida e'lon qilindi
TRISB0 = 1; //RB0 pinini uzilish pinini sifatida ishlatish uchun kirish sifatida aniqlang
OPTION_REG = 0b00000101; // Timer0 64 preskalyar sifatida // Shuningdek, PULL UP ni ham yoqadi
TMR0=100; // 1ms uchun vaqt qiymatini yuklang; delayValue faqat 0-256 oralig'ida bo'lishi mumkin
TMR0IE=1; //PIE1 registrida taymerni uzish bitini yoqish
GIE=1; // Global uzilishni yoqish
PEIE=1; //Periferik uzilishni yoqing
INTE = 1; // RB0 ni tashqi uzilish pin sifatida yoqing
Quyidagi funksiya har safar uzilish aniqlanganda bajariladi. Funktsiyani o'z xohishimizga ko'ra nomlashimiz mumkin, shuning uchun uni speed_isr() deb nomladim. Bu dastur ikkita uzilish bilan shug'ullanadi, biri Timer Interrupt, ikkinchisi esa tashqi uzilish. Taymer uzilishi sodir bo'lganda, TMR0IF bayrog'i yuqoriga ko'tariladi, uzilishni tozalash va qayta o'rnatish uchun quyidagi kodda ko'rsatilganidek, TMR0IF=0 ni belgilash orqali uni pasaytirishimiz kerak.
void interrupt speed_isr()
{
if(TMR0IF==1) // Taymer oshib ketdi
{
TMR0IF=0; // Taymerning uzilish belgisini o'chirish
milli_sec++;
}
agar (INTF==1)
{
aylanish tezligi = (1000/milli_sek) * 60;
tezlik = 0,3 * rpm * 0,37699; // (g'ildirak radiusi 30 sm deb faraz qilingan holda)
INTF = 0; // uzilish belgisini tozalang
milli_sek=0;
masofa= masofa+028,2;
}
}
Xuddi shunday, tashqi uzilish sodir bo'lganda, INTF bayrog'i yuqoriga ko'tariladi, bu ham INTF = 0 ni belgilash orqali tozalanishi kerak. Qabul qilingan vaqt taymer uzilishi tomonidan kuzatiladi va tashqi uzilish g'ildirakning bir marta to'liq aylanishni tugatganini aniqlaydi. Ushbu ma'lumotlar bilan g'ildirak bosib o'tgan tezlik va masofa har bir tashqi uzilishda hisoblanadi.
Tezlik va masofa hisoblangandan so'ng, ular LCD funksiyalarimiz yordamida LCD displeyda oddiygina ko'rsatilishi mumkin. Agar siz LCD displeylar uchun yangi bo'lsangiz, PIC16F877A MCU o'quv qo'llanmasiga ega bo'lgan LCD interfeysimizga qarang .