Asservissement en courant avec capteur ACS712 - 30A

Nico49

Member
OK pour l'interruption. Mais alors ça revient à une mise hors tension du système, suivie d'une éventuelle remise sous tension ?
Concernant le gosub, il appelle un sous programme et revient à l'instruction suivante.
Avec un goto, on va à un sous programme, qui lui même va sur un autre etc.. d'où des difficultés parfois à suivre un cheminement (type plat de nouilles) , et un risque évident de truc qui boucle et plante.
Oui c'est bien ça, je suis obligé de faire une mise hors tension suivie d'une remise sous tension pour réarmer le système mais bon, je ne suis pas certain de laisser ça tel quel...
Merci pour l'explication de goto/gosub :D
 

BESQUEUT

Senior Member
Du coup on peut aussi faire de même avec le bloc drycell_OFF ?

Je trouvais qu'en créant 2 sous-programmes (drycell_ON & drycell_OFF, ça éclaircissais le programme principal et sa compréhension, non ?
Oui : avec gosub/RETURN
Avec GOTO, c'est beaucoup moins évident...
Merci de publier le programme mis à jour...(sans oublier les balises
Code:
...[/ CODE]
 

Nico49

Member
[/QUOTE]
Oui : avec gosub/RETURN
Avec GOTO, c'est beaucoup moins évident...
Merci de publier le programme mis à jour...(sans oublier les balises
Code:
...[/ CODE][/QUOTE]

[QUOTE]'***** PILOTAGE DRY CELL avec PICAXE 20M2 *****

'C.0 = OUT : Afficheur LCD 2x20 caractères
'C.1 = OUT : Arrêt / marche DRY CELL
'C.2 = IN : Mesure du courant consommé
'C.3 = IN : Interruption : Arrêt d'urgence
'C.4 = IN : Mesure de température d'eau sur DS18B20
'C.5 = IN : Détection rotation moteur
'C.6 = IN : Détection niveau bas dans le réservoir
'C.7 = OUT: Buzzer


#picaxe 20M2

	symbol temp		= b0
	symbol moteur	= pinC.5
	symbol niveau	= pinC.6
	symbol courant	= C.2
	symbol buzzer	= C.7
	symbol drycell	= C.1


init_LCD:
	symbol LCD = C.0
	symbol BD = N4800
	pause 500
	serout LCD,BD, (254,1)

dirsC = %10000011		'pinC.0 et pinC.1 en sorties, les autres en entrées


init_demo:
'	b15 = 148
'	serout LCD,BD, (254,192,"   INITIALISATION   ")
'	pause 1500
	
'	for b2 = 1 to 20		'ligne de 20 caractères
	
'	serout LCD,BD, (254,b15,4)
'	pause 50
'	serout LCD,BD, (254,b15,5)
'	pause 50
'	serout LCD,BD, (254,b15,6)
'	pause 50
'	serout LCD,BD, (254,b15,7)
'	pause 50
'	serout LCD,BD, (254,b15,8)
'	pause 50
'	b15 = b15 + 1	
				
'	next b2

'	pause 1500
'	serout LCD,BD, (254,1)
'	pause 1000
	

boucle_OFF:
	call lecture_capteurs
	pause 10
	
	do
	call niveau_eau
	pause 10
	call mesure_temp
	pause 10
	call rotation_moteur
	pause 10
	call mesure_courant
	pause 10
	loop while moteur=0 or temp<2 or temp>60 or b1>=128	'DRY CELL reste OFF tant que :
										'moteur OFF ou
gosub drycell_ON								'temp <2°C ou >=70°C ou <=0°C


boucle_ON:
	setint %00001000,%00001000			'interruption quand pinC.3=1 (appui sur BP ARR URG)
	call lecture_capteurs
	pause 10
	
	do
	call niveau_eau
	pause 10
	call mesure_temp
	pause 10
	call rotation_moteur
	pause 10
	call mesure_courant
	pause 10
	loop while moteur=1 and temp>1 and temp<=60	'DRY CELL reste ON tant que :
									'moteur ON et
gosub drycell_OFF							'temp >1°C et <=60°C




'********** SOUS-PROGRAMMES **********
'--------------------------------------------------------------------------------------
lecture_capteurs:
	serout LCD,BD, (254,1)
	
	pause 10
	serout LCD,BD, (254,128,1)	'Symbole niveau d'eau (1)
	pause 10
	serout LCD,BD, (254,142,3)	'Symbole température (3)
	pause 10
	serout LCD,BD, (254,148,"Moteur:       Conso:")
	pause 10
	return

'--------------------------------------------------------------------------------------
niveau_eau:							'capteur à flotteur ILS
	if niveau=0 then
		serout LCD,BD, (254,130,"OK ")
		endif	
	
	if niveau=1 then
		serout LCD,BD, (254,130,"BAS")
		pause 300
		serout LCD,BD, (254,130,"   ")
		endif
	return

'--------------------------------------------------------------------------------------
mesure_temp:						'capteur température DS18B20
	readtemp C.4,temp
	b1=temp

	if temp>=60 and temp<127 then				'temp >=60°C : afficher >60°C
		serout LCD,BD, (254,144,">60",2)
		pause 300
		serout LCD,BD, (254,144,"    ")
		pause 10
		endif
	
	if temp>=0 and temp<60 then				'temp >=0°C et <60°C
		serout LCD,BD, (254,143," ",#temp,2," ")
		endif

	if temp>127 then						'temp <-1°C et >-9°C
	temp=temp-128
		serout LCD,BD, (254,143," -",#temp,2," ")
		endif
	return

'--------------------------------------------------------------------------------------
rotation_moteur:						'relais sur alternateur
	if moteur=0 then
		serout LCD,BD, (254,212,"STOP")
		endif	
	pause 10
	
	if moteur=1 then
		serout LCD,BD, (254,212,"RUN ")
		endif
	pause 10
	return

'--------------------------------------------------------------------------------------
mesure_courant:						'capteur ACS712 - 30A
	readadc10 courant,w10

	w10=w10-514
	w11=w10*37/50
	
	bintoascii w11,b11,b10,b9,b8,b7
	serout LCD,BD, (254,227,b9,b8,",",b7,"A")

	return	

'--------------------------------------------------------------------------------------	
drycell_ON:
	pause 1000
	serout LCD,BD, (254,1)
	high buzzer			'Buzzer ON
	pause 10
		serout LCD,BD, (254,128,"********************")
	pause 10
		serout LCD,BD, (254,192,"      DRY CELL      ")
	pause 10
		serout LCD,BD, (254,148,"         ON         ")
	pause 10
		serout LCD,BD, (254,212,"********************")
	pause 1000
	low buzzer			'Buzzer OFF
	high drycell		'DRY CELL ON
	gosub boucle_ON

'--------------------------------------------------------------------------------------
drycell_OFF:
	pause 1000
	serout LCD,BD, (254,1)
	high buzzer			'Buzzer ON
	pause 10
		serout LCD,BD, (254,128,"********************")
	pause 10
		serout LCD,BD, (254,192,"      DRY CELL      ")
	pause 10
		serout LCD,BD, (254,148,"         OFF        ")
	pause 10
		serout LCD,BD, (254,212,"********************")
	pause 1000
	low buzzer			'Buzzer OFF
	low drycell			'DRY CELL OFF
	gosub boucle_OFF

'--------------------------------------------------------------------------------------
interrupt:
	low drycell			'DRY CELL OFF
	serout LCD,BD, (254,1)
	high buzzer			'Buzzer ON
	pause 10
		serout LCD,BD, (254,128,"********************")
	pause 10
		serout LCD,BD, (254,192,"* ARRET D'URGENCE  *")
	pause 10
		serout LCD,BD, (254,148,"*   DRY CELL OFF   *")
	pause 10
		serout LCD,BD, (254,212,"********************")
	pause 1000
	low buzzer			'Buzzer OFF
	stop[/QUOTE]

J'ai laissé les 2 blocs à leur place, plus simple pour moi...
 

PieM

Senior Member
J"aurais personnellement une autre analyse:
l'objectif du système est d'assurer la régulation de courant.
Donc c'est la fonction principale, qu'il convient de réaliser le plus souvent et le plus rapidement possible même si on est dans un process à évolution lente.
En dehors de ça, la surveillance des autres paramètres, comme niveau d'eau, état moteur, et température n'ont certainement pas besoin d'être réactualisés touts les ms!

donc je concevrai plutôt une boucle dans laquelle s'inscrit mesure courant, filtrage comme indiqué en #31 et commande du pwm, et un appel aux sous programmes de mesures et alarmes annexes en fonction d'un timer.

d'autre part, pourquoi définir le 10A comme une constante dans le programme et non comme une variable pouvant être entrée par un potar par exemple ?
Une consigne variable pourrait même être liée au régime moteur ...

PS: utiliser les balises # pour le programme et non quote
 
Last edited:

BESQUEUT

Senior Member
Pour publier du code, soit vous utilisez les balises
Code:
...[/ CODE]
soit vous utilisez "Copier pour le forum" et ça donne ça :
[code]
[color=Green]'***** PILOTAGE DRY CELL avec PICAXE 20M2 *****[/color]
[color=Navy]#picaxe [/color][color=Black]20M2[/color]
[color=Blue]symbol [/color][color=Black]temp [/color][color=DarkCyan]= [/color][color=Purple]b0[/color]
[color=Green]'...

'init_LCD:  (Jamais appelé : c'est juste un commentaire !)[/color]
[color=Blue]symbol [/color][color=Black]LCD [/color][color=DarkCyan]= [/color][color=Blue]C.0[/color]
[color=Green]'...
'init_demo: (Jamais appelé : c'est juste un commentaire !)[/color]



[color=Black]boucle_OFF:
      [/color][color=Blue]call [/color][color=Black]lecture_capteurs

      [/color][color=Blue]do
            call [/color][color=Black]niveau_eau
            [/color][color=Green]'...
      [/color][color=Blue]loop while [/color][color=Black]moteur[/color][color=DarkCyan]=[/color][color=Navy]0 [/color][color=DarkCyan]or [/color][color=Black]temp[/color][color=DarkCyan]<[/color][color=Navy]2 [/color][color=DarkCyan]or [/color][color=Black]temp[/color][color=DarkCyan]>[/color][color=Navy]60 [/color][color=DarkCyan]or [/color][color=Purple]b1[/color][color=DarkCyan]>=[/color][color=Navy]128   [/color][color=Green]'DRY CELL reste OFF tant que...
      [/color][color=Blue]gosub [/color][color=Black]drycell_ON


boucle_ON:
      [/color][color=Blue]setint [/color][color=Navy]%00001000[/color][color=Black],[/color][color=Navy]%00001000    [/color][color=Green]'interruption quand pinC.3=1 (appui sur BP ARR URG)
      [/color][color=Blue]call [/color][color=Black]lecture_capteurs

      [/color][color=Blue]do
            call [/color][color=Black]niveau_eau
            [/color][color=Green]'...
      [/color][color=Blue]loop while [/color][color=Black]moteur[/color][color=DarkCyan]=[/color][color=Navy]1 [/color][color=DarkCyan]and [/color][color=Black]temp[/color][color=DarkCyan]>[/color][color=Navy]1 [/color][color=DarkCyan]and [/color][color=Black]temp[/color][color=DarkCyan]<=[/color][color=Navy]60     [/color][color=Green]'DRY CELL reste ON tant que :
      [/color][color=Blue]gosub [/color][color=Black]drycell_OFF [/color]

[color=Red]' ON VA OU LA ???



'********** SOUS-PROGRAMMES **********[/color]
[color=Black]lecture_capteurs:[/color]
[color=Blue]return[/color]

[color=Black]niveau_eau: [/color][color=Green]'capteur à flotteur ILS[/color]
[color=Blue]return[/color]


[color=Black]mesure_temp:      [/color][color=Green]'capteur température DS18B20[/color]
[color=Blue]return[/color]


[color=Black]rotation_moteur:  [/color][color=Green]'relais sur alternateur[/color]
[color=Blue]return[/color]

[color=Black]mesure_courant:   [/color][color=Green]'capteur ACS712 - 30A[/color]
[color=Blue]return      [/color]


[color=Black]drycell_ON:[/color]
[color=Blue]gosub [/color][color=Black]boucle_ON


drycell_OFF:[/color]
[color=Blue]gosub [/color][color=Black]boucle_OFF[/color]


[color=Blue]interrupt:
stop[/color]
J'ai juste laissé la structure du programme pour que vous compreniez comment on le lit, et surtout que ça ne peut pas marcher (ou alors, ça tient du miracle !)

Vous n'avez pas une seule boucle, mais deux et qui plus est chacune contient une boucle d'attente...
Dans cette boucle d'attente, le courant ne sera jamais lu, et donc jamais régulé.
Mauvaise lecture ! le sous-programme "Lecture_capteurs" ne lit aucun capteur ! C'est quand même plutôt piégeux...

Si vous n'utilisez pas le multitâche, et donc que vous choisissez l'option "une seule boucle", ça devrait ressembler à :
Code:
[color=Green]' Initialisation[/color]

[color=Blue]do
      gosub [/color][color=Black]Lecture_Capteurs
      
      [/color][color=Blue]gosub [/color][color=Black]Afficher_Mesures
      
      [/color][color=Blue]gosub [/color][color=Black]Ajuster_Duty
      
      [/color][color=Blue]gosub [/color][color=Black]Mettre_Drycell_ON_ou_OFF[/color]
[color=Blue]loop[/color]
Vous pouvez objecter qu'à chaque boucle, on va mettre Drycell à ON tant que les paramètres adéquats sont bons,
alors que dans votre code, on ne le fait que si les paramètres deviennent bons.

A priori, ça ne gène pas de mettre une broche à 1 mille fois par seconde...
 
Last edited:

BESQUEUT

Senior Member
donc je concevrai plutôt une boucle dans laquelle s'inscrit mesure courant, filtrage comme indiqué en #31 et commande du pwm, et un appel aux sous programmes de mesures et alarmes annexes en fonction d'un timer.
Pourquoi pas. Il est également possible d'appeler les fonctions "moins urgentes" une fois sur N dans la boucle principale.
Dans tous les cas, les sous programmes doivent être le plus rapide possible(principe du multitache collaboratif) et donc ne contenir ni pause ni boucle...
Exemple, avec N=64 :
Code:
[color=Green]' Initialisation[/color]

[color=Blue]do
      inc [/color][color=Black]compteur
      [/color][color=Blue]gosub [/color][color=Black]Lecture_Capteurs
      [/color][color=Blue]select [/color][color=Black]compteur
            [/color][color=Blue]case [/color][color=Navy]0 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]afficher_eau
            [/color][color=Blue]case [/color][color=Navy]64 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]afficher_temp
            [/color][color=Blue]case [/color][color=Navy]128 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]afficher_moteur
            [/color][color=Blue]case [/color][color=Navy]192 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]afficher_courant
      [/color][color=Blue]endselect

      
      gosub [/color][color=Black]Ajuster_Duty
      
      [/color][color=Blue]gosub [/color][color=Black]Mettre_Drycel_ON_ou_OFF[/color]
[color=Blue]loop[/color]
PS: utiliser les balises # pour le programme et non code
Dois-je comprendre "pour insérer des balises
Code:
, utilisez le bouton # dans les paramètres avancés" ?
 
Last edited:

Nico49

Member
J"aurais personnellement une autre analyse:
l'objectif du système est d'assurer la régulation de courant.
Donc c'est la fonction principale, qu'il convient de réaliser le plus souvent et le plus rapidement possible même si on est dans un process à évolution lente.
En dehors de ça, la surveillance des autres paramètres, comme niveau d'eau, état moteur, et température n'ont certainement pas besoin d'être réactualisés touts les ms!

donc je concevrai plutôt une boucle dans laquelle s'inscrit mesure courant, filtrage comme indiqué en #31 et commande du pwm, et un appel aux sous programmes de mesures et alarmes annexes en fonction d'un timer.

d'autre part, pourquoi définir le 10A comme une constante dans le programme et non comme une variable pouvant être entrée par un potar par exemple ?
Une consigne variable pourrait même être liée au régime moteur ...

PS: utiliser les balises # pour le programme et non quote
Bonjour,

je suis d'accord avec vous. La production de gaz doit être arrêtée rapidement dès lors que le moteur s'arrête pour éviter l'accumulation de gaz dans ce dernier et risquer une explosion au redémarrage...mais bon on est pas non plus à la seconde près !

La quantité de gaz à produire est fixée par la cylindrée du moteur (il faut 1/4 à 1/2 litre/min de gaz par litre de cylindrée moteur) et non par rapport au régime moteur (je trouve ça étonnant aussi...) mais après de nombreuses recherches sur le net, je n'ai vu nul part quelqu'un qui produisait son gaz en fonction des rpm moteur...

Et dans mon cas, j'atteins la production souhaitée (fonction de ma cylindrée moteur) pour une conso de 10A, c'est pour cette raison que j'ai choisi cette valeur.

J'avais bien pensé à pouvoir intervenir sur le courant de consigne mais mes compétences en programmation sont limitées ! ;)

Désolé pour les balises, j'ai dû me tromper...
 

Nico49

Member
#boucle_ON:
setint %00001000,%00001000 'interruption quand pinC.3=1 (appui sur BP ARR URG)
call lecture_capteurs

do
call niveau_eau
'...
loop while moteur=1 and temp>1 and temp<=60 'DRY CELL reste ON tant que :
gosub drycell_OFF

' ON VA OU LA ???#

Mon programme fonctionne actuellement correctement...
Si le moteur s'arrête ou que la température n'est plus comprise dans la fourchette, on retourne dans la boucle_OFF.
 

BESQUEUT

Senior Member
#boucle_ON:
setint %00001000,%00001000 'interruption quand pinC.3=1 (appui sur BP ARR URG)
call lecture_capteurs

do
call niveau_eau
'...
loop while moteur=1 and temp>1 and temp<=60 'DRY CELL reste ON tant que :
gosub drycell_OFF

' ON VA OU LA ???#

Mon programme fonctionne actuellement correctement...
Si le moteur s'arrête ou que la température n'est plus comprise dans la fourchette, on retourne dans la boucle_OFF.
Voui.... Il est tombé en marche...

En fait on va à
lecture_capteurs:
puis on trouve un RETURN qui ne correspond à aucun GOSUB
seul le Dieu des PICs sait où ça va...

Je n'ai pas réussi à compter toutes les pause 10, pause 300 et pause 1000 dans une boucle, mais à mon avis il doit se passer plusieurs secondes avant que les données soient réactualisées, et donc qu'une action soit déclenchée... Ca me semble en dehors des spécifications...

Je ne saurais trop vous recommander de partir d'une base simple, genre #48 et de copier progressivement vos différents bouts de code en enlevant les pauses, et en vérifiant que ça marche aussi...

Désolé pour les balises, j'ai dû me tromper...
Il est encore temps d'éditer votre post...
 
Last edited:

PieM

Senior Member
nico49 said:
J'avais bien pensé à pouvoir intervenir sur le courant de consigne mais mes compétences en programmation sont limitées ! ;)
Un programme "un peu" revu à la simplification, avec consigne de l'intensité par un potar sur B6
Ajouté le filtrage de la mesure ana
Attention que drycell doit être une sortie prévue pour PWM. sur C.2 ici. High et Low drycell n'auront plus de sens
Simplifié l'affichage aussi car des interférence avec les écrans "drycell on et off"
Quand c'est sur OFF il faut garder l'affichage pour savoir quel paramètre a mis sur OFF.
La mesure de l'intensité et la régulation se fait en permanence sauf toute les 3 secondes ici ou le reste des mesures est effectué.

Code:
'***** PILOTAGE DRY CELL avec PICAXE 20M2 *****

#picaxe 20M2

'**********Def E/S
symbol potar = B.6            'IN : potentiometre consigne
symbol buzzer = C.7            'OUT: Buzzer
symbol niveau = pinC.6        'IN : Détection niveau bas dans le réservoirsymbol buzzer = C.7
symbol moteur = pinC.5        'IN : Détection rotation moteur
symbol Temperature = C.4    'IN : Mesure de température d'eau sur DS18B20    
symbol courant = C.1            'IN : Mesure du courant consommé
symbol drycell = C.2            'OUT : Arrêt / marche DRY CELL
symbol LCD = C.0                'OUT : Afficheur LCD 4x20 caractères

'*************Variables
symbol flag_mesure = bit0 ' flag à 1 si mesure déjà faite 
symbol temp = b1
symbol chrono = b2
symbol consigne = b3
'**************Constantes
symbol BD = N4800
symbol coef = 4 ' coeff de filtarge doit etre >=1 (1 = pas de filtrage)
symbol Per_mes = 3 'périodicité de mesures annexes

'**************initialisation
dirsC = %00000101 'pinC.0 et pinC.2 en sorties, les autres en entrées
setint %00001000,%00001000 'interruption quand pinC.3 = 1 (appui sur BP arrêt d'urgence
pwmout drycell, 99, 0  'initialise à 0
serout LCD,BD, (254,1)
readadc10 courant,w11 'initialisation mesure courant

'################ programme principal #################################
main:

do
    gosub mesure_courant
    gosub calcul_pwm
        chrono = time//Per_mes  'se met à 0 toutes les Per_mes secondes
        if chrono =0 then
            if flag_mesure = 0 then  'si mesures non faites
                 gosub niveau_eau
                gosub mesure_temp
                gosub rotation_moteur
                gosub test_alarme 'met en marche si tout est OK, à l'arret sinon
                flag_mesure = 1 ' flag mesure faite
            endif
        else 
        flag_mesure = 0 'RAZ flag dès que chrono <>0
        endif
loop
'################# Fin programme principal #############################

'******************* SOUS-PROGRAMMES ***********************************

mesure_courant: '(capteur de courant ADS712 - 30A)
readadc potar, consigne
    consigne = consigne/2  'echelle réduite à 0 - 128 soit 12.8A
readadc10 courant,w10
    w11 = coef-1 *w11 + w10 /coef 'filtrage de la valeur ana
    w11= w11-514*37/50 'mise à l'echelle A
serout LCD,BD, (254,155,"Consi.")
bintoascii consigne,b9,b8,b7
serout LCD,BD, (254,220,b9,b8,",",b7,"A") 'Affichage consigne en temps réel
serout LCD,BD, (254,162,"Conso.")
bintoascii w11,b11,b10,b9,b8,b7
serout LCD,BD, (254,227,b9,b8,",",b7,"A") 'Affichage courant en temps réel

return
'--------------------------------------------------------------------------------------
calcul_pwm:
'................
'pwmduty drycell, x  (x peut  varier de 0 à 399 pour le courant variant de 0 à 100%)
'...............
return
'--------------------------------------------------------------------------------------
test_alarme:
    'fond d'ecran commun
    serout LCD,BD, (254,1)
    pause 10
    serout LCD,BD, (254,192," DRY CELL ")
    pause 10
        
    if moteur=1 and temp>1 and temp<=60 then ' tout est OK
        serout LCD,BD, (254,203," ON ")
        high drycell
    else  ' sinon alarme sonore et arret
        high buzzer 'Buzzer ON
        serout LCD,BD, (254,203," OFF ")
        low drycell
        pause 1000
        low buzzer 'Buzzer OFF
    endif

return
'--------------------------------------------------------------------------------------
niveau_eau: '(capteur à base d'ILS)
    serout LCD,BD, (254,128,1) 'Symbole niveau d'eau (1)
if niveau=0 then
    serout LCD,BD, (254,130,"OK ")
    else
    serout LCD,BD, (254,130,"BAS")    
endif
return

'--------------------------------------------------------------------------------------
mesure_temp: '(capteur de température DS18B20)
serout LCD,BD, (254,140,3) 'Symbole température (3)
readtemp temperature,temp

select temp
    case 60 to 126
        serout LCD,BD, (254,142,">60",2,"!") 'afficher >60°C!
    case 0 to 59
        serout LCD,BD, (254,142,#temp,2," ")
    case >127
        temp=temp-128
        serout LCD,BD, (254,142,"-",#temp,2," ")
endselect
return

'--------------------------------------------------------------------------------------
rotation_moteur: '(détection réalisée avec un relais 1 contact à fermeture branché aux bornes de l'alternateur)
serout LCD,BD, (254,148,"Moteur")
if moteur=0 then
    serout LCD,BD, (254,212,"STOP")
else
    serout LCD,BD, (254,212,"RUN ")
endif
return


'--------------------------------------------------------------------------------------
interrupt:
low drycell 'DRY CELL OFF
serout LCD,BD, (254,1)
high buzzer 'Buzzer ON
pause 10
serout LCD,BD, (254,128,"********************")
pause 10
serout LCD,BD, (254,192,"* ARRET D'URGENCE *")
pause 10
serout LCD,BD, (254,148,"* DRY CELL OFF *")
pause 10
serout LCD,BD, (254,212,"********************")
pause 1000
low buzzer 'Buzzer OFF
stop
 

Nico49

Member
Un programme "un peu" revu à la simplification, avec consigne de l'intensité par un potar sur B6
Ajouté le filtrage de la mesure ana
Attention que drycell doit être une sortie prévue pour PWM. sur C.2 ici. High et Low drycell n'auront plus de sens
Simplifié l'affichage aussi car des interférence avec les écrans "drycell on et off"
Quand c'est sur OFF il faut garder l'affichage pour savoir quel paramètre a mis sur OFF.
La mesure de l'intensité et la régulation se fait en permanence sauf toute les 3 secondes ici ou le reste des mesures est effectué.

Bonjour,
merci beaucoup pour l'écriture de ce code, je vais l'étudier en rentrant chez moi ce soir !
Sinon, avez quelques références en tête de FET qui pourraient être utilisés pour commander ma drycell ?
 

Nico49

Member
Un programme "un peu" revu à la simplification, avec consigne de l'intensité par un potar sur B6
J'aimerais aussi faire apparaître sur l'afficheur, le pourcentage correspondant au rapport cyclique, c'est possible ?
 

PieM

Senior Member
J'aimerais aussi faire apparaître sur l'afficheur, le pourcentage correspondant au rapport cyclique, c'est possible ?
la commande du PWM, c'est : PWMOUT pin, period, duty
period définissant la fréquence, est constant dans cette appli.

le pourcentage en % sera donné par 25 * duty / period
 

Nico49

Member
Bonjour,

qu'est-ce qui ne va pas dans mon code ci-dessous, je ne parviens pas à améliorer la stabilité de la valeur affichée du courant ?
J'ai essayé plusieurs fréquences de PWM mais toujours très instable...
Si j'augmente la fréquence, les pas de PWM sont moins nombreux ?
Y a-t-il d'autres capteurs de courant plus simples à mettre en œuvre et qui auraient une plus grande stabilité pour mon application ?
(au final, faire un asservissement en courant)

Merci par avance pour vos réponses.

Nico

Code:
#picaxe 08M2


'***Entrées/sorties
symbol LCD = C.0
symbol courant = C.1
symbol PWM1 = C.2
symbol potar = C.4

'***Variables
symbol PWM2 = w6

'***Constantes
symbol BD = N4800
symbol coef = 5 			'coeff de filtrage doit etre >=1 (1 = pas de filtrage)

'***Initialisation
dirsC = %00000101
pwmout PWM1, 99, 0  		'initialise à 0 (Fréq = 10KHz / PWM = 0%)
serout LCD,BD, (254,1)
readadc10 courant,w2 		'initialisation mesure courant
pause 300


main:

do

readadc potar, b1			'lecture valeur potar
	w6 = b1 * 80 / 51		'mise à l'échelle 0 -> 400


pwmduty PWM1, w6			'w6 peut varier de 0 à 400 pour 0% < PWM < 100%)
	PWM2 = w6 / 4		'mise à l'échelle 0 -> 100%
	serout LCD,BD, (254,148, "PWM=",#PWM2,"%  ")


mesure_courant:
readadc10 courant,w3

w2 = coef - 1 * w2 + w3 / coef				'valeur lissée de w2
	w2 = w2 MIN 514						'(mini 0 Amp)
	w11 = w2 - 514 * 37/50					'mise à l'echelle A
	bintoascii w11,b11,b10,b9,b8,b7
	serout LCD,BD, (254,212,"I=",b9,b8,",",b7,"A")	'affichage courant 00,0A

pause 200

loop
[/QUOTE]
 

BESQUEUT

Senior Member
Bonjour,

qu'est-ce qui ne va pas dans mon code ci-dessous, je ne parviens pas à améliorer la stabilité de la valeur affichée du courant ?
J'ai essayé plusieurs fréquences de PWM mais toujours très instable...
Si j'augmente la fréquence, les pas de PWM sont moins nombreux ?
Y a-t-il d'autres capteurs de courant plus simples à mettre en œuvre et qui auraient une plus grande stabilité pour mon application ?
(au final, faire un asservissement en courant)

Merci par avance pour vos réponses.

Nico
J'ai utilisé ce même capteur avec des résultats très stables. Je doute que ce soit lui le fautif, mais vous pouvez toujours vérifier ce point :
Voir #24 : merci de fournir les valeurs lues par readADC10, en l’occurrence W3
- en l'absence de courant (0A)
- pour un courant connu et stable (dire pourquoi vous êtes certain de la stabilité du courant).

Y a-t-il un condo de filtrage du PWM ? Quelle valeur ?
Cordialement,
 

Nico49

Member
J'ai utilisé ce même capteur avec des résultats très stables. Je doute que ce soit lui le fautif, mais vous pouvez toujours vérifier ce point :
Voir #24 : merci de fournir les valeurs lues par readADC10, en l&#8217;occurrence W3
- en l'absence de courant (0A)
- pour un courant connu et stable (dire pourquoi vous êtes certain de la stabilité du courant).

Y a-t-il un condo de filtrage du PWM ? Quelle valeur ?
Cordialement,
Je viens de visualiser la variable w3 et elle est très instable.
En l'absence de courant, elle varie légèrement : autour de 12290 (+/- 2) avec des pics à 12540.

Je n'ai pas de condo de filtrage sur le PWM, il faut en ajouter un à la sortie du Picaxe ou plutôt dans le circuit de puissance ? Et quelle valeur ?
 

BESQUEUT

Senior Member
Je viens de visualiser la variable w3 et elle est très instable.
En l'absence de courant, elle varie légèrement : autour de 12290 (+/- 2) avec des pics à 12540.

Je n'ai pas de condo de filtrage sur le PWM, il faut en ajouter un à la sortie du Picaxe ou plutôt dans le circuit de puissance ? Et quelle valeur ?
12290 pour w3 ! C 'est impossible : ça ne peux pas dépasser 1023 ...
À mon sens' en l'absence de filtrage' le courant doit suivre les variations du PWM, donc sa mesure être aléatoire. Si le courant atteint 10 A, il faut du lourd aux borne du consommateur de puissance.
L'ami PieM sera plus compétent sur ce point.
 

Nico49

Member
12290 pour w3 ! C 'est impossible : ça ne peux pas dépasser 1023 ...
À mon sens' en l'absence de filtrage' le courant doit suivre les variations du PWM, donc sa mesure être aléatoire. Si le courant atteint 10 A, il faut du lourd aux borne du consommateur de puissance.
L'ami PieM sera plus compétent sur ce point.
Bonjour,
j'ai fait une erreur, w3 = 514 en l'absence de courant.
Quand le PWM est à 100%, le courant est à peu près stable.
Je pense aussi que les variations du PWM perturbent la mesure du courant.
 

PieM

Senior Member
Bonjour,
j'ai fait une erreur, w3 = 514 en l'absence de courant.
Quand le PWM est à 100%, le courant est à peu près stable.
Je pense aussi que les variations du PWM perturbent la mesure du courant.
Ben non, le PWM ne perturbe pas la mesure du courant!
le courant varie en permanence de 0 à 100% , c'est l'objectif, donc le capteur fait son travail de mesurer en temps réel soit 0 soit le max d'A.
Comme déjà dit il faut un filtrage pour que l'entrée ana voit une tension continue image de l'intensité efficace délivrée par le système.
Donc un filtrage efficace au plus près de l'entrée ana par un condo de l'ordre de 10µF. ça doit donner environ 0.1s de cte de temps.
 

Nico49

Member
Ben non, le PWM ne perturbe pas la mesure du courant!
le courant varie en permanence de 0 à 100% , c'est l'objectif, donc le capteur fait son travail de mesurer en temps réel soit 0 soit le max d'A.
Comme déjà dit il faut un filtrage pour que l'entrée ana voit une tension continue image de l'intensité efficace délivrée par le système.
Donc un filtrage efficace au plus près de l'entrée ana par un condo de l'ordre de 10µF. ça doit donner environ 0.1s de cte de temps.
Oui vous avez raison, soit 0, soit la mesure max du courant.
J'ai déjà essayé les condos de filtrage sur l'entrée ana mais ça fait tomber la valeur du courant à 0.
 

BESQUEUT

Senior Member
J'ai déjà essayé les condos de filtrage sur l'entrée ana mais ça fait tomber la valeur du courant à 0.
Ça c'est tout à fait curieux !
Est-ce que le Picaxe indique zéro, ou bien le courant est-il effectivement nul ?
Pouvez-vous donner un schéma du montage et quelques photos...
Disposez vous d'un ampèremètre (ou à défaut d'un voltmètre et d'une résistance shunt) pour comparer la réalité et ce qu'indique le Picaxe ?
 

Nico49

Member
Ça c'est tout à fait curieux !
Est-ce que le Picaxe indique zéro, ou bien le courant est-il effectivement nul ?
Pouvez-vous donner un schéma du montage et quelques photos...
Disposez vous d'un ampèremètre (ou à défaut d'un voltmètre et d'une résistance shunt) pour comparer la réalité et ce qu'indique le Picaxe ?
La valeur mesurée tombe à 0 mais il y a bien un courant dans le circuit de puissance car la charge (une ampoule) reste allumée.
 

Nico49

Member
Ça c'est tout à fait curieux !
Est-ce que le Picaxe indique zéro, ou bien le courant est-il effectivement nul ?
Pouvez-vous donner un schéma du montage et quelques photos...
Disposez vous d'un ampèremètre (ou à défaut d'un voltmètre et d'une résistance shunt) pour comparer la réalité et ce qu'indique le Picaxe ?
20161228_155042_resized.jpg

Courant = 0 sur LCD mais ampoule allumée et l'alim indique un courant consommé de 1,37A avec PWM de 25%...
 

PieM

Senior Member
Bizare en effet, car la sortie du ACS se fait par un AOP.
essayez sans condo mais en augmentant le filtrage soft : passer coef à 100 par exemple
également mettez toujours une R de 10k par exemple entre gate du mosfet et le gnd.
 

Nico49

Member
Bizare en effet, car la sortie du ACS se fait par un AOP.
essayez sans condo mais en augmentant le filtrage soft : passer coef à 100 par exemple
également mettez toujours une R de 10k par exemple entre gate du mosfet et le gnd.
Je n'obtiens pas de meilleurs résultats, la valeur du courant reste à 0, je ne sais plus quoi faire.
 

PieM

Senior Member
Vous avez un oscilloscope ?
vous n'avez pas inversé la polarité du courant sur le capteur au moins !
 

PieM

Senior Member
déconnectez le capteur de l'entrée ana
mesurer au voltmètre la tension en sortie capteur avec votre lampe allumée.
faire la même chose avec le condo entre sortie du capteur et gnd.
qu'obtenez vous ?
 

Nico49

Member
déconnectez le capteur de l'entrée ana
mesurer au voltmètre la tension en sortie capteur avec votre lampe allumée.
faire la même chose avec le condo entre sortie du capteur et gnd.
qu'obtenez vous ?
Les valeurs mesurées au voltmètre en sortie du capteur (débranché) sont étonnamment stables avec ou sans condensateur pour PWM variant de 0 à 100% !
Je ne comprends pas pourquoi le picaxe n'arrive pas à faire une mesure correcte :confused:, y a-t-il un problème de fréquence de mesure ??
 
Top