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

