61 lines
3.5 KiB
C
61 lines
3.5 KiB
C
#ifndef ARM_H
|
|
#define ARM_H
|
|
|
|
#include <xc.h>
|
|
#include <stdint.h>
|
|
#include <macros.h>
|
|
|
|
// ─────────────────────────────────────────────
|
|
// Registres Modbus
|
|
// ─────────────────────────────────────────────
|
|
|
|
#define ARM_REG_GEAR 0x0802 // déplacement en µm par tour SPOOL
|
|
#define ARM_REG_OFFSET 0x0803 // distance capteur home → origine (µm)
|
|
#define ARM_REG_LEFT 0x0804 // position limite gauche (1/10 mm)
|
|
#define ARM_REG_RIGHT 0x0805 // position limite droite (1/10 mm)
|
|
|
|
// ─────────────────────────────────────────────
|
|
// Valeurs par défaut LEFT/RIGHT
|
|
// ─────────────────────────────────────────────
|
|
|
|
#define ARM_LEFT_DEFAULT 500U // 50.0 mm en dixièmes
|
|
#define ARM_RIGHT_DEFAULT 4500U // 450.0 mm en dixièmes
|
|
|
|
// ─────────────────────────────────────────────
|
|
// Mécanique
|
|
// 1 tour ARM = 40mm = 800 micropas (4 microsteps)
|
|
// 1 micropas ARM = 50µm
|
|
// ─────────────────────────────────────────────
|
|
|
|
#define ARM_UM_PER_USTEP 50U // µm par micropas
|
|
#define ARM_USTEP_PER_REV 800U // micropas par tour
|
|
#define ARM_UM_PER_REV ((uint32_t)ARM_UM_PER_USTEP * ARM_USTEP_PER_REV) // 40000µm
|
|
|
|
// ─────────────────────────────────────────────
|
|
// Limites gear
|
|
// ─────────────────────────────────────────────
|
|
|
|
#define ARM_GEAR_MIN 0 // µm (arrêt vgear)
|
|
#define ARM_GEAR_MAX 65535 // µm = 65.535mm par tour SPOOL
|
|
|
|
// ─────────────────────────────────────────────
|
|
// API publique
|
|
// ─────────────────────────────────────────────
|
|
|
|
void ARM_Init(void);
|
|
void ARM_UpdateTarget(void); // appelé depuis l'ISR SPOOL — met à jour arm_target_position
|
|
void ARM_Enable(uint8_t state); // ENABLE moteur ARM
|
|
void ARM_SetDir(uint8_t dir); // sens de rotation ARM
|
|
void ARM_SetFree(uint8_t state); // free ARM + désactive vgear (REG_CTRL bit1)
|
|
void ARM_GoToZero(void); // retour à LEFT, nouvelle bobine (REG_CTRL bit12)
|
|
void ARM_SetGear(uint16_t um); // écriture registre 0x0802
|
|
void ARM_SetOffset(uint16_t um); // écriture registre 0x0803 + sauvegarde EEPROM
|
|
uint16_t ARM_GetOffset(void); // lecture offset courant
|
|
void ARM_SetLeft(uint16_t dmm); // écriture registre 0x0804 (1/10 mm)
|
|
void ARM_SetRight(uint16_t dmm); // écriture registre 0x0805 (1/10 mm)
|
|
uint16_t ARM_GetLeft(void); // lecture position gauche courante
|
|
uint16_t ARM_GetRight(void); // lecture position droite courante
|
|
void ARM_SetRatio(uint16_t milli); // démultiplication SPOOL (0x0806) + EEPROM
|
|
|
|
#endif // ARM_H
|