Отговори на тема  [ 1 мнение ] 
PIC24F CTMU 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 20, 2013 5:18 pm
Мнения: 381
Местоположение: България
Мнение PIC24F CTMU
Здравейте отново с поредния новашки въпрос. Някой знае ли как се подкарва CTMU за тъч бутон? Аз пробвам тук, обаче се получава обратното на това, което пише. Използвам документацията на Микрочип само.
Кодът за ADC и CTMU е това:
Код:
void touch_setup()
{

    //CTMUCON - CTMU Control register
    CTMUCON = 0x1090; //make sure CTMU is disabled
    // CTMU continues to run when emulator is stopped,CTMU continues
    // to run in Idle mode, Time Generation mode enabled, Edges are
    // blocked. No edge sequence order, Analog current source not
    // grounded, trigger output disabled, Edge2 polarity = positive level,
    // Edge2 source = source 0, Edge1 polarity = positive level,
    // Edge1 source = source 0, Set Edge status bits to zero

    //CTMUICON - CTMU Current Control Register
    CTMUICON = 0x0300;

    //setup ADC
    AD1PCFG = 0xFFDF;                       //RA3(AN5) is analog
    AD1CHS = 0x0005;                        //Positive input for MUX A is AN5
    AD1CON1 = 0x8000;                       

    AD1CON2 = 0x0000;                       //Vss & Vdd are references
                                            //MUX A, do not scan inputs, 16-word buffer
    AD1CON3 = 0x0000;
    AD1CSSL = 0;

    //enable CTMU
    CTMUCONbits.CTMUEN = 1;
}

Тази фунцкия се извиква в началото на програмата. В main() има една while(1), където извиквам следната функция и изпращам резултата към UART-а:
Код:
unsigned int read_touch_button()
{
    unsigned int i;                         //needed from DELAY macro

    AD1CON1bits.SAMP = 1;                   //manual sampling start
    CTMUCONbits.IDISSEN = 1;                //drain charge on the circuit
    DELAY;                                  //wait 125uS
    CTMUCONbits.IDISSEN = 0;                //end draining

    CTMUCONbits.EDG1STAT = 1;               //begin charging circuit
    DELAY;
    CTMUCONbits.EDG1STAT = 0;               //stop charging circuit

    IFS0bits.AD1IF = 0;                     //make sure ADC int is not set
    AD1CON1bits.SAMP = 0;                   //and start conv.
    while(!IFS0bits.AD1IF);                 //wait for ADC to complete
    AD1CON1bits.DONE = 0;
    IFS0bits.AD1IF = 0;

    return ADC1BUF0;
}


Това е програмата в общи линии. ADC си работи, UART си работи - изпраща някакви стойности и т.н., но не са тези, които трябва. Според Микрочип, без да си докоснал сензора, волтажът който ADC дава е почти Vdd. В момента на докосване този волтаж трябва да падне, заради паралелния капацитет на човешкото тяло. Звучи логично, и си е добре обяснено даже. Моят сензор представлява 15х15мм двустранно фолиран текстолит, като едната страна е маса, а другата е към ADC канала. На същия има и резистор - 4,7 килоома, пак според Микрочипските указания.
Ето това излиза от ADC, без да съм докоснал сензора:
Reading from ADC: 6
Reading from ADC: 692
Reading from ADC: 818
Reading from ADC: 908
Reading from ADC: 972
Reading from ADC: 992
Reading from ADC: 1000
Reading from ADC: 1006
Reading from ADC: 1001
Reading from ADC: 1002
Reading from ADC: 1004
Reading from ADC: 1005
Reading from ADC: 1002
Reading from ADC: 1005
Reading from ADC: 1004
Reading from ADC: 1004
Reading from ADC: 1005
Reading from ADC: 1005
Reading from ADC: 1006
Reading from ADC: 1008
Reading from ADC: 1008
Reading from ADC: 1009
Reading from ADC: 1008
Reading from ADC: 1007
Reading from ADC: 1009
Reading from ADC: 1008
Reading from ADC: 1008
Reading from ADC: 1006
Reading from ADC: 1006
Reading from ADC: 1005
Reading from ADC: 969
Reading from ADC: 440
Reading from ADC: 263
Reading from ADC: 157
Reading from ADC: 83
Reading from ADC: 19
Reading from ADC: 6
Reading from ADC: 687
Reading from ADC: 817
Reading from ADC: 907
Reading from ADC: 973
Reading from ADC: 992
Reading from ADC: 999
Reading from ADC: 1007
Reading from ADC: 1008
Reading from ADC: 1008
Reading from ADC: 1008
Reading from ADC: 1007
Reading from ADC: 1008
Reading from ADC: 1008
Reading from ADC: 1009
Reading from ADC: 1004
Reading from ADC: 1007

Ако всички стойности са над 1000, добре - но те спадат до почти 0. Нямам осцилоскоп вкъщи и не мога да видя какво всъщност се случва. А когато си сложа пръста на сензора, волтажът вместо да падне, се покачва:

Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023
Reading from ADC: 1023

Ето това е. Точно обратното на това, което трябва да се случи.
Опитах с добавяне на време между четенето на сензора, но си е все същото. Повече време за зареждане - разреждане също не сработва.
Малко помощ е добре дошла :) Сигурно е нещо малко, но като не мога да го видя - трудна работа.


Пон Окт 21, 2013 3:08 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 1 мнение ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 27 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни