Мазмұны:

PIC16F886 микроконтроллері бар сыйымдылық сенсоры: 3 қадам
PIC16F886 микроконтроллері бар сыйымдылық сенсоры: 3 қадам

Бейне: PIC16F886 микроконтроллері бар сыйымдылық сенсоры: 3 қадам

Бейне: PIC16F886 микроконтроллері бар сыйымдылық сенсоры: 3 қадам
Бейне: Лучший итальянский Оссобуко, Ризотто! Очень вкусное итальянское блюдо. 2024, Қараша
Anonim
PIC16F886 микроконтроллері бар сыйымдылық сенсоры
PIC16F886 микроконтроллері бар сыйымдылық сенсоры

Бұл оқулықта біз PIC16F886 микроконтроллерін сыйымдылықтағы айырмашылықтарды анықтау үшін қалай қолдануға болатынын қарастырамыз, оны кейін сенсорлық тақтаның басылғанын білу үшін қолдануға болады. Бұл жобаны жасамас бұрын суретті микроконтроллерлермен танысу жақсы.

1 -қадам: Электр тізбегін қосыңыз

Электр тізбегін қосыңыз
Электр тізбегін қосыңыз

Алдымен, схеманы жоғарыдағы схемаға сәйкес қосудан бастайық. Сенсорлық тақтаны жасау үшін алюминий фольганы шаршыға және сымға таспамен бүктеуге болады. Сіз 100k резисторының әр түрлі мәндерімен тәжірибе жасай аласыз, мен 100k мен үшін жақсы жұмыс істеді деп таптым.

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

Сенсорлық тақта сіз мен электр тізбегі арасындағы үлкен сыйымдылыққа байланысты болғандықтан, батарея жұмыс істемеуі мүмкін.

2 -қадам: тақырыптық файл

Тақырып файлы
Тақырып файлы

Барлық байланыстар аяқталды ма? Жақсы, біз тақырып файлын жалғастырамыз. Біз XC8 компиляторын қолданамыз және тақырыпта айтылғандай, сіз енді жобаңызда жаңа тақырып файлын құрып, келесі кодты көшіріп қойыңыз. Сіз оны негізгі кодтың үстіне тақырыптық файлсыз көшіріп қоюға болады.

#CALIBRATION_SAMPLE 20 -ды анықтаңыз #TOUCH_SAMPLE 10 -ді анықтаңыз #ТАСЫРУ_УАҚЫТЫН 5 анықтаңыз

int count;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // өлшенетін разряд сыйымдылығы RC4 = 0; _кідіріс_көшу (ТҮСІРІЛУІ_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 (толеранттылық) {

// бірнеше үлгілердің орташа мәні екі есе орташа = 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; // клиринг санау мәндері count = 0; // калибрлеу мәндерін тазарту calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // калибрлеуді іске қосу кезінде калибрлеуді іске қосыңыз (); }

3 -қадам: Негізгі кодты жазу

Негізгі кодтан бастап, алдыңғы қадамда жасалған тақырып файлын қосу қажет. Келесі код isTouching функциясын коммутатор ретінде қолдануға болатын мысал. Менің жағдайда тақырыпқа capacitiveTouch.h атауын бердім.

#қосу

#«capacitiveTouch.h» қосыңыз

// бұл айнымалы түйменің басылмағанын немесе басылмағанын айтады

int lastState = 0;

void main () {

// TRCCbits шығысы ретінде RC5 параметрін орнату. TRISC5 = 0; // setupCapacitiveTouch () бағдарламасын іске қосқанда осы функцияны шақыру қажет; _ кешіктіру (1000); // дәл баптаудан кейін калибрлеу calibrate (); while (1) {// егер (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0 болса, түйменің басылып жатқанын тексеру; басқасы RC5 = 1; lastState = 1; } // батырманың босатылатынын тексеру if if (lastState == 1 &&! isTouching (15)) lastState = 0; _ кешігу (20); }}

калибрлеу:

Бұл функция calibrationValue айнымалылары деп аталатын кезде maxCalibrationValue және minCalibrationValue жаңартылады. calibrationValue isTouching функциясында қолданылады. Есіңізде болсын, калибрлеу кезінде сенсорлық тақта жалғыз қалуы керек.

setupCapacitiveTouch:

Бағдарламаның басында қоңырау шалу қажет. Ол басқа функцияларда қолданылатын қажетті биттерді орнатады. Ол калибрлеуді де жүргізеді. Дегенмен, мен бір секунд күтіп, калибрлеуді бөлек бөлек жүргізу арқылы жақсы нәтижеге қол жеткіздім.

тиіп тұр:

Бұл функция C12IN0 бойынша сыйымдылықтың жоғарылауын анықтаса 1 қайтарады, ал сыйымдылық калибрлеу кезіндегіге жақын болса 0 қайтарады. Қарапайым тілмен айтқанда, егер біреу тақтаға қол тигізсе, isTouching функциясы 1 -ге оралады. Функция сонымен қатар параметрді енгізу ретінде қалайды, бұл оның іске қосылуына төзімділік. Толеранттылық мәні неғұрлым жоғары болса, соғұрлым ол сезімтал болады. Менің қондырғымда 15 жақсы жұмыс істеді, бірақ бұл оксилятор жиілігіне және оны басқан кезде сыйымдылықтың қосылу дәрежесіне байланысты болғандықтан, сізге сәйкес келетін нәрсені тапқанша осы мәнмен тәжірибе жасау керек.

getChargeTime:

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

Ұсынылған: