moteur pap et L298N

jng27

New Member
bonjours,
je suis nouveau sur ce forum ainsi que sur les Picaxes mais j'ai utilise les Pic 16f84 & 16f628 il y a une dizaine d'années en basic avec "Pic basic plus" de Crownhill associated.

Je veux vous remercier aussi pour ce cite très intéressant ou j'ai appris plein de choses en lisant presque tous les post.

J'ai 1 questions concernant le pilotage d' un pap bipolaire avec un L298N, mon programme fonctionne mais j'ai un courant moteur 3 fois supérieur a celui que que j'ai avec
un pilote du commerce qui reçoit des steps et le sens de rotation. (avec le meme moteur et tension bien sur)

J'utilise un programme similaire a celui de " Piem " avec un 14M2

Pensez vous qu' envoyer un pulsout plus court (moitié par ex) de la période de répétition des steps sur les entrées En1 & En2 du L298 pourrait diminuer ce courant .

Je ne peu pas le tester car j'ai grillé mon 298 et je vais en recevoir mais dans une semaine.

Autre question concernant "serout" a une fréquence de 16 Mhz je suis obligé d'utiliser "N600" pour avoir un affichage lisible, de plus pour passer a 32 mhz plus d'affichage possible.


Merci par avance
 

PieM

Senior Member
J'ai 1 questions concernant le pilotage d' un pap bipolaire avec un L298N, mon programme fonctionne mais j'ai un courant moteur 3 fois supérieur a celui que que j'ai avec
un pilote du commerce qui reçoit des steps et le sens de rotation. (avec le meme moteur et tension bien sur)

Pensez vous qu' envoyer un pulsout plus court (moitié par ex) de la période de répétition des steps sur les entrées En1 & En2 du L298 pourrait diminuer ce courant .

Autre question concernant "serout" a une fréquence de 16 Mhz je suis obligé d'utiliser "N600" pour avoir un affichage lisible, de plus pour passer a 32 mhz plus d'affichage possible.
Bienvenue,

Quel pilote utilisiez vous ? un L297 ? en principe le pilote contrôle le courant par le feed back des résistances Sense.
A priori un pulse out contrôlé sur les deux entrées Enable devrait marcher. L'inconvénient est que pendant ce temps d'inhibition le moteur n'est pas alimenté, donc il y a le risque de perdre des pas.
Pensez à déduire de la durée entre step la durée du pulsout.

Quel moteur utilisez vous ? sous quelle tension ? réduire le courant réduit aussi le couple... Donc soit le moteur est trop puissant pour le travail demandé, soit le L298 n'est pas adapté.
Je ne sais quel schéma vous utilisez.
Pensez également que le montage d'une résistance en série avec les bobines du moteur améliore beaucoup les choses avec l'inconvénient de réduire le courant moyen ce que vous recherchez.. J'en ai parlé dans un post, mais ne sais plus lequel !

Concernant le serout, précisez (toujours) le picaxe utilisé, l'afficheur, et le programme ...
 

jng27

New Member
Bonjour et merci de votre rapide réponse
#picaxe 14m2 . Il s'agit de numériser l'axe X d'une petite fraiseuse. Le moteur est un bipolaire avec un couple max de 9kg/cm 200 pas/tour et fonctionne sous 24 volts; pendant les arrêts j'alimente un seul bobinage.
La vis mère est au pas de 150 et j' donc prévu une réduction par poulies crantées de 10 et 15 dents pour avoir un déplacement de 1 mm par tour moteur ce qui me donne une précision hors jeux
de 1/200 de mm
J'ai prévu un L298 pour pouvoir mettre un moteur plus fort (18kg/cm) si besoin. Je n'ai pas de L297 (je ne sais pas comment le gérer ). J' ai oublié de préciser que j'ai une variation de vitesse de rotation pour régler la vitesse de coupe.
Tout fonctionne avec 2 poussoirs pour la saisie des données, le démarrage et l'arrêt le besoin affichage : axe033 2x16 .
Ci joint le programme.

;AutoFeed_L298N HighTorque

;Date :03.09.2013

;Auteur:JNG

;**********************************************

#picaxe 14M2
setfreq M16

Input c.2 ;Stop Poussoir
Input c.3 ;Start Poussoir
Input c.4 ;ADC Vitesse d' avance

Symbol MOT = outpinsB ;MOT correspond au portB du 14M2
Symbol Index=b3
Symbol Vitesse = w10 ;Vitesse d'avance
Symbol Steps = w9 ;Nombre de steps
Symbol Mili = w7
Symbol Cent = w4
Symbol LongX = w0 ;Longueur a usiner
Symbol Sdir = w6 ;Direction de l'usinage
Symbol Pot2 = w5 ;Regle la vitesse d'usinage
Symbol Compteur = w8
Symbol Pulse = w11 ;Pour piloter les "Enable" du L298N
Symbol Fast = b16 ;Vitesse pour retour rapide
Symbol Flag1 = b17 ;Drapeau bouton Stop

dirsB= %00111111 ;Affectation B.0 à B.4 vers le L298 et b.5 vers Oled

;**********************************************

;Mémorisation de la sequence de commande pour les moteurs en demi-pas

eeprom 0,(%1010,%1000,%1001, %0001,%0101,%0100,%0110,%0010)

;********************************************** Choix direction usinage

w4 = 0
b16 = 10000
b17 = 0

Mot = Mot & $F0 | %0000 ;Arret moteur hors tension

Prg0:

If Pin2 = 1 Then Prg0

Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"Choix direction ") ;Choix direction d'usinage
Serout 5,N600,(254,192," d'usinage ")

Pause 500

Serout 5,N600,(254,128,"---> Start ")
Serout 5,N600,(254,192,"<--- Stop ")

Pause 1000

If Pin2 = 1 Then
SDir = 1
Endif

If Pin3 = 1 Then
SDir = 0
Endif
Cent = 0
Mili = 0
LongX = 0

Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"Start = Saisie X ")
Serout 5,N600,(254,192,"Stop+Start=NewDir ")

Pause 1000

If Pin2 = 0 And Pin3 = 0 Then Prg0

;********************************************** Saisie longueur d' usinage

Serout 5,N600,(254,128,"Start => + 100 mm")
Serout 5,N600,(254,192,"Stop => + 10 mm ")

Prg00:
If Pin2 = 1 Then Prg00
If Pin3 = 1 Then Prg00

Prg01:
If Pin2 = 1 Then Prg001
If Pin3 = 0 Then Prg01

If Pin3 = 1 Then
Mili = Mili + 100 ;Saisie des centaines de mm

Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"X = ",#Mili,",",#Cent," mm ")
Serout 5,N600,(254,192,"Stop => + 1 mm ")
Endif
Pause 1000

If Pin2 = 0 Then Prg01

Prg001:
Serout 5,N600,(254,128,"Start => + 10 mm ")
Serout 5,N600,(254,192,"Stop => + 1 mm ")


If Pin2 = 1 Then Prg001

Prg02:
If Pin2 = 1 Then Prg002
If Pin3 = 0 Then Prg02

If Pin3 = 1 Then
Mili = Mili + 10 ;Saisie des dizaines de mm

Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"X = ",#Mili,",",#Cent,"mm ")
Serout 5,N600,(254,192,"Stop => + 1 mm ")
Endif
Pause 1000

If Pin2 = 0 Then Prg02

Prg002:
Serout 5,N600,(254,128,"Start => + 1 mm ")
Serout 5,N600,(254,192,"Stop => +1/10 mm")

If Pin2 = 1 Then Prg002

Prg03:
If Pin2 = 1 Then Prg003
If Pin3 = 0 Then Prg03

If Pin3 = 1 Then
Mili = Mili + 1 ;Saisie des unités de mm

Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"X = ",#Mili,",",#Cent," mm ")
Serout 5,N600,(254,192,"Stop => 1/100 mm")
Endif
Pause 1000

If Pin2 = 0 Then Prg03

Prg003:
Serout 5,N600,(254,128,"Start => + 1/10 mm ")
Serout 5,N600,(254,192,"Stop => + 1/100 mm ")

If Pin2 = 1 Then Prg003

Prg04:

If Pin2 = 1 Then Prg004
If Pin3 = 0 Then Prg04

If Pin3 = 1 Then

Cent = Cent + 10 ;Saisie des dixiemes de mm

Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"X = ",#Mili,",",#Cent," mm ")
Serout 5,N600,(254,192,"Stop => + 1/100 mm ")
Endif
Pause 1000

If Pin2 = 0 Then Prg04

Prg004:
Serout 5,N600,(254,128,"Start => + 1/100 mm")
Serout 5,N600,(254,192,"Stop => Usinage ")

If Pin2 = 1 Then Prg004


Prg05:
If Pin2 = 1 Then Prg005
If Pin3 = 0 Then Prg05 ;

If Pin3 = 1 Then

Cent = Cent + 1 ;Saisie des centiemes de mm

Serout 5,N600,(254,1)
If Cent < 10 Then
Serout 5,N600,(254,128,"X = ",#Mili,",0",#Cent," mm ")
Else
Serout 5,N600,(254,128,"X = ",#Mili,",",#Cent," mm ")
Endif
Serout 5,N600,(254,192,"Stop => Usinage ")
Endif

Pause 1000

If Pin2 = 0 Then Prg05


Prg005:
If Pin2 = 1 Then Prg005


;********************************************************* Usinage

Avance0:
LongX = Mili * 100
LongX = LongX + Cent
Steps = LongX * 2 ;*2 => full step & *4 => Half step
Index = 0 ;0=>Mode full step & 1=> Mode single step

Avance:
Serout 5,N600,(254,128,"Start => Usiner ")

Gosub Lcd1

Pause 500

If Pin3 = 0 Then Avance

If w6 = 0 Then
Serout 5,N600,(254,128,"Usinage ---> ")

Gosub Lcd1
Else
Serout 5,N600,(254,128,"Usinage <--- ")

Gosub Lcd1
Endif

Prg1:
If Pin2 = 1 Then Prg1
If pin3 = 0 Then Prg1 ;START pour debuter l'usinage
For Compteur = 1 to steps

Readadc c.4, Pot2 ;Cherche la vitesse de deplacement

Vitesse = Pot2 * 255

Pulse = Pot2 * 150

Index = Index + 2 ;Incrémentation adresse eeprom

Gosub A1A2B1B2

Next Compteur

Pause 1000

Mot = Mot & $F0 | %0010 ;Attente avec un seul bobinage alimenté

;********************************************* Retour rapide

Prg2:
Serout 5,N600,(254,128," Start pour ")
Serout 5,N600,(254,192,"Retour rapide ")

If Pin3 = 0 Then Prg2 ;START pour retour rapide

If w6 = 1 Then

Serout 5,N600,(254,128,"Retour rap. ---> ")

Gosub Lcd1
Else

Serout 5,N600,(254,128,"Retour rap. <--- ")

Gosub Lcd1
Endif

Vitesse = Fast

For Compteur = 1 to Steps

Pulse = Fast / 2

Index = Index - 2

Gosub A1A2B1B2

Next Compteur

Pause 1000

Mot = Mot & $F0 | %0100 ;Attente avec un seul bobinage alimenté

;********************************************************* Resaisie & Usinage

Prg3:
Serout 5,N600,(254,1)
Serout 5,N600,(254,128,"Start = Usinage ")
Serout 5,N600,(254,192,"Stop+Start= New X")

Pause 2000

If Pin2 = 1 And Pin3 = 1 Then Prg0

Goto Avance

;********************************************************* Routine d'affichage

Lcd1:

If Cent < 10 Then

Serout 5,N600,(254,192,"X = ",#Mili,",0",#Cent," mm ")

Else

Serout 5,N600,(254,192,"X = ",#Mili,",",#Cent," mm ")
Endif

Return

;********************************************************* Routine moteur

A1A2B1B2:
Gosub Arret

Index = Index & %00000111

Read index, b4 ;Lecture de la séquence dans l'eeprom.

Mot = Mot & %00000000 | b4 ;Envoi de cette séquence au L298N

Pulsout b.4,Pulse ;Pilote les "Enable" des 2 ponts en H

Pauseus Vitesse ;pause en µs regle la vitesse de translation

Return

;********************************************************* Routine d'arret

Arret:
If Pin2 = 1 Then
Flag1 = 1 ;STOP l' avance
Endif

If Pin3 = 1 Then ;START relance l' avance
Flag1 = 0
Endif

Mot = Mot & $F0 | %0001

If Flag1 = 1 Then Arret

Return
 

MGU

Senior Member
Bonjour,

Je n'ai pas d'avis sur les moteurs.

Mais pour l'affichage, le firmeware du LCD utilise la vitesse N2400.
A 16MHz, il faut écrire N2400_16 (voir doc).

Une autre remarque, j'ai lu la liste des symbols et ATTENTION!
Code:
Symbol Compteur = w8
Symbol Pulse = w11 ;Pour piloter les "Enable" du L298N
Symbol Fast = b16 ;Vitesse pour retour rapide
Symbol Flag1 = b17 ;Drapeau bouton Stop
Et comme la variable word w8 est composée des bytes (b17;b16), les bytes b16 et b17 sont utilisés deux fois.
Source de dysfonctionnements très difficiles à identifier.

Voici ma méthode (mais chacun est libre):

Il y a trois types de variables : bit (0 ou1), byte (1 octet) , word (2 octets) qui se partagent 28 octets (pour série M2).
Pour éviter les conflits, bien séparer les types dans la liste.

1 - type bit
b0 est réservé aux variables type "bit" (inutile de prendre un byte pour 0 ou 1).
b0 est décomposable en : bit0 ; bit1....; bit7

2 - type byte, en commençant par b1, et en incrémentant : b1; b2; ....

3 - type word, en commençant par le dernier: w13 (pour M2) et en décrémentant: w13 ; w12; w11....

En faisant attention lorsque les listes se rejoignent...
Je crois que cette méthode n'est pas mauvaise.

MM
 

PieM

Senior Member
pendant les arrêts j'alimente un seul bobinage.

J'ai prévu un L298 pour pouvoir mettre un moteur plus fort (18kg/cm) si besoin.
Je suis surpris par le fait que le moteur alimenté sous 24V soit immobilisé avec un bobinage alimenté par cette tension. Vous n'avez pas les références de ce moteur ? le courant limite des moteurs nécessite en principe une tension relativement faible en situation statique. 24V est la tension nécessaire pour le moteur en fonctionnement afin d'assurer une grande vitesse de rotation. Mais si cette tension est maintenue lors des arrêts le risque est de griller quelque chose !
C'est pour cela que l'utilisation d'un driver est fortement conseillée pour des cas comme celui-ci.

J'essaierai de commander le moteur non pas avec des pulsout sur ENA et B , mais par un PWM de duty variable sur ces entrées. C'est ce que fait un driver, le PWM étant commandé en fonction du feed back I moteur afin de l'optimiser quelle que soit la vitesse, y compris l'arrêt.


Bonnes remarques de MGU et de Besqueut . J'utilise le même principe que celui indiqué par MGU, il m'arrive même de conserver b1 pour des bits de flags, ou des calculs un peu particuliers.
Une autre remarque: a partir du moment ou vous utilisez des symboles, il est bon de les utiliser dans le reste du programme... :rolleyes:

Code:
Symbol Cent = w4
Symbol Fast = b16 ;Vitesse pour retour rapide
Symbol Flag1 = b17 ;Drapeau bouton Stop 
..............
w4 = 0
b16 = 10000
b17 = 0

un vieux post : http://www.picaxeforum.co.uk/showthread.php?19286-commande-moteur-pas-a-pas-a-l-attention-de-pieM/page2
 
Last edited:

jng27

New Member
Merci pour vos réponses
J'alimente le moteur pour l'instant a partir d'une alim. de labo en limitant le courant a 500 ma et la tension effective apparait a 3,2 volts. J' ai fait comme sur mon plateau diviseur ( qui a un l297) qui utilise un moteur de 18 kg/cm sans chauffer et une alim. a découpage de 24 v. En ce qui concerne l'alimentation d'un seul bobinage a l' arrêt ca ne marche pas; je l'ai testé hier soir car j'ai reçu mes circuits hier,ce sont des "Keyes L298 " Le 298 est monté sur un ci double face avec 7805,diodes d' état des entrées, diodes para surtentions, borniers ...22 &#8364; les 5 port compris et 6 jours pour venir de Chine.
Je vais rajouter un 297 car j' ai trouvé des indications sur sa gestion et entre autre sur la valeur de Vref mais mon problème sera alors le circuit imprimé que je sais dessiner mais pas ou le faire fabriquer. Tous les fabricants que j'utilisais avant d' être a la retraite ont disparut.
Bien sur j'ai ma solution actuelle qui fonctionne parfaitement avec un ci. Axe117 et un driver du commerce mais celui ci est plus gros que le moteur et c'est mon problème !
Pour les variables et l' affichage c'est corrigé et ça fonctionne.

Encore une question j' utilise ce genre d' expression Mot = Mot & $F0 | %0000 sans savoir ce que signifie "|" je n' ai rien trouvé dans la doc. ou je n'est pas cherché au bon endroit.

Encore merci
 

MGU

Senior Member
Encore une question j' utilise ce genre d' expression Mot = Mot & $F0 | %0000 sans savoir ce que signifie "|" je n' ai rien trouvé dans la doc. ou je n'est pas cherché au bon endroit.
C'est un OR (ou un OU)
Page 22

MM
 

PieM

Senior Member
Hum ...

Quelle est l'utilité de faire un OR %0000 ?
Dans l'absolu aucun. Mais cela permet de conserver une certaine logique concernant la commande des
sorties vers le PaP, le %0000 étant la séquence envoyée au moteur.

de la même façon le masque $F0 n'est peut être pas utile si les autres sorties du port ne sont pas utilisées...
 

PieM

Senior Member
@ jng27
Si vous utilisez une alim labo avec limitation de courant , je comprends mieux alors ! C'est elle qui fait le travail ...

Si votre 298 est déja monté sur un CI avec borniers, inutile de faire un CI pour le 297: utilisez une plaquette Veroboard.
 
Top