Агуулгын хүснэгт:

PIC16F886 микроконтроллер бүхий багтаамжийн мэдрэгч: 3 алхам
PIC16F886 микроконтроллер бүхий багтаамжийн мэдрэгч: 3 алхам

Видео: PIC16F886 микроконтроллер бүхий багтаамжийн мэдрэгч: 3 алхам

Видео: PIC16F886 микроконтроллер бүхий багтаамжийн мэдрэгч: 3 алхам
Видео: Big Tree Tech — SKR 3EZ — Основы 2024, Арваннэгдүгээр
Anonim
PIC16F886 микроконтроллер бүхий багтаамжийн мэдрэгч
PIC16F886 микроконтроллер бүхий багтаамжийн мэдрэгч

Энэхүү гарын авлагад бид багтаамжийн ялгааг илрүүлэхийн тулд PIC16F886 микроконтроллерийг хэрхэн ашиглах талаар авч үзэх болно. Энэ төслийг хийхээс өмнө зургийн микроконтроллертой танилцсан нь дээр.

Алхам 1: Цахилгаан хэлхээг холбоно уу

Цахилгаан хэлхээгээ утсаар холбоно уу
Цахилгаан хэлхээгээ утсаар холбоно уу

Нэгдүгээрт, дээрх схемийн дагуу хэлхээг холбож эхэлье. Мэдрэгчтэй дэвсгэр хийхийн тулд хөнгөн цагаан тугалган цаасыг дөрвөлжин хэлбэртэй болгож, утсан дээр наа. Та 100k эсэргүүцлийн өөр өөр утгыг туршиж үзэх боломжтой, 100k надад сайн ажилласан болохыг олж мэдсэн.

RC4 зүү нь хэмжих конденсаторыг цэнэглэх/цэнэглэх ажлыг эхлүүлэхэд ашигладаг. C12IN0 нь дотоод харьцуулагчийн хажуу талд, C1IN зүү нь ижил харьцуулагчийн + талд холбогдсон байна. Микроконтроллер нь C12IN0 хүчдэл C1IN хүчдэлээс дээш гарах үед багтаамж бүрэн цэнэглэгдсэн гэж үздэг. Эсэргүүцэх хүчдэл хуваагч нь C1IN 5 вольтод ойрхон байгаа эсэхийг шалгадаг.

Мэдрэгч самбар нь таны болон хэлхээний газардуулгын хооронд ихээхэн багтаамж байгаа эсэхээс хамаардаг тул батерей ажиллахгүй байж магадгүй юм.

Алхам 2: Толгой файл

Толгой файл
Толгой файл

Бүх холболт дууссан уу? Сайн байна, бид толгой файлыг үргэлжлүүлнэ. Бид XC8 хөрвүүлэгчийг ашиглах болно, гарчигт дурдсанаар та одоо төсөл дээрээ шинэ толгой файл үүсгэж, дараах кодыг хуулж оруулна уу. Та үүнийг үндсэн кодынхоо дээр толгой файлгүйгээр хуулж буулгах боломжтой.

#ТООЦООНЫ_ЖИШЭЭ 20 -ийг тодорхойлох #TOUCH_SAMPLE 10 -ийг тодорхойлох #DISCHARGE_TIME 5 -ийг тодорхойлох

int тоолох;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // гадагшлуулах багтаамжийг хэмжих RC4 = 0; _хойшлох_хугацаа (DISCHARGE_TIME); // "конденсатор" -ыг бүрэн (бараг бүрэн гүйцэд) гадагшлуулах хангалттай хугацаа өгөх // таймер халих тугийг цэвэрлэх T0IF = 0; // таймер дүүрэхийг хүлээ, тоолохдоо 0 -ээс эхэл (! T0IF); T0IF = 0; // хэмжих боломжтой багтаамжийг цэнэглэж эхлэх RC4 = 1; // (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // дахин тохируулах timerCount timerCount = 0; overflowCount = 0; өгөөжийн тоо; }

int isTouch (int хүлцэл) {

// олон тооны дээжийн дундаж хоёр дахин дундаж = 0; for (int i = 0; i calibrationValue+tolerance) дундаж ++; } дундаж /= TOUCH_SAMPLE; // дундаж нь 0 -ээс 1 хүртэлх тоо байх болно, хэрэв (дундаж> 0.2) 1 буцаана; буцаах 0; }

хүчингүй шалгалт тохируулга () {

int дундаж = 0; int дээж [CALIBRATION_SAMPLE]; // дундаж утгыг авах (int i = 0; i <CALIBRATION_SAMPLE; i ++) {дээж = getChargeTime (); дундаж += дээж ; } дундаж /= CALIBRATION_SAMPLE; calibrationValue = дундаж; // max/min утгыг авах maxCalibrationValue = дээж [0]; minCalibrationValue = дээж [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = дээжүүд ; if (дээж <minCalibrationValue) minCalibrationValue = дээж ; }}

void setupCapacitiveTouch () {

// цэнэглэх/цэнэглэх зүүг гаралт болгон тохируулах, энэ тохиолдолд RC4 TRISCbits. TRISC4 = 0; // таймер тохируулах0 T0CS = 0; PSA = 1; // харьцуулагчийг тохируулах C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // клиринг тоолох утгуудын тоо = 0; // шалгалт тохируулгын утгыг цэвэрлэх calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // эхлэх calibrate дээр калибровк ажиллуулах (); }

Алхам 3: Үндсэн кодыг бичих

Үндсэн кодоос эхлэн өмнөх алхам дээр үүсгэсэн толгой файлыг оруулах шаардлагатай болно. Дараах код нь isTouching функцийг шилжүүлэгч болгон ашиглах жишээ юм. Миний хувьд би толгойд capacitiveTouch.h нэрийг өгсөн.

#оруулах

#"capacitiveTouch.h" -ийг оруулна уу

// энэ хувьсагч нь товчлуур дарагдаагүй байгаа эсэхийг хэлдэг

int lastState = 0;

void main () {

// RC5 -ийг TRISCbits гаралт болгон тохируулах. TRISC5 = 0; // програмыг эхлүүлэхийн тулд та энэ функцийг дуудах хэрэгтэй setupCapacitiveTouch (); _хойшлох_ms (1000); // яг тохируулсны дараа тохируулаарай calibrate (); while (1) {// (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; өөр RC5 = 1; lastState = 1; } // хэрэв өөр товчлуур гарч байгаа эсэхийг шалгах юм бол (lastState == 1 &&! isTouching (15)) lastState = 0; _хойшлох_ms (20); }}

шалгалт тохируулга хийх:

Энэ функцийг calibrationValue хувьсагч гэж нэрлэх үед maxCalibrationValue болон minCalibrationValue шинэчлэгдэх болно. calibrationValue нь isTouching функцэд ашиглагддаг. Тохируулах явцад мэдрэгч самбарыг ганцаараа үлдээх хэрэгтэй гэдгийг санаарай.

setupCapacitiveTouch:

Хөтөлбөрийнхөө эхэнд залгах шаардлагатай байна. Энэ нь бусад функцүүдэд хэрэглэгддэг шаардлагатай битүүдийг тохируулдаг. Энэ нь бас калибровк ажиллуулдаг. Гэсэн хэдий ч би секунд хүлээгээд илүү сайн үр дүнд хүрч, шалгалт тохируулгыг тусад нь дахин ажиллууллаа.

хүрч байна:

Энэ функц нь C12IN0 дээрх багтаамжийн өсөлтийг илрүүлсэн тохиолдолд 1 -ийг буцааж өгдөг бөгөөд хэрэв багтаамж нь шалгалт тохируулгын үеийнхтэй ойролцоо байвал 0 -ийг буцаана. Энгийнээр хэлэхэд, хэрэв хэн нэгэн дэвсгэр дээр хүрвэл isTouching функц буцаж ирэх болно. Функц нь параметрийг оролт болгон авахыг хүсдэг. Хүлцэл өндөр байх тусам мэдрэмтгий чанар буурдаг. Миний тохиргоон дээр би 15 сайн ажиллаж байгааг олж мэдсэн боловч энэ нь оксиляторын давтамж, түүнийг дарахад хэр их багтаамж нэмэгдэхээс шалтгаалж өөрт тохирох зүйлийг олох хүртэл энэ утгыг туршиж үзэх хэрэгтэй.

getChargeTime:

Хэрэв та CVREF хүчдэлд багтаамжийг цэнэглэхэд хэр удаан хугацаа шаардагдахыг мэдэхийг хүсч байвал энэ функц үүнийг туршиж үзээд бүхэл тоог буцаана. Цагийг секундын дотор авахын тулд та дараах томъёог ашиглана:

Зөвлөмж болгож буй: