Gradateur 230v 3KW avec 08M2

jojojo

Senior Member
Gradateur 230v 3KW avec 08M2 (résolu)

Ce post est la suite logique, mais plus ciblée des débats lisibles ici

Le principe retenu, est de déclencher un triac, un "certain" temps, après le passage par zéro de la sinusoide secteur.

Il nous faudra donc :
- un relais statique, avec triac, passant dans les 16 A.
- un détecteur de passage par zéro de l'onde secteur.
- un 08M2 pour gérer tout ça.

Le truc, qui a ralenti pas mal l'avancement du projet, c'est la qualité de forme du signal de passage par zéro (ppz, pour la suite, flemmard, moi !).

Donc, d'abord, le relais statique :

rlstat.jpg

Très classique. Vous remarquerez la présence de la diode 1N4148 (totalement inutile, pour la suite) destinée normalement a assurer la protection du MOC. (j'en connais qui ... Hé hé ...)

Puis, le détecteur de ppz :

detectppz.jpg

La valeur de la résistance RX est déterminante, pour la largeur de l'impulsion se sortie. De 0.3ms pour 10 ohms, à plus d'une ms, pour 1K (merci, MGU).

Le schéma global, avec le picaxe, et l'alimentation ventilo pour le triac:
voir suite (deux images par post, semble-t-il)
 
Last edited:

jojojo

Senior Member
Suite, donc :
controleresistance.jpg


Bien.

Les signaux ppz sont pris en compte par C.3.
Le déclenchement du triac est assurée par C.2.

La commande de l'ensemble se fait par C.1.

Et voila.

C'est là que cela se corse.

Premier soft, pour tester :
Code:
'test2
	#picaxe 08M2
	Setfreq M32
	Let dirs=%000101
	Symbol ppz=pinC.3
	Symbol triac=C.2
	Symbol gatetime=1                                             'vraiment le mini, pour déclencher le triac
Debut:
        If ppz=0 Then
               Pause 8                                                      '100%
               Pulsout triac,gatetime
               Goto debut

Autre test:

Code:
'test3
	#picaxe 08M2
	Setfreq M32
	Let dirs=%000101
	Symbol ppz=pinC.3
	Symbol triac=C.2
	Symbol gatetime=1                                             'vraiment le mini, pour déclencher le triac
        Symbom pourcentage= 32                                    'de 8 à 64 selon

               If ppz=0 Then
               Pause 8 
               Pause pourcentage                                         ' là, +/- 50%                                              
               Pulsout triac,gatetime
               Goto debut
Jusque là, tout va bien.

Oû cela se corse, c'est dès que l'on tente d'utiliser une mauvaise méthode de commande.

Par exemple, la mise en place d'un potentiomètre de 10K, pour controler ADC1, et tenter de faire fonctionner le tout :

Code:
Setint %000000,%01000
	
	do
	Readadc C.1,b0
	w0=10*b0
	b0=w0/45                                             'mise à l'echelle, de 8 à 64, pour 0 à 255
	b0=b0+8
	debug
	loop
	
	Interrupt:
	pause b0
	pulsout triac,gatetime
        pause 8
	Setint %000000,%01000
	return
Là, le gradateur fonctionne, mais avec des "ratées".
Visiblement, la commande readadc est un peu trop gourmande, en temps machine.

Pas grave.

On peut faire autrement.

Piem a proposé deux alternatives :

Code:
 Interrupt:
        	pause b0
        	pulsout triac,gatetime
                pause 8
        	Setint %000000,%01000
        	return
ou plus rigoureux:


Code:
 Interrupt:
        	pause b0
        	pulsout triac,gatetime
                do while ppz=0 : loop
        	Setint %000000,%01000
        	return
Mais, ça ne change rien à la "lenteur" de la commande readadc.

Va falloir commander ça autrement.
 
Last edited:

PieM

Senior Member
Ben non, ça ne peut pas marcher avec ce programme :

Code:
do
	Readadc C.1,b0
	w0=10*b0
	b0=w0/45                                             'mise à l'echelle, de 8 à 64, pour 0 à 255
	b0=b0+8
	debug
loop

Si on est bien à 32 MHz , un readadc prends environ 100 µs , les calculs suivants un peu moins chacun.
par contre un debug est catastrophique en durée ! plus de 120 ms. Ne jamais utiliser çe truc dans des programme comme ça !

En plus, entre le do et le loop, b0 change 4 fois de valeur. comme l'interruption peut intervenir a tout instant, donc n'importe où, il n'y a aucune raison que le pulsout soit la bonne valeur.
Il faut que la lecture du potar donne directement la bonne valeur entre 8 et 64, avec des résistances talon.
Et comme cette lecture devrait être assez rapide, moi je la mettrai dans la routine de l'interruption, après le pulsout par exemple...
 

MGU

Senior Member
Tout à fait d'accord avec PieM, il faut lire l'adc après le pulsout qui est un temps mort jusqu'à la fin de la période, il ne faudrait pas aller jusqu'à 0 % et garder 1 ou 2 ms pour lecture et calcul.
Y a-t-il une chance pour que ppz soit encore actif avant la fin de l'interruption (enfin le setint)?

MM
 

MGU

Senior Member
C'est quand même un peu bizarre

Code:
#picaxe 08M2
	Setfreq M32
	Let dirs=%000101
	Symbol ppz=pinC.3
	Symbol triac=C.2
	Symbol gatetime=1
	
	Readadc C.1,b1		;initialisation b1
	b1=56 *b1/255 +8	;mise à l'échelle  8 à 64 
	
	Setint %000000,%01000
	
debut:
	do loop		;attente ppz, on ne fait que ça
	goto debut	;sert à rien mais c'est moins bizarre comme ça
	
Interrupt:
    pause b0				;retard
    pulsout triac,gatetime	;triac On
    Readadc C.1,b1			;lecture pot
	b1=56 *b1/255 +8       	;mise à l'échelle  8 à 64      
    Setint %000000,%01000	
    return					;Avant le ppz suivant!
 

PieM

Senior Member
C'est quand même un peu bizarre
Tiens il a dit bizarre !

Non, pourquoi ? En fait oui, le programme principal ne doit rien faire si ce n'est être "à l'écoute" de l'interruption. Cela permet d'avoir le pulse de ppz le plus court possible, compatible avec la détection

En principe le calcul de mise à l'échelle devrait tenir dans le temps de l'interruption restant après le délai le plus long, si effectivement on se garde une paire de ms. (faire b1= b1*56 ... plutôt que b1 = 56*b1; c'est plus rapide).
C'est à vérifier. sinon, il faut faire la mise à l'échelle en hard.
 

jojojo

Senior Member
par contre un debug est catastrophique en durée
Pas de panique, il n'a été là QUE le temps de tester la mise à l'échelle.

Le code du #6 ne fonctionne pas ...(aucun changement, 100% tout le temps), et pour cause (élève MGU : 0/20 ! hé hé ...)
Comme ça, par contre, c'est une merveille (élève jojo 20/20) :
Code:
Interrupt:
    pause b1				;retard             ET PAS b0 Tsss !...
    pulsout triac,gatetime	;triac On
    Readadc C.1,b1			;lecture pot
	b1=56 *b1/255 +8       	;mise à l'échelle  8 à 64   
	   
    Setint %000000,%01000	
    return					;Avant le ppz suivant!
Là, c'est vraiment super, la progression est parfaite, sans aucun à-coup, de "pas tout à fait" éteint, à 100%

Voilou un projet bien bouclé.
Merci à tous.

Edit : Dans la journée, je mettrais le typon, et quelques photos de la platine.
 
Last edited:

PieM

Senior Member
Là, c'est vraiment super, la progression est parfaite, sans aucun à-coup, de "pas tout à fait" éteint, à 100%
dans la mesure ou le readadc + calcul est court, on peut tenter de le mettre avant le pulsout

On passerait au tout à fait éteint à pas tout à fait 100% ce qui le cas avec les gradateurs équipés de diacs.

Cela fait tout de même un gradateur un peu usine à gaz pour n'être commandé que par un potar. :rolleyes:
L'idéal serait de savoir quelles tâches en // le µC est capable de faire. Par exemple une application allumage /extinction progressif en fonction d'un timer... :)


Je me répète : si vous faites b1 = b1 * xxx vous gagnez 30% de temps d'exécution par rapport à b1= xxx* b1 ! ça n'écoute pas là !
 
Last edited:

jojojo

Senior Member
Je me répète : si vous faites b1 = b1 * xxx vous gagnez 30% de temps d'exécution par rapport à b1= xxx* b1 ! ça n'écoute pas là !

Pas crier, Piem, pas crier.
Promis, on retient la chose.

(Je suis vraiment nul...)

Pas du tout ! Bien au contraire ! Ton code est excellent, et fonctionne à merveille. Juste une erreur d'inattention, ça nous arrive à tous.

Tiens, v'la le typon (un peu "bouffé", à gauche, c'est limite taille écran) :

typon2.jpg

Je ne sais pas si je peux joindre le .tci, je tente ...

Nan ! Y veut pas !

Si vous le voulez, via MP.
 

jojojo

Senior Member
Cela fait tout de même un gradateur un peu usine à gaz pour n'être commandé que par un potar.

Ben, oui, mais ... Non !

Il peut être commandé de plein de façons differentes. C'est tout l'intérêt de la chose.

Par exemple, là, je vais l'interfacer avec le 14M2 de gestion de l'alambic, à l'origine, c'était le but.

L'idéal serait de savoir quelles tâches en // le µC est capable de faire. Par exemple une application allumage /extinction progressif en fonction d'un timer...

Certe. Mais, je suis plutôt pour le partage des tâches entre µP differents (déjà, c'est moins "prise de tête", on vieillit, aussi, hein ! Et vu le coût actuel d'un 08M2 ...). N'empêche, que par curiosité intellectuelle ...
 
Last edited:

jojojo

Senior Member
Je me répète : si vous faites b1 = b1 * xxx vous gagnez 30% de temps d'exécution par rapport à b1= xxx* b1 ! ça n'écoute pas là !

Le mieux est parfois l'ennemi du bien !

Avec : Readadc C.1,b1 ;initialisation b1
b1=56*b1/255 +8 ;mise à l'échelle 8 à 64


C'est donc parfait.

Avec : Readadc C.1,b1 ;initialisation b1
b1=b1*56/255 +8 ;mise à l'échelle 8 à 64


Ben ... Ca merdouille féroce, en milieu d'échelle !

Comme quoi ...
 

MGU

Senior Member


Avec : Readadc C.1,b1 ;initialisation b1
b1=56*b1/255 +8 ;mise à l'échelle 8 à 64


C'est donc parfait.

Avec : Readadc C.1,b1 ;initialisation b1
b1=b1*56/255 +8 ;mise à l'échelle 8 à 64


Ben ... Ca merdouille féroce, en milieu d'échelle !

Comme quoi ...


A bon? Le résultat devrait être le même, bizarre, bizarre..
J'ai toujours fait dans le sens "constante x variable", sans problème (un peu surpris que ça fonctionne d'ailleurs)
Dans un sens, on dépasserait 255 quelque part et pas dans l'autre, (ou une variable intermédiaire sur deux octets)?.(j'ai dit bizarre?)

MM
 

PieM

Senior Member
Cela fait tout de même un gradateur un peu usine à gaz pour n'être commandé que par un potar.

Ben, oui, mais ... Non !

Il peut être commandé de plein de façons differentes. C'est tout l'intérêt de la chose.

Par exemple, là, je vais l'interfacer avec le 14M2 de gestion de l'alambic, à l'origine, c'était le but.
Oui mais c'est que si l'interface est un serin par exemple, c'est fichu ...
Donc il faut se contenter d'un readadc d'une valeur ana donnée par un daclevel par ex.

En fait je suis même surpris que b1=56*b1/255 +8 donne un bon résultat. Car b1*56 est en dépassement de capacité dès la valeur 5 de b1 dans le calcul intermédiaire. Si l'on décompose le calcul ça ne marche pas. Si l'on fait le calcul sur une une ligne ça marche. :confused:
Il faut croire que le calcul intermédiaire se fait sur 16 bits ?

par contre écrire w1 = b2*56/255
pulsout ...b2
fonctionne bien entendu, en toute logique

Par contre pourquoi avec l'inversion ça ne fonctionnerait pas "en milieu" d'échelle ... mystère!

@MGU

A bon? Le résultat devrait être le même, bizarre, bizarre..
Non en fait il y a une différence de timing:
des mesures faites pas Westaut sur un 18M2 à 4MHz montrent que :
b1=b1+b2 c'est 650 µs
b1=b2+b1 c'est 960 µs
 
Last edited:

jojojo

Senior Member
Donc il faut se contenter d'un readadc d'une valeur ana donnée par un daclevel par ex.

Niet, no, nein.

Ai pas fini, mais je posterai le code.

Le 14M2 va balancer en permanence un PWM (rapide) avec un duty dépendant de la vitesse de chauffe programmée.

Je vais remplacer le readadc par un pulsin.

Et, hop ! je récupère mon timing.
Pas belle, la vie ?

PS:
J'ai refais l'inversion b1*x et x*b1 je confirme : merdouille en milieu de course du potar...
 
Last edited:

MGU

Senior Member
@MGU


Non en fait il y a une différence de timing:
des mesures faites pas Westaut sur un 18M2 à 4MHz montrent que :
b1=b1+b2 c'est 650 µs
b1=b2+b1 c'est 960 µs

Pour le temps, je suis d'accord, ce qui m'étonne, c'est la différence de résultat entre les deux: b2*56 et 56*b2.
Quoique, je me rappelle avoir constaté d'autres bizarreries de ce type.

MM
 
Last edited:

MGU

Senior Member
Une partie de l'explication:
En interne, c'est en 16 bits, mais il faut le bon format de sortie
All internal mathematics is 16 bit, however when, for instance,
the output target is a byte (8 bit) variable (0-255), if the result of the internal
calculation is greater than 255 overflow will occur without warning.
Pour le reste ?

MM
 

jojojo

Senior Member
overflow will occur without warning.

Ben voyons ...

Bon, comme promis, quelques photos, et une vidéo, si ça passe.
Dos de la carte gradateur, avec le ventilo (récup, ancien Pentium)
radiaetventil.jpg
Le machin, pour les pétales de fleurs :p
alambic1.jpg
 

jojojo

Senior Member
La suite:
La carte gradateur, avec le "patch hardware" (4093, collé dos à dos, à la cyano, sur le cny17. Faut ce qui faut, hein !)
cartegradateur.jpg
Et la carte 14M2, avec le cul du LCD
carte18m2etlcd.jpg
 

jojojo

Senior Member
Façade :
facade.jpg

On tente la vidéo :

Ben, y veut pas.
Tant pis.
Bonne nuitée.

Edit:
Si quelqu'un a un truc, pour les vidéos ...
 

PieM

Senior Member
Dis jojojo, je vois sur la photo ton installation, mais comment t'arrives à faire du Coca Cola avec des pétales de fleurs .... ?
 

jojojo

Senior Member
Pendant que ça distille :

Pour les adeptes de l'interrupt hardware, on peut descendre à 121µs, en "peaufinant" un peu le détecteur de ppz.

Comme ça :

ppz121µs.jpg

C1, D2, R5 et R6 ont été modifiés (ou rajoutés).

Juste la simu, là.

Je câble sur plaquette de test cet AM. Mais, suis confiant, ça doit marcher.

PS: Filtrage en cours, au charbon actif. Hum ... Ca sent bon ... Bon WE.
 
Last edited:

jojojo

Senior Member
Câblé sur le truc à trous.

Meilleur que la simu (sûrement le CNY17, plutôt que le 4N25).

Ca descend à 90µs. Yepssss !
 

jojojo

Senior Member
Sais pas, Piem.

J'ai bien précisé : "Pour les adeptes de l'interrupt hardware" Donc, non, pas fait pour du M2, là.

Mais ... Vu que la plaque d'esssais est encore câblée, et qu'il y traine toujours le 7805 ...Ja va voir ...

Edit: De dious! essai avec trois s !!! Je le laisse, celui-là !
 

jojojo

Senior Member
Code:
#picaxe 08M2
        	Setfreq M32
        	Let dirs=%000101
        	Symbol ppz=pinC.3
        	Symbol led=pinC.2
        	
        	High led                                      'juste pour voir
                pause 8000                                 '1 seconde
                Low led
                pause 8000                                 '1 seconde
        	Setint %000000,%01000
        	
        
        	do 
                loop		
Interrupt:
                High led
                Setint %000000,%01000
                Return
Là, ça baigne, avec les 90µs, l'interrupt les choppe .

Par contre :
Code:
 If ppz=0 then
Ben, y veut pas ! (trop bref)

Voilou ...
 
Top