Je me suis amusé à coder une routine de génération de rampe d'accélération PAP, pour l'instant juste sur l'accélération, je verrai la décélération ensuite, une chose à la fois et le problème est plus complexe car il faut gérer le moment ou elle doit démarrer. Le nombre de pas et le nombre de pulses de la rampe sont paramétrables en jouant sur la valeur des variables nb_pas et accel. Pour faire simple et compréhensible j'ai laissé les calculs de pas en 8bits, ce qui fait qu'on est limité pour l'instant à 255pas, valeurs choisies dans l'exemple nb_pas=0xFF, accel=0x9.
Je travaille sur un calcul en 16bits.
Le chronogramme vu par l'analyseur logique, les valeurs choisies ici ne sont pas réalistes, juste pour tout avoir sur l'écran. Nb_pas=nombre de pas à effectuer, accel contient le nombre d'espaces à mettre entre deux pulses, quand accel arrive à zéro on a atteint la vitesse maxi de travail.
Largeur d'un espace=largeur d'un pulse:
L'ordinogramme de la routine:
Le code:
Code : Tout sélectionner
;**********************************************************************
;
; NOM: rampe d'acceleration pour moteur PAP
; Date: 08/04/2018
; Auteur: F6FCO JC Buisson
; xtal: 4Mhz
;
; Commande de moteur PAP en 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 clock PORTB,0 ; clock
#define dir PORTB,1 ; direction
BANK0 macro
bcf STATUS,RP0 ; passer banque0
endm
BANK1 macro
bsf STATUS,RP0 ; passer banque1
endm
pulse_haut macro
bsf clock
call tempo_base
endm
pulse_bas macro
bcf clock
call tempo_base
endm
;*********************************************************************
CBLOCK 0x020
nb_pas:2 ; nombre de pas à effectuer
accel ; nombre de temps morts entre deux pulses_haut au départ de la rampe
nb_pulses ; variable tampon
tampon ; variable tampon
Reg_1
Reg_2
Reg_3
ENDC
;**********************************************************************
org 0x0000 ; Adresse de départ après reset
init
BANK1 ; bank1
clrf ANSEL ; broches du CAN en I/O
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
clrf TRISB ; PORTB en sortie
BANK0 ; bank0
;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
main
;call tourne_en_continu ; pour test du moteur
;goto main
init_variables
movlw d'255'
movwf nb_pas ; nombre de pas à réaliser par le moteur pap
movlw d'90'
movwf accel ; nb temps morts par alternance au départ rampe
clrf nb_pulses
loop
pulse_haut
pulse_bas
;test de accel, pour le tester sans le déformer on le transfère et on travaille dans la variable tampon
movf accel,W
movwf tampon
movlw 1
subwf tampon
btfsc STATUS,Z
goto test_pas ; si accel=1 la rampe est terminée et on saute directement à test1 pour continuer à vitesse normale
decf accel ; sinon on rentre dans la routine d'acceleration pour ajouter des pulses bas entre deux pulses haut
movf accel,W
movwf nb_pulses
loop_ecart
pulse_bas
decf nb_pulses
btfss STATUS,Z
goto loop_ecart
goto loop
; test du nombre de pas parcourus, pour tester nb_pas sans déformer on transfère et travaille dans tampon
test_pas
movf nb_pas,W
movwf tampon
movlw 1
subwf tampon
btfss STATUS,Z
goto loop1
call tempo_fin_de_programme ; juste pour séparer chaque éxécution du programme
goto main
loop1
decf nb_pas
goto loop
tourne_en_continu ; routine pour tester le moteur en continu
pulse_haut
pulse_bas
return
tempo_base ; temps de base d'un pulse (demi_alternance)
; Délai 350 Cycles de la machine
; Durée du délai 350 microsecond
; Fréquence de l'oscillateur 4 MHZ
movlw .116
movwf Reg_1
decfsz Reg_1,F
goto $-1
nop
return
tempo_fin_de_programme
; Délai 200 000 Cycles de la machine
; Durée du délai 200 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .186
movwf Reg_1
movlw .4
movwf Reg_2
movlw .2
movwf Reg_3
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
decfsz Reg_3,F
goto $-5
nop
return
tempo1s
; Délai 1 000 000 Cycles de la machine
; Durée du délai 1 seconde
; 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
Petite vidéo en fonctionnement, on voit bien les pulses sur la led du driver:
https://www.youtube.com/watch?v=A9xCDQ7RGCY&feature=youtu.be

pour ta déduction, effectivement on ne peu pas appeler PWM, mais pour éviter les ennuies c'est celui-ci que je vais utiliser.
pour ta participation