Ce sujet est en lien avec le sujet Rub1k et le défi de réaliser un servomoteur plus puissant que les petits servos de modélisme.
Le but étant de pouvoir élever un moteur NEMA16 glissant sur un rail vertical, les servos de modélisme ne peuvent le garder en haut une fois dé-alimentés. Le moteur redescend sous l'effet de son poids, l'idée est de partir sur un moteur CC avec une boite de démultiplication pour avoir du couple à vide et pouvoir contrer le poids du NEMA16 tenant son cube.
Il faut que le moteur soit équipé d'un disque codeur sur son axe, quand le moteur tourne il envoie des ticks sur l'entée T0CKI avec le Timer0 en mode compteur et le nombre de ticks est stocké dans TMR0L (et TMR0H si on veut faire beaucoup de tours et que le nb de ticks nécessaires dépasse 255). Quand le nombre de ticks atteint la consigne le moteur s'arrête. Une fois stoppé le moteur reste en position par la force de sa démultiplication.
Pour repartir dans l'autre sens on met TMR0L à zéro et on recommence en inversant l'alim.
Le moteur est interfaçé par un pont en H L298, il suffit de mettre les deux entrées du pont à 10, 01 ou 00 pour le faire tourner dans un sens, dans l'autre ou le stopper.
La course de déplacement du moteur est réglable par la valeur de consigne stipulée dans les #define
Code : Tout sélectionner
;**********************************************************************
;
; Asservissement en position moteur CC
; F6FCO - juin 2024
;
;**********************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4525 ; processeur utilisé
#include <p18f4525.inc> ; Définitions des constantes PIC
CONFIG OSC = INTIO67 ; Oscillateur interne 8MHz
CONFIG IESO = OFF ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = ON ; Mclr configuré comme entrée
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = OFF ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
; --------- moteur à asservir
#define Namiki_mot1 PORTA,0
#define Namiki_mot2 PORTA,1
#define Namiki_opto PORTA,4 ; optocoupleur du moteur
#define consigne d'100'
CBLOCK 0x000C
w_temp :1 ; Sauvegarde du registre W
status_temp :1 ; Sauvegarde du registre STATUS
Reg_1 :1
Reg_2 :1
Reg_3 :1
conchita :2 ; variable bonne à tout faire
ENDC
org 0x0000 ; Adresse de départ après reset
bra init ; Adresse 0: initialiser
; ------------------------ Routines Interruptions
; sauvegarder registres
org 0x0008 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
; Interrupt TIMER0
btfsc INTCON,TMR0IE ; bit5. interrupt timer0 autorisée ?
btfss INTCON,TMR0IF ; bit2. si oui, tester si interrupt timer en cours
bra restorereg
call inttimer0 ; vers routine interrupt timer0
bcf INTCON,TMR0IF ; effacer flag interrupt timer0
; restaurer registres
restorereg
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W, sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W, W restauré sans modifier status
retfie ; return from interrupt
; Routine d'interruption TIMER 0
inttimer0 return
; ------------------------ Init
init clrf EEADR ; diminue la consommation
movlw 0xff ; init oscillateur à 8MHz
movwf OSCCON
; init Timer0
movlw 0xA8 ; compteur 16bits sur pin TOCKI sans prescaler
movwf T0CON
; init TMR0
clrf TMR0L
clrf TMR0
; inti ports
clrf PORTA
movlw 0x0F
movwf ADCON1 ; mode digital
movlw b'00010000'
movwf TRISA
movlw b'10100000' ; masque interruption
movwf INTCON ; charger interrupt control
clrf conchita
; goto main
; -----------------------------------
Fichier main
Code : Tout sélectionner
#include<Asserv_CC_init.asm>
; Le moteur est branché sur un driver pont en H L298
; il nécessite des niveaux haut et/ou bas sur Namiki_mot1 et Namiki_mot2
; pour tourner dans un sens, dans l'autre ou stopper.
; Quand le nombre de ticks issus de l'optocoupleur du moteur atteint
; la valeur de consigne le moteur stoppe.
main
call Namiki
bra main
Namiki
; tourne sens horaire
clrf TMR0L
bcf Namiki_mot1
bsf Namiki_mot2
nm1 ; teste si consigne atteinte
movff TMR0L,conchita
movf conchita,w
sublw consigne
bnz nm1
; stop moteur
bcf Namiki_mot1
bcf Namiki_mot2
call tempo1s
; tourne dans le sens anti-horaire
clrf TMR0L
bsf Namiki_mot1
bcf Namiki_mot2
nm2 ; teste si consigne atteinte
movff TMR0L,conchita
movf conchita,w
sublw consigne
bnz nm2
; stop moteur
bcf Namiki_mot1
bcf Namiki_mot2
call tempo1s
return
tempo1s
movlw .93
movwf Reg_1,1
movlw .38
movwf Reg_2
movlw .11
movwf Reg_3
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
decfsz Reg_3
bra $-.10
nop
nop
return
END
https://www.youtube.com/watch?v=i0zfHCr5XsE
EDIT: je me suis gouré de forum, je voulais poster dans le forum ASM

Peut-être mettre une butée solide en position (reculée) basse du pap et on le positionne manuellement contre avant de démarrer le système. Une POM mécanique.