Всем доброго времени суток. Для начала скажу, что я довольно плохо разбираюсь во всём, что связано с микропроцессорами и встраиваемыми системами, так что я надеюсь, что моё энциклопедическое невежество не слишком вас разочаровывает.
Я работаю над созданием своего первого сервопривода на основе BLDC и ресурсов проекта SimpleFOC. Моя первоначальная конфигурация была следующей:
- двигатель: 12T14P на основе статора 401012P и ротора выполненного по сборке Halbach
- датчик: AS5600
- плата драйвера: SimpleFOCPowerShield
- процессор: STM32F411CEU6, STM32F401CCU6
До этого были пробные эксперименты управления двигателем типа 5010 на 600W на процессоре ESP32, но там были проблемы с определением тока.
Для прошивки процессора STM32 решил перейти на PIO и с ходу же возникли проблемы с компилированием “голого” проекта. При компиляции в файле “stm32_mcu.cpp” не определены “PinMap_TIM” и “~ALTX_MASK”.
Вот код ошибки:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:9:49: note: #pragma message: SimpleFOC: compiling for STM32
9 | #pragma message(“SimpleFOC: compiling for STM32”)
| ^
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp: In function ‘int findIndexOfFirstPinMapEntry(int)’:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:673:10: error: ‘PinMap_TIM’ was not declared in this scope; did you mean ‘PinMap_PWM’?
673 | while (PinMap_TIM[i].pin!=NC) {
| ^~~~~~~~~~
| PinMap_PWM
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp: In function ‘int findIndexOfLastPinMapEntry(int)’:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:685:10: error: ‘PinMap_TIM’ was not declared in this scope; did you mean ‘PinMap_PWM’?
685 | while (PinMap_TIM[i].pin!=NC) {
| ^~~~~~~~~~
| PinMap_PWM
Compiling .pio\build\genericSTM32F411CE\libb09\Arduino-FOC\sensors\MagneticSensorAnalog.cpp.o
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:686:45: error: ‘ALTX_MASK’ was not declared in this scope
686 | if ( pinName == (PinMap_TIM[i].pin & ~ALTX_MASK)
| ^~~~~~~~~
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp: In function ‘int findBestTimerCombination(int, int, int*, PinMap**)’:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:713:36: error: ‘PinMap_TIM’ was not declared in this scope; did you mean ‘PinMap_PWM’?
713 | searchArray[index] = (PinMap*)&PinMap_TIM[i];
| ^~~~~~~~~~
| PinMap_PWM
*** [.pio\build\genericSTM32F411CE\libb09\Arduino-FOC\drivers\hardware_specific\stm32\stm32_mcu.cpp.o] Error 1
Код из файла:
int findIndexOfFirstPinMapEntry(int pin) {
PinName pinName = digitalPinToPinName(pin);
int i = 0;
while (PinMap_TIM[i].pin!=NC) {
if (pinName == PinMap_TIM[i].pin)
return i;
i++;
}
return -1;
}
int findIndexOfLastPinMapEntry(int pin) {
PinName pinName = digitalPinToPinName(pin);
int i = 0;
while (PinMap_TIM[i].pin!=NC) {
if ( pinName == (PinMap_TIM[i].pin & ~ALTX_MASK)
&& pinName != (PinMap_TIM[i+1].pin & ~ALTX_MASK))
return i;
i++;
}
return -1;
}
#define NOT_FOUND 1000
int findBestTimerCombination(int numPins, int index, int pins, PinMap* pinTimers) {
PinMap* searchArray[numPins];
for (int j=0;j<numPins;j++)
searchArray[j] = pinTimers[j];
int bestScore = NOT_FOUND;
int startIndex = findIndexOfFirstPinMapEntry(pins[index]);
int endIndex = findIndexOfLastPinMapEntry(pins[index]);
if (startIndex == -1 || endIndex == -1) {
SIMPLEFOC_DEBUG("STM32-DRV: ERR: no timer on pin ", pins[index]);
return -1; // pin is not connected to any timer
}
for (int i=startIndex;i<=endIndex;i++) {
searchArray[index] = (PinMap*)&PinMap_TIM[i];
int score = NOT_FOUND;
if (index<numPins-1)
score = findBestTimerCombination(numPins, index+1, pins, searchArray);
else {
score = scoreCombination(numPins, searchArray);
#ifdef SIMPLEFOC_STM32_DEBUG
printTimerCombination(numPins, searchArray, score);
#endif
}
if (score==-1)
return -1; // pin not connected to any timer, propagate driectly
if (score>=0 && score<bestScore) {
bestScore = score;
for (int j=index;j<numPins;j++)
pinTimers[j] = searchArray[j];
}
}
return bestScore;
}
Знает ли кто-то как это исправить?