fdr1-modbus-slave/includes/arm.h
2026-03-10 16:46:46 +01:00

69 lines
3.9 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 = 1600 micropas
// 1 micropas ARM = 25µm
// ─────────────────────────────────────────────
// 8 microsteps
// #define ARM_UM_PER_USTEP 25U // µm par micropas
// #define ARM_USTEP_PER_REV 1600U // micropas par tour
// 4 microsteps
#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)
void ARM_SetLeft(uint16_t pos); // écriture registre 0x0804 (1/10 mm)
void ARM_SetRight(uint16_t pos); // é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_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);
uint16_t ARM_GetRight(void);
#endif // ARM_H