Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Commande moteur PAP avec rampe PWM
- F6FCO
Expert- Messages : 1417
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonjour tous,
Je me suis intéressé au sujet parce qu'on en parle en ce moment dans le forum et je vous présente le résultat de mes cogitations.
- Moteur PAP bipolaire
- driver BL-TB6560-V.20
Je n'ai pas géré la table de vérité pour les différentes positions du rotor, le driver s'en charge, il suffit de lui envoyer deux commandes: le signal d'horloge, un coup d'horloge = un pas et l'info de direction C/CW.
Ce qui était intéressant était de pondre le programme qui crée les rampes d'accélération et déscélération. Pour les besoins du sujet j'ai volontairement diminué les valeurs pour que ce soit plus compréhensible. Je ne sais pas comment sont codées les rampes dans les applications telles que LinuxCNC mais après essais je me suis aperçu qu'en faisant varier le rapport cyclique des créneaux le moteur ralentissait, la valeur optimum étant un rapport de 1/1, donc demi-alternance haute=demi alternance basse.
Pour l'instant je n'ai codé que la rampe d'accélération, je n'ai pas encore vraiment procédé à des essais sur un moteur, il me reste quelques modifs à faire dans le programme pour mettre des suites d'alternances à la même valeur et rallonger la longueur de la rampe. Dans l'exemple la rampe est suivie de 5 impulsions normales. Le code est perfectible mais çà fonctionne.
NOTA: le petit analyseur logique chinois à 3,95€ à bien été pratique pour la mise au point
Capture d'une séquence d'accélération:
Comme je sais que le code de quelqu'un d'autre est souvent imbuvable voici l'algorythme:
et le chronogramme de la rampe:
Le code pour un 16F88 cadencé à 4Mhz:
Je me suis intéressé au sujet parce qu'on en parle en ce moment dans le forum et je vous présente le résultat de mes cogitations.
- Moteur PAP bipolaire
- driver BL-TB6560-V.20
Je n'ai pas géré la table de vérité pour les différentes positions du rotor, le driver s'en charge, il suffit de lui envoyer deux commandes: le signal d'horloge, un coup d'horloge = un pas et l'info de direction C/CW.
Ce qui était intéressant était de pondre le programme qui crée les rampes d'accélération et déscélération. Pour les besoins du sujet j'ai volontairement diminué les valeurs pour que ce soit plus compréhensible. Je ne sais pas comment sont codées les rampes dans les applications telles que LinuxCNC mais après essais je me suis aperçu qu'en faisant varier le rapport cyclique des créneaux le moteur ralentissait, la valeur optimum étant un rapport de 1/1, donc demi-alternance haute=demi alternance basse.
Pour l'instant je n'ai codé que la rampe d'accélération, je n'ai pas encore vraiment procédé à des essais sur un moteur, il me reste quelques modifs à faire dans le programme pour mettre des suites d'alternances à la même valeur et rallonger la longueur de la rampe. Dans l'exemple la rampe est suivie de 5 impulsions normales. Le code est perfectible mais çà fonctionne.
NOTA: le petit analyseur logique chinois à 3,95€ à bien été pratique pour la mise au point
Capture d'une séquence d'accélération:
Comme je sais que le code de quelqu'un d'autre est souvent imbuvable voici l'algorythme:
et le chronogramme de la rampe:
Le code pour un 16F88 cadencé à 4Mhz:
Code : Tout sélectionner
;**********************************************************************
;
; NOM: PAP pwm1
; Date: 25/03/2018
; Auteur: F6FCO JC Buisson
; xtal: 4Mhz
;
; Commande de moteur PAP avec rampe démarrage PWM
;
;
;
;**********************************************************************
List p=16F88
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
OPTIONVAL EQU H'0008'
; --------------------------------------------------------------------------------------------
#define ck PORTB,0 ; clock
#define dir PORTB,1 ; direction
Echantillonnage EQU 16
;*********************************************************************
CBLOCK 0x020
rampe
r_cycl
etathaut
Reg_1
Reg_2
Reg_3
ENDC
;**********************************************************************
org 0x0000 ; Adresse de départ après reset
init
bsf STATUS,RP0 ; bank1
clrf ANSEL ; broches du CAN en I/O
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
clrf TRISB ; PORTB en sortie
bcf STATUS,5 ; bank0
;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
; IMPORTANT !! --> il faut impérativement que le rapport des tempos (tempo/tempobase) soit équivalent
; à la valeur de l'échantillonage/2, ici échantillonage = d'32', valeur basse choisie volontairement pour la démo.
main
;goto régime_normal
; ---------------------- début de la rampe d'accélération
debutrampe1
clrf r_cycl
reload1
bsf PORTB,0 ; on passe état haut
incf r_cycl
movlw Echantillonnage
movwf rampe
clrf etathaut
call tempobase
comptage1
incf etathaut
; test si etathaut = r_cycl
movf etathaut,W
subwf r_cycl,W
btfsc STATUS,Z
bcf PORTB,0 ; on passe état bas
; test si rampe = 0
decf rampe
btfss STATUS,Z
goto comptage1
call tempo ; alternance basse suivante
; test si r_cycl = valeur Echantillonnage
movlw Echantillonnage
subwf r_cycl,W
btfss STATUS,Z
goto reload1
; ------------------------- à partir d'ici la rampe d'accélération est terminée
; et on prend le rythme de croisière
régime_normal
call pas_normal
call pas_normal
call pas_normal
call pas_normal
call pas_normal
; etc. etc. le nombre de pas pourra être ultérieurement défini par une instruction gcode
bcf PORTB,0
call tempo_stop
goto main
pas_normal ; rapport cyclique de l'alternance = 1/1
bsf PORTB,0
call tempo
bcf PORTB,0
call tempo
return
; durée figée de l'alternance négative
tempo
; Délai 192 Cycles de la machine
movlw .63
movwf Reg_1
decfsz Reg_1,F
goto $-1
nop
nop
return
; durée = tempo/Echantillonnage 192/32=6
tempobase
; Délai 6 Cycles de la machine
movlw .1
movwf Reg_1
decfsz Reg_1,F
goto $-1
nop
nop
return
tempo_stop
; Délai 1 000 000 Cycles de la machine
; Durée du délai 1000 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .173
movwf Reg_1
movlw .19
movwf Reg_2
movlw .6
movwf Reg_3
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
decfsz Reg_3,F
goto $-5
nop
nop
return
END
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Commande moteur PAP avec rampe PWM
- ducran lapoigne
Débutant- Messages : 96
- Enregistré en : septembre 2015
bonsoir JC
j' ignorais que le rapport cyclique influençait la vitesse du moteur pas a pas
mais que l' impulsion devait avoir une certaine durée minimum, je savais
dans mon esprit, une rampe d' accélération c' était ceci
je vais donc suivre attentivement
j' ignorais que le rapport cyclique influençait la vitesse du moteur pas a pas
mais que l' impulsion devait avoir une certaine durée minimum, je savais
dans mon esprit, une rampe d' accélération c' était ceci
je vais donc suivre attentivement
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Commande moteur PAP avec rampe PWM
- F6FCO
Expert- Messages : 1417
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonsoir Antoine,
C'est toi qui a raison, j'ai testé ce soir et finalement çà marche mal. J'ai pondu un beau programme PWM qui ne donne pas grand chose sur le PAP, çà le fait juste tousser. Je vais garder çà pour mes moteurs CC.
Ce que tu montres semble être du PFM, je vais refaire un programme dans ce sens.
C'est toi qui a raison, j'ai testé ce soir et finalement çà marche mal. J'ai pondu un beau programme PWM qui ne donne pas grand chose sur le PAP, çà le fait juste tousser. Je vais garder çà pour mes moteurs CC.
Ce que tu montres semble être du PFM, je vais refaire un programme dans ce sens.
Commande moteur PAP avec rampe PWM
Bonjour F6FCO, ducran lapoigne, et tout le forum,
Bon j'ai regardé ta source F6FCO, et je la trouve bien, mais, parce que il y toujours un mais.
Le Pic16F88 à un Pwm intégré sur la broche RB0(patte 6), il faut juste l'activer, voilà comment faire.
Dans cette exemple la fréquence du Pwm est de 3900 Hz, pour 255 valeurs différentes, tu peux charger le fichier
dans ton Pic tu devrais avoir ton Pwm en sortie sur RB0(patte 6).
J'ai écrit un petit programme pour le réglage du Pwm ICI
A+
Bon j'ai regardé ta source F6FCO, et je la trouve bien, mais, parce que il y toujours un mais.
Le Pic16F88 à un Pwm intégré sur la broche RB0(patte 6), il faut juste l'activer, voilà comment faire.
Code : Tout sélectionner
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
LIST P=PIC16F88 ; Définition de processeur
#include <p16F88.inc> ; fichier include
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;*************************************** assignations *****************************************
;#DEFINE
;**********************************************************************************************
;****************************** déclaration des variables *************************************
;**********************************************************************************************
CBLOCK H'20'
bank0 : D'80' ; zone de la sdram en bank 0 : H'20' à H'6F' soit 80 octets
ENDC
CBLOCK H'A0'
bank1 : D'80' ; zone de la sdram en bank 1 : H'A0' à H'EF' soit 80 octets
ENDC
CBLOCK H'110'
bank2 : D'96' ; zone de la sdram en bank 2 : H'110' à H'16F' soit 96 octets
ENDC
CBLOCK H'190'
bank3 : D'96' ; zone de la sdram en bank 3 : H'190' à H'1EF' soit 96 octets
ENDC
CBLOCK H'70' ; zone de la sdram commune en bank 0, bank 1, bank 2, bank 3 : H'70' à H'7F' soit 16 octets
vitesse :1
pas :1
sens :1
loop1 :1
loop2 :1
ENDC
;**************************** adresse de depart après reset **********************************
ORG H'0'
goto debut
;******************************** lieu des interruptions **************************************
ORG H'4'
retfie
;**********************************************************************************************
debut
;**********************************************************************************************
BANKSEL bank1 ; passer en bank 1
;************************** configuration du registre OSCCON en bank 1 ************************
; fréquence pour l'oscillateur interne
; 01110000 oscillateur 8 MHz
; 01100000 oscillateur 4 MHz <-- mon choix
; 01010000 oscillateur 2 MHz
; 01000000 oscillateur 1 MHz
; 00110000 oscillateur 500 kHz
; 00100000 oscillateur 250 kHz
; 00010000 oscillateur 125 kHz
; 00000000 oscillateur 31.25 kHz
movlw B'01100000' ; choix sur 4 Mhz
movwf OSCCON ;
;************************** configuration du registre ANSEL en bank 1 *************************
movlw B'00010000' ; en mode numérique, 3(RA4)
movwf ANSEL ; en mode E/S 17(RA0),18(RA1),1(RA2),2(RA3),12(RB6),13(RB7)
;************************ configuration du registre OPTION_REG en bank 1 **********************
movlw B'10000000' ;
movwf OPTION_REG ; résistances hors service
;************************* configuration du registre CMCON en bank 1 **************************
movlw B'00000111'
movwf CMCON ; éteindre les comparateurs
;******************* configuration des registres TRISA & TRISB en bank 1 **********************
movlw B'00010000' ;
movwf TRISA ; configure les pattes dans TRISA
; 17(RA0),18(RA1),1(RA2),2(RA3),3(RA4),4(RA5),15(RA6),16(RA7)
movlw B'00000000' ;
movwf TRISB ; configure les pattes dans TRISB
; 6(RB0),7(RB1),8(RB2),9(RB3),10(RB4),11(RB5),12(RB6),13(RB7)
;************************ configuration du registre ADCON1 en bank 1 **************************
clrf ADCON1 ; b7 = détermine si le résultat de la conversion sera justifié à droite = 1 ou à gauche = 0
; b5 = VCFG1 sélection des tension de référence, Vref- = Vss
; b4 = VCFG0 sélection des tension de référence, Vref+ = Vdd
;**********************************************************************************************
BANKSEL bank0 ; passe en bank 0
;************************ configuration du registre ADCON0 en bank 0 **************************
movlw B'11100000' ; b7 = ADCS1 choisir la fréquence de fonctionnement du
movwf ADCON0 ; b6 = ADCS0 convertisseur en fonction de la fréquence d'horloge du PIC
; b5 = CHS2 sélection du canal RA4/AN4
; b4 = CHS1 sélection du canal RA4/AN4
; b3 = CHS0 sélection du canal RA4/AN4
; b2 = GO/DONE indique la fin de la conversion analogique, et permet de lancer la conversion
; b1 = N.C
; b0 = ADON mise en service du convertisseur 0 = arrêt : 1 = marche
;************************ configuration du registre PR2 en bank 0 *****************************
movlw D'255' ; réglage du "débordement" de TMR2
movwf PR2 ; PR2 D'255' fréquence à 3900 Hz
;************************ configuration du registre T2CON en bank 0 ***************************
movlw B'00000100' ; "prédiviseur à 1" bit zéro à 0, bit un à 0
movwf T2CON ; "timer on", bit deux à 1 (mise en route du timer2. 0 : arrêt. 1 : marche)
; "postdiviseur à 1" bit trois à 0, bit quatre à 0, bit cinq à 0, bit six à 0
; dans registre de contrôle
movlw B'00001100' ; "1100" 4 bits mode pwm
movwf CCP1CON ; "00" 2 bits pour variation du rapport cyclique
;**********************************************************************************************
clrf CCPR1L ; Pwm à zéro
clrf INTCON ; désactivé les interruptions
clrf PORTA ; PORTA à zéro
clrf PORTB ; PORTB à zéro
do
call delay_1ms
call choix_vitesse
goto do
;***********************************************************************************************
choix_vitesse
bsf ADCON0,ADON ; on lance l’acquisition (charge du condensateur)
nop
nop ; pause, temps de charge du condensateur
nop
bsf ADCON0,GO ; lancer la conversion A/D
btfsc ADCON0,GO ; si le bit GO est à 1 on va à la ligne 1
goto $-D'1' ; conversion n'est pas terminer
bcf ADCON0,ADON ; fin de conversion, éteindre convertisseur
movfw ADRESH
movwf CCPR1L ; représente le Pwm
return
;**********************************************************************************************
delay_1ms
movlw D'75'
movwf loop1
movlw D'2'
movwf loop2
decfsz loop1,F
goto $-D'1'
decfsz loop2,F
goto $-D'3'
return
end
Dans cette exemple la fréquence du Pwm est de 3900 Hz, pour 255 valeurs différentes, tu peux charger le fichier
dans ton Pic tu devrais avoir ton Pwm en sortie sur RB0(patte 6).
J'ai écrit un petit programme pour le réglage du Pwm ICI
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le ven. 30 mars 2018 19:43, modifié 2 fois.
Commande moteur PAP avec rampe PWM
- F6FCO
Expert- Messages : 1417
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Bonjour tout le monde,
Je te remercie Temps-X, je garde ta routine sous le coude . J'avais bien vu que le 16F88 faisait le PWM mais j'avais envie de le coder moi-même, c'était surtout un prétexte pour me servir du petit analyseur logique
Cette routine me servira pour des moteurs CC, je l'ai améliorée hier soir, maintenant on peut paramétrer le nombre de pulses recevant le même rapport cyclique pour allonger la longueur de rampe. Ici j'ai choisi sur 3 pulses:
J'arrete avec le PWM et je me mets sur une routin PFM.
Je te remercie Temps-X, je garde ta routine sous le coude . J'avais bien vu que le 16F88 faisait le PWM mais j'avais envie de le coder moi-même, c'était surtout un prétexte pour me servir du petit analyseur logique
Cette routine me servira pour des moteurs CC, je l'ai améliorée hier soir, maintenant on peut paramétrer le nombre de pulses recevant le même rapport cyclique pour allonger la longueur de rampe. Ici j'ai choisi sur 3 pulses:
J'arrete avec le PWM et je me mets sur une routin PFM.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 120 invités