Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

Sonde de niveau capacitive

compensation de température



Le projet ci dessous est destiné à mesurer la hauteur d'un mélange glycol+eau dans des réservoirs de différentes hauteurs.
La partie mécanique de la sonde d'essai est composée d'un tube de cuivre de diamètre 10mm, avec comme électrode centrale une tige de 3mm isolée par une gaine thermorétractable. c'est l'épaisseur de cette gaine qui constitue le diélectrique du condensateur variable.
La longueur est fonction du réservoir, on peut modifier l'épaisseur de l'isolant pour adapter la variation de capacité.
Le contact accidentel de l'électrode centrale avec le liquide provoque un message d'erreur "DEFAUT SONDE".
Cet ensemble est directement reliée à un picaxe 08M2 contenant le code émetteur transmettant les données par liaison RS232. Cette tête de sonde est très reduite (un 08M2 et deux condensateurs de découplage).
Ces données sont reçues par un second picaxe 08M2, gestionnaire du système.
Lorque l'on soumet la tête de capteur à des variations de température, on introduit une erreur de quelques pourcents.
Il y a dans ces µC un capteur de température interne donnant une variable fonction de cette température.
La lecture de cette variable est envoyée au µC de traitement.
Après calcul d'une compensation adaptée, les variations de températures, du chauffage au décapeur thermique (modéré  quand même, j'ai pas de sèche cheveux) à la projection de réfrigérant donnent des variations de mesure de l'ordre de 1%.

Le schéma précédent, légèrement modifié:

 

La sonde:
C'est la sonde du test précédent, 20 cm de long, le picaxe est reprogrammé pour la correction de température




Les résultats dépendent de la qualité mécanique de cette sonde.
Un simple fil rigide isolé ou une barre gainée donne de bons résultats, voir la vidéo page précédente.
Pour les sondes courtes, une spirale augmente la résolution, sans modifer la configuration de la commande "touch16"
Pour le tube de cuivre, il faut un bon drainage du liquide et un espace suffisant entre les électrodes pour un bon écoulement, éviter les phénomènes de capilarité, etc
On obtient un bon résultat avec du fil fin émaillé (récup bobinage), la faible épaisseur de l'isolant donne des variations de capacité rapides, pour adapter la sensibilité de la commande, voir la tableau sur cette page de test.


(La suite des explications arrive...)

Le code émetteur modifié:
(Faire un copier-coller des codes dans l'éditeur PE6 pour leur rendre  couleurs et tabulation)


;EMETTEUR SERIE pour sonde capacitive  MM 08072016
;Avec correction de température

#picaxe 08M2    ;directive pour cohérence commandes
#no_data        ;pour gagner 3 s au chargement code
;******* Nominations ports et variables***********
    setfreq m4                ;rappel fréq de base
    symbol baud= N2400_4     ;constante fréq rs232
;**** Nomination des ports
    symbol sonde     = 4         ;canal commande touch idem C.4 sur M2
     symbol portS    = C.1    ;port liaison série     
;****** Boucle de mesure et liaison série ***********    
    Do  
         touch16 [%11001001],sonde,w13    ;w13 (type word est composé  des deux bytes (b27;b26)
         readinternaltemp IT_RAW_H,0,w12    ;transmission référence t° interne pour Vcc 5v              
         serout portS,baud,(b27,b26,b25,b24)     ;deux octets de w13 et 2 octets w12 par serout
         pause 100        ;Faut pas aller trop vite    
     loop

 

Le code récepteur avec la compensation de température:

;Ex: Sonde de niveau capacitive MM 13/09/2015
;**** calibration de la sonde à la mise sous tension.  ***************
;**** La réponse de la comande TOUCH est considérée comme linéaire
;**** Le sous programme "calib:" mesure deux points arbitraires 0 et 100%  *********
;**** mesure de la référence interne de température
;**** Ces trois mesures sont mémorisées en EEPROM
;**** Calcule de la proportionnalité entre la mesure et les valeurs mémorisées ****
;**** Calcul d'une correction de température
;**** Affichage du Niveau et de la correction
;**** Affiche les étapes successives **************

#picaxe 08M2    ;directive picaxe utilisé (pour erreur de commandes)
;****** Nominations variables ********
 symbol baud= N2400        ;le même pour serin et serout (facilité)
;****** variables word *********  
 symbol mesur      = w13    ;(b27,b26)
 symbol compens    = w12    ;(b25,b24)
 symbol haut      = w11    ;réf niveau haut
 symbol bas      = w10    ;ref niveau bas
 symbol rapcycl    = w9     ;rapport cyclique PWM
 symbol memcomp    = w8    ;mémo réf compensation t°
 symbol delta    = w7    ;delta haut-bas
;***** noms variables bytes ****************
 ;            b1,b2,b3 utilisés dans bintoascii
 symbol sig        = b4
;******* Nominations ports ***********
 symbol LCD      = C.0        ;sortie LCD série
 symbol SONDE     = C.4        ;entrés sonde
 symbol SPWM      = C.2        ;sortie PWM
 symbol valid     = pinC.3    ;valeur poussoir de validation
;******* Début Programme principal *****************    
     pause 200      ' initiation LCD
     pullup %01000    ;pullup sur C.3
    pwmout pwmdiv4, C.2, 249, 999
     read 0,word bas, word haut,word memcomp        ; lecture paramdroire +compens pendant calib
    if bas =0  or valid=0 then calib   ; Vers calib: si paramétre nul ou nouvelle calibration
;***** boucle pricipale **************************************    
     Do          
         gosub mesure    
          gosub calcul
          gosub affich
          gosub sortiePWM     
     loop
;******* Fin programme principal *****************

;******* Les sous programmes: ***********************
;************** Mesure de la sonde, liaison RS232 ***************
mesure:
      serin [2000,alarmSonde],SONDE,baud,b27,b26,b25,b24  ;(b27;b26)mesur et (b13,b12)
     ;mesur=w13 = (b27;b26)    ;reconstitution de la mesure brute
     ;compens = (b25,b24) ft tempé interne
     if mesur =0 then gosub alarmsonde    ;erreur de mesure, dépassement 65535
    if memcomp>compens then     
        compens=memcomp- compens    ;plus froid
        compens=compens /4    ;ici un rapport 4 entre les variations mesure et ref t° interne
        mesur=mesur/100 + compens
        sig = "+"
    else
        compens=compens - memcomp    ;plus chaud
        compens=compens /4
        mesur=mesur/100 - compens ;on garde les chiffres significatifs
        sig="-"
    endif        
     return

'******** Affichage des valeurs lues ***********
affich:
     bintoascii mesur,b1,b1,b1,b2,b3                      ;décomposition ascii
     serout LCD,baud,(254,128,"niveau =  ",b1,b2,b3," %") ;envoi LCD série
    
     bintoascii compens,b1,b1,b1,b2,b3
     
     serout LCD,baud,(254,192,"compens= ",sig,b1,b2,b3,"  " ) ;envoi LCD série  
     return
 
;******* Calibration, Calcul paramétres, Affichage, Mise en mémoires ***
calib:
     do:loop while valid=0                              ;attente relachement poussoir
     serout LCD,baud,(254,1)                            ;effacement écran
     serout LCD,baud,(254,128, "calibration  0 %")      ;titre
     do  
         serin [4000,alarmSonde],SONDE,baud,b27,b26,b25,b24 ;(b27,b26) mesur (b25,b24) compens        
        if mesur =0 then gosub alarmsonde    ;erreur de mesure, dépassement 65535
        mesur=mesur/100        ;on garde les chiffres significatifs
          bas=mesur                                          ;mesure du point 0%            
          bintoascii mesur,b1,b1,b1,b2,b3                      ;affichage
          serout LCD,baud,(254,192,"mesure  0% =",b1,b2,b3)   ;pour voir
     loop while valid=1                                         ;attente validation
 
     serout LCD,baud,(254,128,"calibration 100%")           ;titre
     do:loop while valid=0                                  ;attente relachement poussoir
     do
        serin [4000,alarmSonde],SONDE,baud,b27,b26,b25,b24
        if mesur =0 then gosub alarmsonde    ;erreur de mesure, dépassement 65535
        mesur=mesur/100        ;on garde les chiffres significatifs          
          haut=mesur             ;mesure du point 100%       
          bintoascii mesur,b1,b1,b1,b2,b3
          serout LCD,baud,(254,192,"mesure 100%=",b1,b2,b3)
     loop while valid=1
      if bas>haut then calib            ;erreur de procédure. retour début      
     do:loop while valid=0            ;attente relachement poussoir         
     write 0,word bas,word haut,word compens      ;Mise en mémoire EEPROM
     serout LCD,baud,(254,1)                     ;Effacement écran
     serout LCD,baud,(254,128, "calibration ")   ;affichage
    serout LCD,baud,(254,192, "effectu",1,"e ")    ;1 est le é en CGRAM du LCD maison
     pause 1000                                  ;Temps d'affichage 1 seconde
     reset
 
;*********** Calcul pourcentage ***********************
calcul:      
    if mesur <=bas then    ; on est en dessous de 0
        mesur=0        ;butée à 0
    else
        mesur=mesur-bas    ;calage à l'origine
        delta=haut-bas    ;delta calibration
        mesur=100*mesur/delta  ;proportionnalité ,unités en pourcents
    endif                              
     return
 
  ;***** Alarmes dépassement Time Out liaison sonde (temporaire) et défaut sonde **********    
AlarmSonde:
    if mesur=0 then    
        serout LCD,baud,(254,128,"DEFAUT SONDE 000")
        else
        serout LCD,baud,(254,128," DEFAUT TIMEOUT ")
    endif
    pause 2000        ;temps de lecture
    serout LCD,baud,(254,1)    ;effacement message
    return    
 
    ;**** Sortie du PWM niveau 100% = PWM 100%
SortiePWM:
    if mesur > haut then
        rapcycl=1000    ;pas de dépassement de 100% de rap cyclique
    else
        rapcycl=mesur * 10    ;rapport 10 entre % et rap cyclique
    endif
    pwmduty C.2, rapcycl        ;sortie rap cyclique sur C.2
    return

 

Page suivante: Fabrication d'une sonde capacitive



 



Créer un site
Créer un site