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
Conversion moteur CC en servomoteur
- F6FCO

Expert- Messages : 2846
- Âge : 99
- Enregistré en : décembre 2017
- Localisation : Banlieue sud de Klyntar
- Contact :
Salut les gens,
Et re-bonne année.
Testeur TTL terminé j'ai encore besoin d'asm, j'ai envie de redémarrer le projet Rub1k qui était en stand-bye depuis 2ans à cause d'un servomoteur qui rendait l'âme, pourtant un servo 40kg, çà commençait à devenir onéreux à force, il faut commencer par régler ce problème. Donc arriver à en construire un encore plus costaud qui tiendrait la route pour soulever et baisser en aller/retours l'ensemble PAP nema17/pince et son servo avec toute la précision requise (voir le sujet sur le projet RUB1K).
L'idée est de coupler un encodeur à quadrature à un moteur CC, et de le faire tourner tant de pas par rapport à une consigne. S'il dépasse la consigne en marche avant on inverse la tension, s'il dépasse en arrière on ré-inverse, etc., et on le maintient dans la position consigne. Une espèce de PID maison, j'avais déjà fait un truc dans ce genre sur arduino.
https://www.youtube.com/watch?v=I8lomcwNn68
Sur cette vidéo j'utilisais un moteur Namiki démultiplié avec encodeur en quadrature de qualité intégré, du beau matos Japonais.
Toujours avec le moteur Namiki, cette fois en asm et PIC : viewtopic.php?f=29&t=1438
Pour l'appli RUB1K je pense que le Namiki sera trop faible, cette fois je commence avec un simple moteur cc pour la mise au point, je n'en attends pas de grandes performances pour le couple mais quand (si) le code sera opérationnel j'utiliserai un moteur démultiplié et c'est la résistance exercée par la démultiplication du train de pignons qui aidera au couple de maintien. Inconvénient: le déplacement sera lent, pas top pour résoudre un cube mais je ne vois pas d'autres solutions.
Petit montage prototype rapide sur un coin de table, un simple moteur CC 12v auquel j'ai couplé un encodeur chinois par liaison souple (un bout de tuyau nylon). Pullup et capas de découplages montées sur la breadboard, pilotage du moteur par l'extension drivers L298 enfichée sur la platine DEV.
En tournant l'axe à la main çà donne çà, c'est ok, signaux propres:
Seulement comme on n'est pas chez les bisounours rien ne va normalement, le moteur tournant sous tension donne çà, des rebonds en veux-tu en voilà:
En enlevant la charge sur l'axe c'est mieux mais toujours pas acceptable, encore des rebonds parasites:
Morale: ces encodeurs mécaniques chinois ne sont pas utilisables pour ce genre d'utilisation qui les pousse dans leurs limites, on est loin de l'encodeur optique du Namiki. Je vais tenter l'opération avec un de mes petits pap convertis en encodeur, on en avait déjà parlé quelque part sur le forum. Maintenant je dois aller affronter les ours dans mon atelier pour modifier le prototype.
Et re-bonne année.
Testeur TTL terminé j'ai encore besoin d'asm, j'ai envie de redémarrer le projet Rub1k qui était en stand-bye depuis 2ans à cause d'un servomoteur qui rendait l'âme, pourtant un servo 40kg, çà commençait à devenir onéreux à force, il faut commencer par régler ce problème. Donc arriver à en construire un encore plus costaud qui tiendrait la route pour soulever et baisser en aller/retours l'ensemble PAP nema17/pince et son servo avec toute la précision requise (voir le sujet sur le projet RUB1K).
L'idée est de coupler un encodeur à quadrature à un moteur CC, et de le faire tourner tant de pas par rapport à une consigne. S'il dépasse la consigne en marche avant on inverse la tension, s'il dépasse en arrière on ré-inverse, etc., et on le maintient dans la position consigne. Une espèce de PID maison, j'avais déjà fait un truc dans ce genre sur arduino.
https://www.youtube.com/watch?v=I8lomcwNn68
Sur cette vidéo j'utilisais un moteur Namiki démultiplié avec encodeur en quadrature de qualité intégré, du beau matos Japonais.
Toujours avec le moteur Namiki, cette fois en asm et PIC : viewtopic.php?f=29&t=1438
Pour l'appli RUB1K je pense que le Namiki sera trop faible, cette fois je commence avec un simple moteur cc pour la mise au point, je n'en attends pas de grandes performances pour le couple mais quand (si) le code sera opérationnel j'utiliserai un moteur démultiplié et c'est la résistance exercée par la démultiplication du train de pignons qui aidera au couple de maintien. Inconvénient: le déplacement sera lent, pas top pour résoudre un cube mais je ne vois pas d'autres solutions.
Petit montage prototype rapide sur un coin de table, un simple moteur CC 12v auquel j'ai couplé un encodeur chinois par liaison souple (un bout de tuyau nylon). Pullup et capas de découplages montées sur la breadboard, pilotage du moteur par l'extension drivers L298 enfichée sur la platine DEV.
En tournant l'axe à la main çà donne çà, c'est ok, signaux propres:
Seulement comme on n'est pas chez les bisounours rien ne va normalement, le moteur tournant sous tension donne çà, des rebonds en veux-tu en voilà:
En enlevant la charge sur l'axe c'est mieux mais toujours pas acceptable, encore des rebonds parasites:
Morale: ces encodeurs mécaniques chinois ne sont pas utilisables pour ce genre d'utilisation qui les pousse dans leurs limites, on est loin de l'encodeur optique du Namiki. Je vais tenter l'opération avec un de mes petits pap convertis en encodeur, on en avait déjà parlé quelque part sur le forum. Maintenant je dois aller affronter les ours dans mon atelier pour modifier le prototype.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Conversion moteur CC en servomoteur
Bon courage pour les ours (gla gla....)
Pour le reste aussi. Le Rubik va reprendre du service.
De mon côté je cogite quand j'ai 5min a mon projet de cube solver sur la meilleur façon de fabriquer la chose (même si je sais qu'il y aura des améliorations après la v1)
J'aimerais dans l'idéal avoir le cube bloqué de ses 6 axes en position "diamant" mais à voir la mécanique pour car je n'y connais rien en meca
@++
Pour le reste aussi. Le Rubik va reprendre du service.
De mon côté je cogite quand j'ai 5min a mon projet de cube solver sur la meilleur façon de fabriquer la chose (même si je sais qu'il y aura des améliorations après la v1)
J'aimerais dans l'idéal avoir le cube bloqué de ses 6 axes en position "diamant" mais à voir la mécanique pour car je n'y connais rien en meca
@++
Conversion moteur CC en servomoteur
[quote="F6FCO"Je vais tenter l'opération avec un de mes petits pap convertis en encodeur, on en avait déjà parlé quelque part sur le forum.[/quote]
J'avais fait des essais avec un pap de HDD, c'est bof bof bof...
Tu connais ces machins là : https://fr.aliexpress.com/item/1005009525067438.html
J'avais fait des essais avec un pap de HDD, c'est bof bof bof...
Tu connais ces machins là : https://fr.aliexpress.com/item/1005009525067438.html
Conversion moteur CC en servomoteur
Bonjour,
Bonne année, et surtout bonne santé à tous le monde,
Utilisé un encodeur pas bon du tout, il faut utiliser un potentiomètre linéaire, c'est le principe du servo....
il suffit de démonter un petit servo, (même si celui-ci a les engrenages endommagés, mais pas l'électronique)
Si tu regardes la datasheet des circuits des petits servos, tu vas t'apercevoir qu'il y a un ADC ou un Comparateur qui est branché sur le potentiomètre, quant au potentiomètre autant prendre la même valeur.
C'est pour cela que je garde les servos endommagés quand j'ai un crash de mon hélicoptère, car l'électronique est bonne, mais pas les engrenages qui sont très souvent endommagés.
A+
Bonne année, et surtout bonne santé à tous le monde,
Utilisé un encodeur pas bon du tout, il faut utiliser un potentiomètre linéaire, c'est le principe du servo....
il suffit de démonter un petit servo, (même si celui-ci a les engrenages endommagés, mais pas l'électronique)
Si tu regardes la datasheet des circuits des petits servos, tu vas t'apercevoir qu'il y a un ADC ou un Comparateur qui est branché sur le potentiomètre, quant au potentiomètre autant prendre la même valeur.
C'est pour cela que je garde les servos endommagés quand j'ai un crash de mon hélicoptère, car l'électronique est bonne, mais pas les engrenages qui sont très souvent endommagés.
Modifié en dernier par Temps-x le dim. 4 janv. 2026 17:51, modifié 1 fois.
Conversion moteur CC en servomoteur
Conversion moteur CC en servomoteur
Conversion moteur CC en servomoteur
- F6FCO

Expert- Messages : 2846
- Âge : 99
- Enregistré en : décembre 2017
- Localisation : Banlieue sud de Klyntar
- Contact :
Utilisé un encodeur pas bon du tout, il faut utiliser un potentiomètre linéaire, c'est le principe du servo....
Seulement un des principes, on peut commander d'une autre manière avec un encodeur mécanique, roue codeuse, etc., voir ici https://fantaspic.fr/viewtopic.php?p=21729#p21729, j'ai refait des essais avec ce système ce matin et çà fonctionne bien, je vais m'en servir de base pour continuer.
Ca fonctionne bien avec un encodeur, le souci actuel c'est que j'utilise un encodeur mécanique à bas prix qui génère des rebonds à partir d'une certaine vitesse, sur la vidéo du lien j'utilise un encodeur maison avec une roue codeuse mais c'est un peu compliqué mécaniquement.
J'avais fait des essais avec un pap de HDD, c'est bof bof bof...
De mon coté j'ai eu de bons résultats avec les miens mais il faut actionner l'axe assez énergiquement pour générer la tension en créneaux, çà devrait le faire avec la rotation du moteur. C'est sur que si on actionne l'axe avec la douceur d'un encodeur lambda ce n'est pas suffisant.
Tu connais ces machins là : https://fr.aliexpress.com/item/1005009525067438.html
Non je ne connaissais pas, encore un truc à tester, j'espère qu'il y a un datasheet consistant pour démarrer avec. Toi tu vas finir par me ruiner à force
Conversion moteur CC en servomoteur
Conversion moteur CC en servomoteur
Bonsoir,
Ce n'est pas une question de prix, le système mécanique n'est pas bon à la longue, usure... même les servos du commerce ont leurs limites sur l'utilisation.
Faisant du modèle réduit, dans le domaine des hélicoptères, je suis obligé de changer certains de mes servos tous les 3 ans (usure du potentiomètre, même avec des servos de grande marque).
A+
F6FCO a écrit :Source du message Ca fonctionne bien avec un encodeur, le souci actuel c'est que j'utilise un encodeur mécanique à bas prix qui génère des rebonds à partir d'une certaine vitesse,
Ce n'est pas une question de prix, le système mécanique n'est pas bon à la longue, usure... même les servos du commerce ont leurs limites sur l'utilisation.
Faisant du modèle réduit, dans le domaine des hélicoptères, je suis obligé de changer certains de mes servos tous les 3 ans (usure du potentiomètre, même avec des servos de grande marque).
Conversion moteur CC en servomoteur
- F6FCO

Expert- Messages : 2846
- Âge : 99
- Enregistré en : décembre 2017
- Localisation : Banlieue sud de Klyntar
- Contact :
Salut les gens,
Projet terminé et validé, j'ai mon servo super puissant.
Il utilise une routine de gestion d'encodeur, j'en ai déjà fait plusieurs fonctionnelles mais j'avais en tête une autre façon et pas pu résister à tout recoder from scratch.
En premier définir la table de vérité de l'encodeur, et en tenant compte des erreurs (utile pour gérer les rebonds intempestifs, bien que j'ai réussi à les éliminer), juste pour entraîner les neurones
On voit que les signaux déphasés A et B forment la séquence en sens horaire 00, 01, 11, 10, et le contraire en sens anti-horaire 10, 11, 01, 00. Tout changement dans cette séquence serait une erreur (rebond, vibration, etc.) et prise en compte par le programme.
L'écriture de la table de vérité dans une table 4x4 est pratique pour bien visualiser le truc.
A savoir avant de continuer: les encodeurs chinois mécaniques (les miens en tout cas) ont 20 crans par tour, ce qui ne veut pas dire qu'ils ont 20 pas (la bonne appelation est 'ticks'), on compte 4 ticks par pas comme on peut le voir sur cette capture d'écran: 11, 01, 00, 10, ...
Donc 20x4= 80 ticks, ce qui bienl pour cette application, un encodeur plus précis et plus de ticks aurait compliqué la gestion des déplacements qui se font au max -128 ticks et +128 tiks.
Partant de cela j'ai pondu l'algo suivant qui retourne les infos suivantes:
ptr: octet de comptage des ticks produits
bit H: sens horaire à 1 en sens horaire sinon 0
bit AH: sens anti-horaire à 1 en sens AH sinon 0
bit immo: à 1 si encodeur non bougé sinon 0
Un peu grand alors sur 2 pages
Ensuite j'ai fais des essais avec plusieurs encodeurs et moteurs.
Ici moteur cc 12v de visseuse piloté par un encodeur à base de pap dont on a déjà parlé
et les signaux produits
J'ai laissé tomber cette idée pour ce projet parce que je voudrais avoir un système reproductible et à bas prix, en définitive j'ai utilisé un moteur gearbox chinois 12v/40rpm et un encodeur mécanique chinois à 0.80€.
A noter que les encodeurs mécaniques chinois généraient comme dit plus haut beaucoup de rebonds que j'ai pu résorber en rajoutant juste une capa de 1µF en // avec les 100n sur les sorties de l'encodeur. Depuis j'obtiens des signaux très propres.
L'histoire de l'encodeur étant réglée je suis passé sur la gestion du servomoteur, au final çà marchait bien mais çà "frétillait" sur la position, j'ai résolu le souci en ajoutant une tolérance dans la position.
Gestion en déplacement H
gestion en déplacement AH
Le nez dans le guidon je n'ai pas pensé à faire plus de photos des autres tests mais quand même une courte vidéo avec le papencodeur, des encodeurs chinois, des moteurs gearbox et un moteur de visseuse non démultiplié.
Le moteur de visseuse était juste là pour mettre le truc au point, pas tellement utilisable car aucun couple et déplacement trop rapide mais il m'a servi à coder les contre-réactions en cas de dépassement des consignes (erreurs, inertie du bras, etc.), choses plus difficiles à observer avec le torque des trains de pignons des moteurs gearbox.
https://www.youtube.com/watch?v=X2tccNbFqAI
Pour travailler sur un octet et ne pas compliquer le code j'initialise en début de programme la position zéro du bras à 128 pour éviter les erreurs de débordement.
Exemple pour avoir un déplacement de +20 et -20 je règle: consigneH=148 et consigneAH=108, le bras se déplace et reste en position dés qu'il atteint ces valeurs.
Projet terminé et validé, j'ai mon servo super puissant.
Il utilise une routine de gestion d'encodeur, j'en ai déjà fait plusieurs fonctionnelles mais j'avais en tête une autre façon et pas pu résister à tout recoder from scratch.
En premier définir la table de vérité de l'encodeur, et en tenant compte des erreurs (utile pour gérer les rebonds intempestifs, bien que j'ai réussi à les éliminer), juste pour entraîner les neurones
On voit que les signaux déphasés A et B forment la séquence en sens horaire 00, 01, 11, 10, et le contraire en sens anti-horaire 10, 11, 01, 00. Tout changement dans cette séquence serait une erreur (rebond, vibration, etc.) et prise en compte par le programme.
L'écriture de la table de vérité dans une table 4x4 est pratique pour bien visualiser le truc.
A savoir avant de continuer: les encodeurs chinois mécaniques (les miens en tout cas) ont 20 crans par tour, ce qui ne veut pas dire qu'ils ont 20 pas (la bonne appelation est 'ticks'), on compte 4 ticks par pas comme on peut le voir sur cette capture d'écran: 11, 01, 00, 10, ...
Donc 20x4= 80 ticks, ce qui bienl pour cette application, un encodeur plus précis et plus de ticks aurait compliqué la gestion des déplacements qui se font au max -128 ticks et +128 tiks.
Partant de cela j'ai pondu l'algo suivant qui retourne les infos suivantes:
ptr: octet de comptage des ticks produits
bit H: sens horaire à 1 en sens horaire sinon 0
bit AH: sens anti-horaire à 1 en sens AH sinon 0
bit immo: à 1 si encodeur non bougé sinon 0
Un peu grand alors sur 2 pages
Ensuite j'ai fais des essais avec plusieurs encodeurs et moteurs.
Ici moteur cc 12v de visseuse piloté par un encodeur à base de pap dont on a déjà parlé
et les signaux produits
J'ai laissé tomber cette idée pour ce projet parce que je voudrais avoir un système reproductible et à bas prix, en définitive j'ai utilisé un moteur gearbox chinois 12v/40rpm et un encodeur mécanique chinois à 0.80€.
A noter que les encodeurs mécaniques chinois généraient comme dit plus haut beaucoup de rebonds que j'ai pu résorber en rajoutant juste une capa de 1µF en // avec les 100n sur les sorties de l'encodeur. Depuis j'obtiens des signaux très propres.
L'histoire de l'encodeur étant réglée je suis passé sur la gestion du servomoteur, au final çà marchait bien mais çà "frétillait" sur la position, j'ai résolu le souci en ajoutant une tolérance dans la position.
Gestion en déplacement H
gestion en déplacement AH
Le nez dans le guidon je n'ai pas pensé à faire plus de photos des autres tests mais quand même une courte vidéo avec le papencodeur, des encodeurs chinois, des moteurs gearbox et un moteur de visseuse non démultiplié.
Le moteur de visseuse était juste là pour mettre le truc au point, pas tellement utilisable car aucun couple et déplacement trop rapide mais il m'a servi à coder les contre-réactions en cas de dépassement des consignes (erreurs, inertie du bras, etc.), choses plus difficiles à observer avec le torque des trains de pignons des moteurs gearbox.
https://www.youtube.com/watch?v=X2tccNbFqAI
Pour travailler sur un octet et ne pas compliquer le code j'initialise en début de programme la position zéro du bras à 128 pour éviter les erreurs de débordement.
Exemple pour avoir un déplacement de +20 et -20 je règle: consigneH=148 et consigneAH=108, le bras se déplace et reste en position dés qu'il atteint ces valeurs.
Code : Tout sélectionner
; ***********************************************************************************************
; F6FCO
; Réglages des fusibles 18f2525
;
;************************************************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f2525 ; processeur utilisé
#include <p18f2525.inc> ; Définitions des constantes PIC
CONFIG OSC = INTIO67 ; Oscillateur interne 8MHz
;CONFIG OSC = XT ; Oscillateur xtal externe
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)
Code : Tout sélectionner
;******************************************************************************
; F6FCO - janvier 2026
; Utilisation d'un moteur CC en servomoteur
; horloge 8Mhz interne
;
;******************************************************************************
; IMPORTANT, A SAVOIR !!!
; Les encodeurs mécaniques chinois bon marché d'Aliexpress génèrent 4 ticks par cran
; 1 tour = 20 crans (pas) = 80 ticks
;
#include<Fusibles 18f2525.asm>
; gestion encodeur
#define pinA PORTB,0 ; pin A encodeur
#define pinB PORTB,1 ; pin B encodeur
#define H encodeurB,0
#define AH encodeurB,1
#define immo encodeurB,2
;gestion moteur cc
#define driverA LATB,2 ; driver L298
#define driverB LATB,3 ; driver L298
CBLOCK 0x00C
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
new :1 ; état T de l'encodeur (recopie PORTB)
old :1 ; état T-1 encodeur
ptr :1 ; nombre de ticks
val_00 :1
val_01 :1
val_11 :1
val_10 :1
encodeurB :1 ; bits de gestion
; <0> H ; 1 si tourné sens horaire
; <1> AH ; 1 si tourné sens anti-horaire
; <2> immo ; 1 si immobile
; <3>
; <4>
; <5>
; <6>
; <7>
consigneH :1 ; valeur de déplacement sens horaire
consigneAH :1 ; valeur de déplacement sens anti-horaire
ENDC
org 0x000 ; Adresse de départ après reset
bra init
; ------------------------ Routines Interruptions
;sauvegarder registres
org 0x008 ; 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 MSSP
btfss PIR1,SSPIF ; <3>
bra restorereg
call intMSSP ; on vient d'avoir une int MSSP, on la traite
;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
intMSSP
movff SSPBUF,conchita
bsf SSPCON1,CKP ; on relâche l'horloge
bcf PIR1,SSPIF ; <3> raz flag d'interrupt
return
; ------------------------ Init
init
clrf EEADR ; diminue la consommation
; init oscillateur
movlw 0xff ; Horloge interne 8Mhz
movwf OSCCON
; init ports
movlw 0xff
movwf ADCON1 ; mode digital
bcf ADCON0,ADON ; <0> CAN désactivé
movlw 0x07
movwf CMCON ; mode comparateur désactivé
movlw b'00000011'
movwf TRISB
clrf PORTB
clrf LATB
movlw b'00000000' ; rc3/rc4 I2C
movwf TRISC
clrf PORTC
clrf LATC
; init interruptions
bsf RCON,IPEN
bsf INTCON,GIE ; <7> int non masquées activées
bsf INTCON,PEIE ; <6> int périphériques non masquées activées
bsf PIE1,SSPIE ; <3> MSSP activé
bcf PIR1,SSPIF ; <3> flag interrupt à zéro
bsf SSPCON1,SSPEN ; <5> rb0 et rb1 en mode SDA/SCL
; mode esclave 7 bits avec interruptions
bsf SSPCON1,SSPEN ; <5>
bsf SSPCON1,CKP ; <4>
bcf SSPCON1,SSPM0 ; <0>
bsf SSPCON1,SSPM1 ; <1>
bsf SSPCON1,SSPM2 ; <2>
bcf SSPCON1,SSPM3 ; <3>
bsf SSPCON2,SEN ; <0> Etirement horloge activé
; adresse esclave
movlw b'00010000'
movwf SSPADD
bsf SSPSTAT,S ; <3> startbit
; ------------------------- initialisation variables gestion encodeur
movlw b'00000000'
movwf val_00
movlw b'00000001'
movwf val_01
movlw b'00000011'
movwf val_11
movlw b'00000010'
movwf val_10
movff PORTB,WREG
andlw b'00000011' ; isole b0 et b1 (pins encodeur)
movff WREG,old ; état T-1 de l'encodeur
nop
clrf conchita
clrf encodeurB
movlw d'128'
movwf ptr
clrf new
clrf old
; vers main
; -----------------------------------
Code : Tout sélectionner
#include <ServoMoteurCC_init.asm>
;main
; On travaille sur un octet, on a 256 ticks de déplacement,
; pour éviter des erreurs de comptage (>255 ou <0), on régle la position
; repos sur la valeur 128.
; Le déplacement du bras se fera donc autour de la valeur médiane d'128'
;
movlw d'148' ; +20 pas en déplacement horaire (128+20)
movwf consigneH
movlw d'108' ; -20 pas en déplacement anti-horaire (128-20)
movwf consigneAH
main nop
call rotationHoraire ; tourne sens horaire jusqu'à consigneH
call tempo_ms
;nop
;call rotationAntiHoraire ; tourne sens anti-horaire jusqu'à consigneAH
;call tempo
nop
bra main
#include <Routines_ServoMoteurCC.asm>
#include <Routines_encodeur.asm>
END
Code : Tout sélectionner
rotationHoraire
rh nop
call gestion_encodeur ; retourne le nombre de ticks dans ptr
nop
movff consigneH,WREG ; consigneH dans W
cpfsgt ptr ; ptr > consigneH ?
bra rh1
mAH nop
bcf driverA ; on tourne AH pour rattraper
bsf driverB
bra rh
rh1 nop
cpfslt ptr ; ptr < consigneH ?
bra rh2
mH nop
bsf driverA ; on tourne H pour rattraper
bcf driverB
nop
bra rh
rh2 cpfseq ptr ; ptr = consigneH ?
bra mS
bra rh
mS bcf driverA
bcf driverB
return
tempo
; Délai 1 600 000 Cycles de la machine
; Durée du délai 800 millisecond
; Fréquence de l'oscillateur 8 MHZ
movlw .228
movwf Reg_1,1
movlw .30
movwf Reg_2
movlw .9
movwf Reg_3
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
decfsz Reg_3
bra $-.10
nop
return
Code : Tout sélectionner
gestion_encodeur
nop
movff PORTB,WREG
andlw b'00000011' ; isole b0 et b1 (pins encodeur)
movff WREG,new ; état T dans new
movff old,WREG ; état T-1 dans W
cpfseq val_00
bra e1
bra a0 ; saute si encodeur =00
e1 cpfseq val_01
bra e2
bra b0 ; saute si encodeur =01
e2 cpfseq val_11
bra e3
bra c0 ; saute si encodeur =11
e3 cpfseq val_10
fin return
bra d0 ; saute si encodeur =10
a0 movff new,WREG
cpfseq val_00 ;immo
bra a1a
bra a3
a1a cpfseq val_11 ; erreur
bra a1
bra a3
a1 cpfseq val_01 ; H
bra a2
bra a4
a2 cpfseq val_10 ; AH
return
bra a5
b0 movff new,WREG
cpfseq val_00 ; AH
bra b1
bra b3
b1 cpfseq val_01 ; immo
bra b2a
bra b4
b2a cpfseq val_10 ; erreur
bra b2
bra b4
b2 cpfseq val_11 ;H
return
bra b5
c0 movff new,WREG
cpfseq val_01 ; AH
bra c1
bra c3
c1 cpfseq val_00 ; erreur
bra c2a
bra c4
c2a cpfseq val_11 ; immo
bra c2
bra c4
c2 cpfseq val_10 ; H
return
bra c5
d0 movff new,WREG
cpfseq val_00 ; H
bra d1
bra d3
d1 cpfseq val_11 ; AH
bra d2a
bra d4
d2a cpfseq val_01 ; erreur
bra d2
bra d5
d2 cpfseq val_10 ; immo
return
bra d5
a3 bsf immo
bcf H
bcf AH
movff new,old
return
a4 bcf immo
bsf H
bcf AH
movff new,old
incf ptr
return
a5 bcf immo
bcf H
bsf AH
movff new,old
decf ptr
return
b3 bcf immo
bcf H
bsf AH
movff new,old
decf ptr
return
b4 bsf immo
bcf H
bcf AH
movff new,old
return
b5 bcf immo
bsf H
bcf AH
movff new,old
incf ptr
return
c3 bcf immo
bcf H
bsf AH
movff new,old
decf ptr
return
c4 bsf immo
bcf H
bcf AH
movf new,old
return
c5 bcf immo
bsf H
bcf AH
movff new,old
incf ptr
return
d3 bcf immo
bsf H
bcf AH
movff new,old
incf ptr
return
d4 bcf immo
bcf H
bsf AH
movff new,old
decf ptr
return
d5 bsf immo
bcf H
bcf AH
movff new,old
return
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 : Google [Bot] et 1 invité

