pse-firmware/Core/Src/pse_stepper_planer.c
2023-08-21 14:24:59 +02:00

65 lines
1.7 KiB
C

/*
* pse_stepper_planer.c
*
* Created on: Aug 14, 2023
* Author: leo
*/
#include <stdint.h>
#include "PSE_unit.h"
#include "pse_stepper_planer.h"
void pse_stepper_planer_tick(pse_unit* units, uint8_t units_num){
for(int i = 0; i < units_num; i++){
pse_stepper_conf* c = units[i].stepper_conf;
int state;
if(c->step_max){
c->tick_counter %= 2;
state = c->tick_counter;
}
else{
c->tick_counter %= c->step_itvl;
state = c->tick_counter == 0;
}
c->tick_counter++;
HAL_GPIO_WritePin(c->STEP_GPIO_Port, c->STEP_GPIO_Pin, state);
}
}
void pse_sp_start_axis(pse_stepper_conf* conf){
HAL_GPIO_WritePin(conf->EN_GPIO_Port, conf->EN_GPIO_Pin, GPIO_PIN_RESET);
}
void pse_sp_stop_axis(pse_stepper_conf* conf){
HAL_GPIO_WritePin(conf->EN_GPIO_Port, conf->EN_GPIO_Pin, GPIO_PIN_SET);
}
void pse_sp_set_dir(pse_stepper_conf* conf, int dir){
HAL_GPIO_WritePin(conf->DIR_GPIO_Port, conf->DIR_GPIO_Pin, dir);
}
void pse_stepper_planer_compute_sps(pse_unit* unit){
pse_stepper_conf* c = unit->stepper_conf;
// magic constants are used to approximate pi and other multiplicatives constant as a rationnal
uint64_t numerator = (uint64_t)1 * unit->syringe->diameter * unit->syringe->diameter * PSE_STEPPER_INTERRUPT_RATE * PSE_STEPPER_SCREW_PITCH;
uint64_t denominator = (uint64_t)21220209 * unit->flow * PSE_STEPPER_STEPS_PER_ROTATION;
c->step_itvl = numerator / denominator;
}
void pse_sp_start_all(pse_unit* units, int units_num){
for(int i = 0; i < units_num; i++){
if(units[i].enabled)
pse_sp_start_axis(units[i].stepper_conf);
}
}
void pse_sp_stop_all(pse_unit* units, int units_num){
for(int i = 0; i < units_num; i++){
if(units[i].enabled)
pse_sp_stop_axis(units[i].stepper_conf);
}
}