/* * position.c * * Author: Andrey Koryagin https://blog.avislab.com/ */ #include "u_foc.h" #define POSITION_MAX 4095 extern volatile SettingsStruct Settings; PIDstruct PositionPID; int32_t POSITION_TASK = 0; int32_t Position_Calc () { int32_t pos; //pos = (int32_t)MC_ADC_GetRegularValue(ADC_POT) - POSITION_TASK; pos = POSITION_TASK - (int32_t)MC_ADC_GetRegularValue(ADC_POT); if (pos > POSITION_MAX/2) { pos = pos - POSITION_MAX; } if (pos < -POSITION_MAX/2) { pos = POSITION_MAX + pos; } return pos; } void Position_Init () { PositionPID.kp = 50000; PositionPID.ki = 50000; PositionPID.kd = 0; PositionPID.max = Settings.RpmMax; PositionPID.min = -Settings.RpmMax; PositionPID.task = 0; PositionPID.input = Position_Calc(); MC_SetMode(MC_MODE_SPEED); MC_SetSpeed(0); } void Position_Process () { PositionPID.input = Position_Calc(); int16_t speed = -(int16_t)PI_Compute(&PositionPID); if ((-200 < speed) & (speed < 200) ) { speed=0; } MC_SetSpeed(speed); } void Position_Set (uint16_t position) { if (position > POSITION_MAX) { position = POSITION_MAX; } POSITION_TASK = (int32_t)position; } uint16_t Position_Get () { return (uint16_t)POSITION_TASK; } uint16_t Position_Get_Real () { return (uint16_t) MC_ADC_GetRegularValue(ADC_POT); }