Мазмуну:

PIC16F886 микроконтроллери менен сыйымдуу тийүү: 3 кадам
PIC16F886 микроконтроллери менен сыйымдуу тийүү: 3 кадам

Video: PIC16F886 микроконтроллери менен сыйымдуу тийүү: 3 кадам

Video: PIC16F886 микроконтроллери менен сыйымдуу тийүү: 3 кадам
Video: Setting up a 3d Printer with MKS sGen L v1.0 Part 3 2024, Ноябрь
Anonim
PIC16F886 микроконтроллери менен сыйымдуу тийүү
PIC16F886 микроконтроллери менен сыйымдуу тийүү

Бул окуу куралында биз сыйымдуулуктагы айырмачылыктарды аныктоо үчүн PIC16F886 микроконтроллерин кантип колдонсоңуз болорун карап чыгабыз, бул кийинчерээк сенсордук панелдин басылгандыгын айтуу үчүн колдонулушу мүмкүн. Бул долбоорду жасоодон мурун микроконтроллерлер менен таанышуу жакшы.

1 -кадам: Районуңузга зым тартуу

Сиздин Circuit Up
Сиздин Circuit Up

Биринчиден, схеманы жогорудагы схемага ылайык өткөрүүдөн баштайлы. Сенсордук блокнотту жасоо үчүн алюминий фольганы төрт бурчтукка бүктөп, зымга скотч менен жабууга болот. Сиз 100k каршылыгы үчүн ар кандай баалуулуктар менен эксперимент жасай аласыз, мен 100k мен үчүн жакшы иштегенин көрдүм.

RC4 пини өлчөнө турган сыйымдуулукту заряддоону/бошотууну баштоо үчүн колдонулат. C12IN0 ички компаратордун - C1IN пини ошол эле салыштыргучтун + тарабына туташкан. Микроконтроллер C12IN0 чыңалуусу C1IN чыңалуусунан жогору болгондо сыйымдуулукту толук заряддалган деп эсептейт. Резистивдүү чыңалуу бөлүштүргүч C1IN 5 вольтко жакын экенин текшерет.

Сенсордук блокнот сиз менен схеманын ортосунда чоң сыйымдуулуктун болушунан көз каранды болгондуктан, батарея иштебей калышы мүмкүн.

2 -кадам: Баш файл

Header File
Header File

Бардык байланыштар менен бүттүңүзбү? Жакшы, биз башкы файлды улантабыз. Биз XC8 компиляторун колдонобуз жана аталышынан көрүнүп тургандай, сиз азыр долбооруңузда жаңы баш файлды түзүп, төмөнкү кодду көчүрүп чаптаңыз. Сиз аны башкы кодуңуздун үстүнө эч кандай баш файлсыз эле көчүрүп-чаптай аласыз.

#CALIBRATION_SAMPLE 20ны аныктоо #TOUCH_SAMPLE 10ду аныктоо #DISCHARGE_TIME 5ти аныктоо

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // разряд сыйымдуулугу RC4 = 0; _ кечигүү_ms (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 isTouching (int толеранттуулук) {

// бир нече үлгүлөрдүн орточо эсеби эки эсе орточо = 0; үчүн (int i = 0; i calibrationValue+tolerance) орточо ++; } орточо /= TOUCH_SAMPLE; // орточо 0 менен 1дин ортосундагы сан болот, эгерде (орточо> 0,2) 1 кайтса; return 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; // иштетүү калибрлөө баштоо калибрлөө (); }

3 -кадам: Негизги кодду жазуу

Негизги коддон баштап, мурунку кадамда түзүлгөн баш файлды кошушуңуз керек. Төмөнкү код isTouching функциясын которуштуруучу катары кантип колдонсоңуз болоруна мисал. Менин учурда мен аталышка capacitiveTouch.h атын бердим.

#кошуу

#"capacitiveTouch.h" кошуу

// бул өзгөрмө баскыч басылып же басылбаганын айтат

int lastState = 0;

бош функция(){

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

калибрлөө:

Бул функция calibrationValue өзгөрмөлөрү деп атала баштаганда, maxCalibrationValue жана minCalibrationValue жаңыртылат. calibrationValue isTouching функциясы тарабынан колдонулат. Калибрлөө учурунда сенсордук тактаны жалгыз калтыруу керек экенин унутпаңыз.

setupCapacitiveTouch:

Программанын башында чакыруу керек. Бул башка функциялар тарабынан керектүү биттерди орнотот. Ошондой эле калибрлөөнү жүргүзөт. Бирок мен бир секунд күтүп, калибрлөөнү өзүнчө кайра иштетип, жакшы жыйынтыктарга жеттим.

isTouching:

Бул функция C12IN0 боюнча сыйымдуулуктун жогорулаганын байкаса 1ди кайтарат жана сыйымдуулугу калибрлөө учурунда болгон функцияга жакын болсо 0 кайтарат. Жөнөкөй сөз менен айтканда, эгер кимдир бирөө панелге тийсе, isTouching функциясы кайтып келет. Функция ошондой эле параметр катары параметрди каалайт, бул анын иштешине болгон толеранттуулук. Толеранттуулуктун мааниси канчалык жогору болсо, ошончолук сезимтал болот. Менин орнотуумда мен 15 жакшы иштегенин таптым, бирок бул оциллятордун жыштыгына жана аны басканда канчалык сыйымдуулук кошулганына байланыштуу болгондуктан, сиз өзүңүзгө ылайыктуу нерсени тапмайынча бул маанини эксперименттешиңиз керек.

getChargeTime:

CVREF чыңалуусуна сыйымдуулукту толтуруу үчүн канча убакыт кетерин билгиңиз келгенде, бул функция аны текшерип бүтүн санды кайтарат. Убакытты секунд менен алуу үчүн сиз бул формуланы колдоносуз: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Бул формуланы isTouching функциясынан толеранттуулукту секундага чейин алуу үчүн да колдонсо болот.

Сунушталууда: