@kq: ja chyba czegoś nie rozumiem. U Ciebie zmienna jest tworzona okresowo w funkcji dlatego kompilator pomija ją, przepisując od razu do wyniku ale u mnie to tak nie działa.
Ja mam strukturę:
struct BLDCMotorSt{
uint32_t pwmU;
uint32_t pwmV;
uint32_t pwmW;
int16_t fieldPosition; //ustawiona pozycja pola magnetycznego dla kompletnego obrotu - 4095 pozycji
uint16_t expectedPosition; // oczekiwana pozycja silnika
uint8_t direction; // kierunek 0-L 1-R
double distance; // dystans od punktu oczekiwanego do aktualnego
float powerAcceleration;
int16_t expectedPower;
int16_t actualPower;
};
Ta struktura przechowuje aktualny stan urządzenia.
Teraz do sterowania actualPower chcę użyć tej biblioteki: link
Więc wychodzi mi coś w tym stylu:
main{
/...
PID(&TPID, &bldcMotor.distance, &bldcMotor.actualPower, &TempSetpoint, 2, 5, 1, _PID_P_ON_E, _PID_CD_DIRECT);
PID_SetMode(&TPID, _PID_MODE_AUTOMATIC);
PID_SetSampleTime(&TPID, 500);
PID_SetOutputLimits(&TPID, 1, 30);
.../
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) {
if (initPhase == 0) {
bldcHaptickMode();
}
}
if (htim->Instance == TIM3) {
bldcEncoder.status = as5600_ReadPosition(&hi2c2, &bldcEncoder.angle);
bldcEncoder.magnetStatus = as5600_StatusMagnet(&hi2c2);
if (initPhase == 0) {
bldcMotor.fieldPosition = bldcEncoder.calculatedAngle;
bldcCalc();
PID_Compute(&TPID); //tutaj nastepuje okresowa aktualizacja PID
}
}
}
problem jest z inicjalizacją PID ponieważ w bibliotece zmienne są typu double. Nie chcę przerabiać biblioteki, bo nie jest to moja praca i szanuje to co ktoś zobił, ale również dlatego, że to trochę pracy. Myślałem, że będzie to proste i ogarnę w miarę szybko.
Widzę, że chyba jednak tak nie będzie. Może spróbuję dostać się bezpośrednio do pamięci