CTMU, charge capacitive qui ne varie pas
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

CTMU, charge capacitive qui ne varie pas



  1. #1
    invitedb9b1ced

    CTMU, charge capacitive qui ne varie pas


    ------

    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 :
    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);
    }
    Dans le main() la condition sur EVT_TMR1 appelle régulièrement lecture CTMU et sa sortie en debug.

    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.

    -----

  2. #2
    RISC

    Re : CTMU, charge capacitive qui ne varie pas

    Salut,

    Il existe un exemple de code pour le CTMU sur les PIC18 mais je ne sais pas si c'est pour gérer des touches.
    Il existe des librairies (http://www.microchip.com/MLA) pour la gestion des touches capacitives mais je ne sais si elles utilisent le CTMU ou le CVD.
    Après installation des MLA Legacy (version juin 2013) tu pourras les trouver ici : C:\microchip_solutions_v2013-06-15\mTouchCapDemos\PIC18F PIC24F PIC24H dsPIC Demos
    Il existe aussi des notes d'application pour le CTMU (AN1250, AN1317)

    a+

  3. #3
    invitedb9b1ced

    Re : CTMU, charge capacitive qui ne varie pas

    Salut,

    J'ai tenté les MLA mais honnêtement c'est un bordel sans nom et je ne suis arrivé à rien... Donc j'évite.

    Pour le code d'exemple je vais voir ce que je peux faire avec. Ça mesure la capacité sur une entrée analogique donc ça correspondrait à ce que je veux, à moi de l'adapter comme mesure de switch.

    J'ai déjà lu et utilisé la AN1250 mais tu viens de me faire découvrir la AN1317, que je lirai dès que possible .

    RISC, tu as déjà utilisé le CTMU ?

    Merci et a++.

  4. #4
    RISC

    Re : CTMU, charge capacitive qui ne varie pas

    Salut,

    Que tu utilises les librairies ou pas tu peux toujours récupérer le code qui initialise et gère le CTMU.
    J'ai utilisé un kit mTouch il y a 2 ou 3 ans pour démarrer qui possède plusieurs types de clavier et plusieurs modules avec des PIC de toutes les familles. Cela permet de tester différentes configurations avant d'avoir fait son PCB qui est la partie la plus critique...
    Tu trouveras aussi un code CTMU pour les PIC24F qui a l'air récent.
    J'ai utilisé le CTMU (pour les plus gros claviers) et le CVD pour quelques touches. Les librairies changent en permanence pour intégrer des nouveaux algorithmes de filtrage qui permettent de faciliter la détection.

    a+

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/12/2013, 23h57
  2. Capacitive Touch Using Only an ADC (“CVD”)
    Par invitebee83688 dans le forum Électronique
    Réponses: 11
    Dernier message: 31/01/2013, 00h06
  3. Techno : détection capacitive
    Par LTHOMAS dans le forum Électronique
    Réponses: 3
    Dernier message: 18/01/2013, 10h21
  4. Touche sensitive capacitive
    Par Anduriel dans le forum Électronique
    Réponses: 5
    Dernier message: 24/02/2012, 19h33
  5. Dalle tactile capacitive
    Par invite7ca7439b dans le forum Électronique
    Réponses: 0
    Dernier message: 20/01/2007, 13h23
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...