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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Commande moteur PAP avec rampe PWM
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#1 Message par F6FCO » jeu. 29 mars 2018 17:38

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 :wink:

Capture d'une séquence d'accélération:
PWM.JPG


Comme je sais que le code de quelqu'un d'autre est souvent imbuvable voici l'algorythme:
algo29032018.jpg


et le chronogramme de la rampe:
chronogramme29032018.jpg


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.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Commande moteur PAP avec rampe PWM
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#2 Message par ducran lapoigne » jeu. 29 mars 2018 23:46

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

step acc.JPG


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
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#3 Message par F6FCO » jeu. 29 mars 2018 23:59

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.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Commande moteur PAP avec rampe PWM
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » ven. 30 mars 2018 02:10

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.

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       
:
      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 
      

P16F88.zip


Pwm.jpg


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.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Commande moteur PAP avec rampe PWM
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#5 Message par F6FCO » ven. 30 mars 2018 09:37

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 :-D

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:

Capturex3.JPG


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.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités