#ifndef STEPPER_H #define STEPPER_H #include #include "periph/gpio.h" #include "periph/uart.h" #include "sensor.h" #include "byteorder.h" #include #include #include #include "event.h" #include "event/timeout.h" #ifdef __cplusplus extern "C" { #endif #define STEPPER_PARAM_VEL_MAX (25) #define STEPPER_PARAM_ACC_MAX (200) #define STEPPER_PARAM_VELOCITY_DEFAULT (0) #define STEPPER_PARAM_MICROSTEP_DEFAULT (16) #define STEPPER_PARAM_DIVISION_DEFAULT (200) #define STEPPER_PARAM_ANGLE_DEFAULT (0) #define STEPPER_PARAM_HOMING_ANGLE_DEFAULT (20) #define STEPPER_UART_SLAVE_ADDR (0x0) #define STEPPER_UART_SYNC (0x05) #define STEPPER_UART_REG_GCONF (0x00) #define STEPPER_UART_REG_GSTAT (0x01) #define STEPPER_UART_REG_IFCNT (0x02) #define STEPPER_UART_REG_SLAVECONF (0x03) #define STEPPER_GCONF_BIT_I_SCALE_ANALOG (0x0 << 0) #define STEPPER_GCONF_BIT_INTERNAL_RSENSE (0x1 << 1) // #define STEPPER_GCONF_BIT_SPREADCYCLE (0x1 << 2) // enable spreadcycle #define STEPPER_GCONF_BIT_SHAFT (0x0 << 3) // Non inverse #define STEPPER_GCONF_BIT_PDN_DISABLE (0x1 << 6) // Set to 1 when using UART #define STEPPER_GCONF_BIT_MSTEP_SELECT (0x1 << 7) // default datagram => 05 ff 00 00 00 01 01 bb #define STEPPER_GCONF_ADDR (0x00) // 0x00 #define STEPPER_GCONF_VALUES (0xC1000000UL) //(0x83800000UL) // 000001C1 set bit 0,6,7,8. 6: PDN disable is require for UART operation. // default datagram => 05 ff 6c 17 01 00 53 3e #define STEPPER_CHOPCONF_ADDR (0x6c) // 6C #define STEPPER_CHOPCONF_VALUES (0xB5810134UL)//(0xCA00004CUL) // 32000053 set dedge=0x1, intpol=0x1, mres=0x2, hstrt=0x5, toff=0x3. others are 0x0. //#define STEPPER_CHOPCONF_VALUES [0x32,0x00,0x00,0x53] // set dedge=0x1, intpol=0x1, mres=0x2, hstrt=0x5, toff=0x3. others are 0x0. /** * @brief Status and error codes */ enum { STEPPER_OK = 0, STEPPER_ERR = -1, STEPPER_DISABLED = -2, }; /** * @brief Direction for stepper */ typedef enum { STEPPER_FORWARD = 0x0, STEPPER_REVERSE = 0x1, } stepper_direction_t; /** * @brief Data structure holding the stepperice parameters needed for initialization */ typedef struct { gpio_t step_pin; gpio_t dir_pin; gpio_t enable_pin; uint8_t uart; uint8_t vel_max; uint8_t acc_max; uint8_t microstep; uint16_t division; float angle; } stepper_params_t; /** * @brief Device Descriptor for Stepper controller */ typedef struct { stepper_params_t p; float velocity_setpoint; stepper_direction_t direction; int16_t step_count; int16_t step_setpoint; uint32_t time_step; float step_angle; bool enable; event_t event; event_timeout_t event_timeout; event_queue_t *queue; thread_t *thread; thread_flags_t flags; char id; } stepper_t; typedef struct { event_queue_t* queue; sensor_t* sensor; } stepper_init_t; /** * @brief Initialize the stepper * * @param[out] stepper struct describing the stepper * @param[in] params static configuration parameters of stepper * * @return STEPPER_OK on success * @return STEPPER_ERR on error */ int stepper_init(stepper_t *stepper, const stepper_params_t *params); /** * @brief Instruct the stepper to move to setpoint * * @param[in] stepper struct describing the stepper * @param[in] count stepcount setpoint * @param[in] time_step time span in which to complete the move */ void stepper_set_setpoint(stepper_t *stepper, int16_t count, uint32_t time_step); //void stepper_set_velocity(stepper_t *stepper, float velocity); /** * @brief Change rotation direction of stepper * * @param[in] stepper struct describing the stepper * @param[in] direction move direction of stepper */ void stepper_set_direction(stepper_t *stepper, stepper_direction_t direction); //int stepper_time_step(stepper_t *stepper); int32_t stepper_get_count(stepper_t *stepper, float angle); /** * @brief Update next action. * Schedules a new event or when the set point is reached, signal the controller. * * @param[in] stepper struct describing the stepper */ void stepper_update(stepper_t *stepper); /** * @brief Return the current angle in radiansa * * @param[in] stepper struct describing the stepper * @param[out] angle angle in radians */ void stepper_get_angle(stepper_t *stepper, float *angle); /** * @brief Move stepper by a single step. * * @param[in] stepper struct describing the stepper */ int stepper_step(stepper_t *stepper); /** * @brief write to stepper register * * @param[in] stepper struct describing the stepper * @param[in] reg register adress * @param[in] data data to write in register */ void stepper_write(stepper_t *stepper, uint8_t reg, le_uint32_t *data); /** * @brief trigger read from stepper register * * @param[in] stepper struct describing the stepper * @param[in] reg register adress * * @note This function does not parse the answer from the stepper. Use a logic analyser for that. */ void stepper_read(stepper_t *stepper, uint8_t reg); /** * @brief enable stepper motor * * @param[in] stepper struct describing the stepper */ void stepper_enable(stepper_t *stepper); /** * @brief disable stepper motor * * @param[in] stepper struct describing the stepper */ void stepper_disable(stepper_t *stepper); #ifdef __cplusplus } #endif #endif /* STEPPER_H */