diff --git a/sinus.cbp b/sinus.cbp index 62c95c7..ed17cf7 100644 --- a/sinus.cbp +++ b/sinus.cbp @@ -142,6 +142,12 @@ + + + + diff --git a/src/pwmgeneration-foc.cpp b/src/pwmgeneration-foc.cpp index 50c13e9..e965a55 100644 --- a/src/pwmgeneration-foc.cpp +++ b/src/pwmgeneration-foc.cpp @@ -33,6 +33,7 @@ #define FRQ_TO_ANGLE(frq) FP_TOINT((frq << SineCore::BITS) / pwmfrq) #define DIGIT_TO_DEGREE(a) FP_FROMINT(angle) / (65536 / 360) +#define DEGREE_TO_DIGIT(a) (((a) * 65536) / 360) #ifndef QLIMIT_FREQUENCY #define QLIMIT_FREQUENCY FP_FROMINT(30) @@ -276,15 +277,22 @@ static s32fp MeasureCoggingCurrent(uint16_t angle, s32fp id) return coggingCurrent; } +/** \brief Generates a trapezoidal wave form to counter the cogging current of IPM motors + * + * \param angle rotor angle + * \param coggingCurrent magnitude of cogging current in A + * \return int32_t counter waveform as integer + * + */ static int32_t GenerateAntiCoggingSignal(uint16_t angle, s32fp coggingCurrent) { angle += Param::GetInt(Param::cogph); - if (angle < 16384) + if (angle < DEGREE_TO_DIGIT(90)) angle = angle; //no change - else if (angle < 32768) //90 to 180° + else if (angle < DEGREE_TO_DIGIT(180)) //90 to 180° angle = 32767 - angle; - else if (angle < 49152) //180 to 270° + else if (angle < DEGREE_TO_DIGIT(270)) //180 to 270° angle = angle - 32767; else //270 to 360° angle = 65535 - angle; diff --git a/test/Makefile b/test/Makefile index e030ea4..8ed3409 100644 --- a/test/Makefile +++ b/test/Makefile @@ -7,7 +7,7 @@ CPPFLAGS = -ggdb -DSTM32F1 -DCTRL_FOC=1 -DCTRL_SINE=0 -DCTRL=CTRL_FOC -I../in LDFLAGS = -g BINARY = test_sine OBJS = test_main.o fu.o test_fu.o test_fp.o test_vcu.o my_fp.o my_string.o params.o vehiclecontrol.o \ - test_throttle.o throttle.o sine_core.o temp_meas.o stub_canhardware.o test_canmap.o canmap.o \ + test_throttle.o throttle.o sine_core.o temp_meas.o stub_canhardware.o \ stub_libopencm3.o VPATH = ../src ../libopeninv/src