Bonsoir à tous,
Je suis sous MPLAB X et XC8 avec un PIC18f27J13.
Ce PIC a trois touches capacitives (chacune de 15x15mm) reliées à AN0, AN1 et AN2.
Niveau code je me suis inspiré de la datasheet du µC et des applications notes.
Voici ce que j'ai fait :
Dans le main() la condition sur EVT_TMR1 appelle régulièrement lecture CTMU et sa sortie en debug.Code:#define CTMU_ChargeDelay_Loop 50 #define CTMU_ChargeDelay for(i=0;i<CTMU_ChargeDelay_Loop;i++) void main(void) { UC_Config(); // se trouvent Ports_Config(), ADC_Init() et CTMU_Init() while (1) { // EVT_TMR1 - CTMU timer if (EVT_TMR1) { mTouch_Reading(); mTouch_DebugOut EVT_TMR1 = 0; TMR1ON = true; } } } void Ports_Config(void) { TRISAbits.TRISA0 = 1; // input TRISAbits.TRISA1 = 1; TRISAbits.TRISA2 = 1; ANCON0bits.PCFG0 = 0; // analog ANCON0bits.PCFG1 = 0; ANCON0bits.PCFG2 = 0; } void ADC_Init(void) { ADCON0=0; ADCON1=0; ADCON1bits.ADFM = 1; // right justified ADCON1bits.ACQT = 0b001;// 2 Tad ADCON1bits.ADCS = 0b001;// clk = Fosc/8 ADCON0bits.VCFG0 = 0; // Vref+ = Avdd ADCON0bits.VCFG1 = 0; // Vref- = Avss ADCON0bits.CHS = 0; // channel 0 ADCON0bits.ADON = 1; // ADC enable } void CTMU_Init (void) { CTMUCONL = 0; CTMUCONH = 0; CTMUCONLbits.EDG2POL = 0; CTMUCONLbits.EDG2SEL0 = 0; CTMUCONLbits.EDG2SEL1 = 0; CTMUCONLbits.EDG1POL = 0; CTMUCONLbits.EDG1SEL0 = 0; CTMUCONLbits.EDG1SEL0 = 0; CTMUICON = 0x03; // 100x 0.55µA -> 55µA CTMUCONHbits.CTMUEN = 1; } void mTouch_Reading(void) { u16 i; CTMUCONHbits.CTMUEN = 1; // Enable the CTMU CTMUCONLbits.EDG1STAT = 0; // Set Edge status bits to zero CTMUCONLbits.EDG2STAT = 0; CTMUCONHbits.IDISSEN = 1; //drain charge on the circuit Nop(); Nop(); Nop(); Nop(); Nop(); CTMUCONHbits.IDISSEN = 0; //end drain of circuit CTMUCONLbits.EDG1STAT = 1; //Begin charging the circuit CTMU_ChargeDelay; CTMUCONLbits.EDG1STAT = 0; //Stop charging circuit PIR1bits.ADIF = 0; //make sure A/D Int not set ADCON0bits.GO = 1; //and begin A/D conv. while (!PIR1bits.ADIF); //Wait for A/D convert complete CTMU_Result = ADRESH << 8; //Get the value from the A/D CTMU_Result |= ADRESL; } void mTouch_DebugOut(void) { sprintf(tabChar, "%d 0x%X\r\n", CTMU_Result, CTMU_Result); USART_puts(tabChar); }
J'ai bien des valeurs qui varient selon si j'approche plus ou moins le doigt de la touche. Par contre ce qui me gêne c'est que si j'augmente le temps de charge (CTMU_ChargeDelay), les valeurs restent les mêmes.
Logiquement elles devraient varier en rapport avec ce temps.
Est ce que quelqu'un aurait une idée ?
Merci par avance.
-----