Comment obtenir un signal de 0 a 5V proportionnel a l'heure?

Gapak

Senior Member
Je cherche a obtenir un signal de 0 volt a 0h01 et 5V a 23h59 et proportionnel a l'heure entre temps. J'utilise un picaxe 20M2 dans mes projets mais je ne suis pas sur qu'un picaxe soit nécessaire pour faire ça; mais si picaxe est utile, quel circuit faut-il construire pour injecter un signal sur une entrée du 20M2 pour obtenir le signal demandé sur une sortie?
 

MGU

Senior Member
Bonjour,

Faudrait savoir le but recherché pour trouver le moyen de se passer de cette idée.
Mais bon.
Première idée: 24h= 3600 x 24 =86400 s
86400/1023 =84 env
Donc si on prend un PWM à la bonne fréquence (réglage rapport cyclique max=1023), et en incrémentant ce RC de 1 toutes les 84s, on aura sur une sortie filtrée (juste un RC) une tension variable de 0 à 5V (avec alim 5V) en 24h.
C'est vite fait et ça coûte rien de vérifier.
Et pour plus de précision, on alterne 84 et 85 , on obtient 86444
Si on veut une sortie super linéaire, faut faire un intégrateur analogique.... plus compliqué.

MM
 
Last edited:

MGU

Senior Member
Un code:
Code:
;de 0 à 5V sur 24H MM 18/04/20
#picaxe 08M2
symbol DC=w13
    pwmout C.2,255,0
    do
        DC=0
        do    
            time=0    
            do loop while time<84
                inc DC 
                pwmduty C.2,DC
            time=0
            do loop while time<85
                inc DC 
                pwmduty C.2,DC
        loop while DC<1023
    loop
MM
 

Gapak

Senior Member
Un code:
Code:
;de 0 à 5V sur 24H MM 18/04/20
#picaxe 08M2
symbol DC=w13
    pwmout C.2,255,0
    do
        DC=0
        do   
            time=0   
            do loop while time<84
                inc DC
                pwmduty C.2,DC
            time=0
            do loop while time<85
                inc DC
                pwmduty C.2,DC
        loop while DC<1023
    loop
MM
Merci, je vais essayer
 

MGU

Senior Member
Tension mesurée sur C.2, avec un voltmètre continu qui donne la valeur moyenne du PWM

MM
 

MGU

Senior Member
Avec ou sans filtre?

23819

code à 16MHz, on passe de 3900Hz à 15600, filtrage plus facile:

Code:
;de 0 à 5V sur 24H V2 MM 18/04/20
#picaxe 08M2
setfreq M16
symbol DC=w13
    pwmout C.2,255,0 
    do
        DC=0
        do        
                time=0
            do loop while time<=84        
                inc DC 
                pwmduty C.2,DC                
                time=0
            do loop while time<=85
                inc DC 
                pwmduty C.2,DC                
        loop while DC<=1023
        pause 10000
    loop
MM
 

MGU

Senior Member
Bonjour,

J'ai fait un essai. Il s'avère que si le compteur dépasse 1023, le PWM retombe à 0.
Ca n'a peut être pas d'importance, mais comme on ne connait rien de la finalité du bidule, je propose une modif pour palier le pb.

Code:
;de 0 à 5V sur 24H V2 MM 19/04/20
#picaxe 08M2
setfreq M16     
symbol DC=w13
    pwmout C.2,255,0
    do
        DC=0
        do       
            time=0
            do loop while time<=84      
                DC=DC+1 max 1023
                pwmduty C.2,DC               
                time=0
            do loop while time<=85
                DC=DC+1 max 1023
                pwmduty C.2,DC               
        loop while DC<=1023       
    loop
MM
 

Gapak

Senior Member
Bonjour,

J'ai fait un essai. Il s'avère que si le compteur dépasse 1023, le PWM retombe à 0.
Ca n'a peut être pas d'importance, mais comme on ne connait rien de la finalité du bidule, je propose une modif pour palier le pb.

Code:
;de 0 à 5V sur 24H V2 MM 19/04/20
#picaxe 08M2
setfreq M16    
symbol DC=w13
    pwmout C.2,255,0
    do
        DC=0
        do      
            time=0
            do loop while time<=84     
                DC=DC+1 max 1023
                pwmduty C.2,DC              
                time=0
            do loop while time<=85
                DC=DC+1 max 1023
                pwmduty C.2,DC              
        loop while DC<=1023      
    loop
MM
 

Gapak

Senior Member
Merci pour le suivi du problème. La finalité est la suivante: Je fais tourner un panneau solaire pour suivre le soleil; mon servo moteur (de recuperation) fait un tour complet s'il recoit un signal de 0 a 5V. J'ai actuellement une solution très archaïque que je voudrais remplacer par quelque chose de plus intellectuellement satisfaisant.
 

MGU

Senior Member
Pas sûr que cette solution soit adaptée au problème. Il n'y aura pas de synchronisation.
Pourquoi pas un fin de course de chaque côté avec un retour automatique la nuit.
Ou associé à une RTC.
Enfin, je sais pas, mais depuis le temps, je pense que le problème a été résolu.

MM
 

Gapak

Senior Member
Pas sûr que cette solution soit adaptée au problème. Il n'y aura pas de synchronisation.
Pourquoi pas un fin de course de chaque côté avec un retour automatique la nuit.
Ou associé à une RTC.
Enfin, je sais pas, mais depuis le temps, je pense que le problème a été résolu.

MM
Oui le problème a été résolu mais j'ose a peine décrire sa rusticité: J'ai utilisé une minuterie a cadran mobile ( du type allumage d'arbre de Noel a 8 Euros chez Casto), j'ai attelé un pot de 1000ohms au cadran mobile qui fait un tour complet en 24 heures!
J'avais pensé utiliser une horloge DS1307 mais je me suis senti incompétent pour traduire son signal de sortie en une tension variant de 0 a 5V en un jour. Si tu as une idée je suis preneur.
 

MGU

Senior Member
Oui le problème a été résolu mais j'ose a peine décrire sa rusticité: J'ai utilisé une minuterie a cadran mobile ( du type allumage d'arbre de Noel a 8 Euros chez Casto), j'ai attelé un pot de 1000ohms au cadran mobile qui fait un tour complet en 24 heures!
J'avais pensé utiliser une horloge DS1307 mais je me suis senti incompétent pour traduire son signal de sortie en une tension variant de 0 a 5V en un jour. Si tu as une idée je suis preneur.
Bonjour,
Je voulais dire résolu par tous ceux qui ont eu le même problème.
Il faut quel courant pour le servo moteur?
Avec une DS1307 ou DS3231, je vois une solution mais il faudrait sans doute amplifier le courant.

MM
 

Gapak

Senior Member
Bonjour,
Je voulais dire résolu par tous ceux qui ont eu le même problème.
Il faut quel courant pour le servo moteur?
Avec une DS1307 ou DS3231, je vois une solution mais il faudrait sans doute amplifier le courant.

MM
Bonjour.
L'amplification existe deja; il me faut seulement un niveau de 10mA environ.
Ce serait super si tu pouvais me dire comment faire.
 

MGU

Senior Member
Ok, voilà l'idée

La RTC donne l'heure en heures et minutes. 24 heures = 1440 mn
On divise par 2 et il se trouve qu'à la fréquence de 5550Hz (picaxe à 16MHz), un pwm donne un rapport cyclique de 100% pour un paramètre de 719
Donc, à 0h0mn le RC=0 =>0v et pour23h59mn =1439mn; 1439/2=719 (on perd la virgule) => 100% =>5v
On passe de 5V à 0v à minuit
A la sortie, il y a un filtre pour donner du continu qui ne donne pas de courant.
Il faut un AOP rail to rail (AD820) en suiveur pour débiter dans le servo.

MM
 

Gapak

Senior Member
Ok, voilà l'idée

La RTC donne l'heure en heures et minutes. 24 heures = 1440 mn
On divise par 2 et il se trouve qu'à la fréquence de 5550Hz (picaxe à 16MHz), un pwm donne un rapport cyclique de 100% pour un paramètre de 719
Donc, à 0h0mn le RC=0 =>0v et pour23h59mn =1439mn; 1439/2=719 (on perd la virgule) => 100% =>5v
On passe de 5V à 0v à minuit
A la sortie, il y a un filtre pour donner du continu qui ne donne pas de courant.
Il faut un AOP rail to rail (AD820) en suiveur pour débiter dans le servo.

MM
Formidable, mais je ne saurai pas faire sans un schéma montrant l'horloge et le picaxe. Aussi je suis très mauvais en Basic et j'utilise Logicator pour mes projets! Donc si tu as le temps une aide supplémentaire de ta part m'obligerait. Merci d'avance.
 

MGU

Senior Member
Formidable, mais je ne saurai pas faire sans un schéma montrant l'horloge et le picaxe. Aussi je suis très mauvais en Basic et j'utilise Logicator pour mes projets! Donc si tu as le temps une aide supplémentaire de ta part m'obligerait. Merci d'avance.
Voici déjà le schéma de principe:

5VH24.JPG

Il faut un 14M2, puisque sur le 08M2, pwm et I2C sont sur la même broche
Il faut mettre à l'heure la RTC, une fois pour toutes en principe, sur site ou hors site...à voir.
Un LCD ou TM1637 pour lire l'heure? A voir également.
Probablement sur PC avec un programme dédié...détail.
Un AD820, un LM358 suffit peut être je testerai.
MM
 

Gapak

Senior Member
Voici déjà le schéma de principe:

View attachment 23827

Il faut un 14M2, puisque sur le 08M2, pwm et I2C sont sur la même broche
Il faut mettre à l'heure la RTC, une fois pour toutes en principe, sur site ou hors site...à voir.
Un LCD ou TM1637 pour lire l'heure? A voir également.
Probablement sur PC avec un programme dédié...détail.
Un AD820, un LM358 suffit peut être je testerai.
MM
Merci, le schéma est parfaitement clair. J’essaye de me procurer un DS3231 mais les fournisseurs sont en rupture de stock jusqu’à fin mai!
L'etape suivante est la programmation du Picaxe.
 

MGU

Senior Member
Bonjour
Merci, le schéma est parfaitement clair. J’essaye de me procurer un DS3231 mais les fournisseurs sont en rupture de stock jusqu’à fin mai!
L'etape suivante est la programmation du Picaxe.
Bonjour,
Sauf que sda est sur B.3 et scl sur B.4 et évidemment, en réalité, c'est l'inverse.

En ce moment, mieux vaut chercher en France: Y en a plein
Ex: entre le 28/04 et le 7/05, avec la batterie (pile?)

Il y aura deux programmes, un pour la mise à l'heure et un pour le 5V/24H

MM
 
Last edited:

MGU

Senior Member
Bonjour,

J'ai donc fait un test.
On obtient bien une tension de 0 à 5V par 720 pas de 2mn.
5V est le minimum de tension pour le AD820 et la sortie plafonne à 4,9V . Mais il n'y aurait aucun problème avec une tension alim plus élevée.
voici le code:
Code:
;5V24H MM 21/04/20
;RTC DS3231 ou DS

#picaxe 14M2
setfreq M16
symbol hh=b1
symbol mm=b2
symbol dch=b3
symbol varb=b4
symbol heure=w13
symbol rapcycl=w12

#macro transbcdtodec(varb)        ;transformation de bcd vers dec
    dch=varb/16*10
    varb=varb//16
    varb=varb+dch
#endmacro
    ;serout B.0,T2400_16,(254,1,254,1)
    pwmout pwmdiv4, C.0, 180, 0        ;PWM sortie C.0 ,5550Hz,0=>0% ;720=>100%    
    hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte  
    do
        hi2cin 1,(mm,hh)        ;lecture minutes et heures sur RTC
        transbcdtodec(mm)        ;passage forme bcd => dec
        transbcdtodec(hh)              
        rapcycl= 60*hh +mm /2
        ;serout B.0,T2400_16,(254,128,"h=",#hh," ","m=",#mm,254,192,"DC=",#rapcycl)
        pwmduty C.0,rapcycl
    loop
Les serout laissés en commentaire servent à suivre l'évolution sur un LCD

MM
 
Last edited:

Gapak

Senior Member
Bonjour,

J'ai donc fait un test.
On obtient bien une tension de 0 à 5V par 720 pas de 2mn.
5V est le minimum de tension pour le AD820 et la sortie plafonne à 4,9V . Mais il n'y aurait aucun problème avec une tension alim plus élevée.
voici le code:
Code:
;5V24H MM 21/04/20
;RTC DS3231 ou DS

#picaxe 14M2
setfreq M16
symbol hh=b1
symbol mm=b2
symbol dch=b3
symbol varb=b4
symbol heure=w13
symbol rapcycl=w12

#macro transbcdtodec(varb)        ;transformation de bcd vers dec
    dch=varb/16*10
    varb=varb//16
    varb=varb+dch
#endmacro
    ;serout B.0,T2400_16,(254,1,254,1)
    pwmout pwmdiv4, C.0, 180, 0        ;PWM sortie C.0 ,5550Hz,0=>0% ;720=>100%   
    hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte 
    do
        hi2cin 1,(mm,hh)        ;lecture minutes et heures sur RTC
        transbcdtodec(mm)        ;passage forme bcd => dec
        transbcdtodec(hh)             
        rapcycl= 60*hh +mm /2
        ;serout B.0,T2400_16,(254,128,"h=",#hh," ","m=",#mm,254,192,"DC=",#rapcycl)
        pwmduty C.0,rapcycl
    loop
Les serout laissés en commentaire servent à suivre l'évolution sur un LCD

MM
Merci pour le code, je vais le copier coller.
J'ai acheté 2 horloges chez ebay en France! c'est vraiment le 22 a Asnières! Merci pour le tuyau.
 

MGU

Senior Member
Merci pour le code, je vais le copier coller.
J'ai acheté 2 horloges chez ebay en France! c'est vraiment le 22 a Asnières! Merci pour le tuyau.
Il faut quelle précision pour le 5V, à la fin de cycle?

Voici un programme pour la mise à l'heure. On utilise la même carte, avec le cordon de programmation en place. Les directives seront sur le terminal.
En résumé, on édite le programme, on entre l'heure de mise à l'heure (lignes entre les étoiles) en prenant une marge de 2 ou 3 minutes.
On lance l'exécution, on appuie sur le poussoir. Le terminal affiche l'heure attendue.
Quelques secondes avant l'heure H, on appuie sur le poussoir et à H=00, on lâche le poussoir.
Le terminal affiche l'heure enregistrée dans la RTC.
Plus simple à faire qu'à dire

Code:
;mise à l'heure pour DS1307 ou DS3231 MM 22/04/20
;avec sortie 1 Hz
;Renseignez les données hh et mm (entre étoiles)
;Chargez le programme
;Appuyez sur le poussoir
;ET SUIVEZ LES INSTRUCTIONS
#picaxe 14M2
#no_data
#terminal 4800
symbol hh    = b1
symbol mm    = b2
symbol varb = b3
symbol dch    = b4
symbol minut=b5
symbol heur=b6
symbol pous    =pinC.3
pause 1000
#macro transbcdtodec(varb)        ;transformation de bcd vers dec
    dch=varb/16*10
    varb=varb//16
    varb=varb+dch
#endmacro
#macro transdectobcd(varb)    ;transformation de dec vers bcd
    dch=varb//10
    varb=varb/10*16        'mises au format BCD
    varb=varb+dch            'pour enregistrement
#endmacro   
    ;serout B.0,T2400_4,(254,1,254,1)
    pullup %100000000000        ;activation pullup sur C.3 ;14M2
    hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte
;************************************************ 
    hh    = 17    ;heure de la mise à l'heure
    mm    = 23    ;minutes de la mise à l'heure
;***************************************************
     sertxd (13,10)   
    do loop while pous=1
    pause 100   
    sertxd ("attente ",#hh,"h",#mm,13,10)
    sertxd ("appuyez a h-5 secondes",13,10)
    do loop while pous=0
    pause 100
    ;serout B.0,T2400_4,(254,1,254,128,"attente ",#hh,"h",#mm,"mn")
    do loop while pous=1
    sertxd ("lachez a h=0 secondes",13,10)
    pause 100   
    do loop while pous=0
    pause 100
    transdectobcd(hh)
    transdectobcd(mm)
    hi2cout 0,(0,mm,hh,0,0,0,0,%00010000)
    sertxd ("heure OK",13,10)
    ;serout B.0,T2400_4,(254,192,"heure OK",13,10)
    do
        hi2cin 1,(minut,heur)   
        transbcdtodec(heur)
        transbcdtodec(minut)
        ;serout B.0,T2400_4,(254,148,"heure lue: ",#heur,"h",#minut,"mn")
        sertxd("heure lue: ",#heur,"h",#minut,"mn",13,10)
        pause 100   
    loop
MM
 

Gapak

Senior Member
Et si c'est pas assez clair, voici une page sur le sujet, avec une vidéo:

MM
Pas de pot! ebay me dit que ma commande a été annulée car ils ne livrent plus en international dans les circonstances actuelles. Je vais donc commander ici et attendre. Merci pour ton superbe suivi; j'aurai certainement des questions au moment de l'installation des programmes.
A bientôt quand je recevrai l'horloge.
Gapak
 
Top