Pourquoi je pose cette question parce qu'il se produit:variables déclarées dans ma struct être de taille différente
en-tête Defined:
typedef struct PID
{
// PID parameters
uint16_t Kp; // pGain
uint16_t Ki; // iGain
uint16_t Kd; // dGain
// PID calculations OLD ONES WHERE STATICS
int24_t pTerm;
int32_t iTerm;
int32_t dTerm;
int32_t PID;
// Extra variabels
int16_t CurrentError;
// PID Time
uint16_t tick;
}_PIDObject;
Dans la source C:
static int16_t PIDUpdate(int16_t target, int16_t feedback)
{
_PIDObject PID2_t;
PID2_t.Kp = pGain2; // Has the value of 2000
PID2_t.CurrentError = target - feedback; // Has the value of 57
PID2_t.pTerm = PID2_t.Kp * PID2_t.CurrentError; // Should count this to (57x2000) = 114000
Qu'est-ce qui se passe quand je débogue, c'est que ce n'est pas le cas. La plus grande valeur que je peux définir (sorte de) dans pGain2 est 1140. 1140x57 donne 64980.
D'une certaine manière, il semble que le programme pense PID2_t.pTerm
est un uint16_t
. Mais ce n'est pas; c'est déclaré plus gros dans la structure.
a-t-PID2_t.pTerm
en quelque sorte obtenu la valeur uint16_t
de la première variables déclarées dans la struct ou est-il quelque chose de mal avec les calculs, j'ai uint16_t
fois par int16_t
? Cela n'arrivera pas si je les déclare en dehors d'une structure.
Aussi, voici mon int def (n'a jamais été un problème avant:
#ifdef __18CXX
typedef signed char int8_t; // -128 -> 127 // Char & Signed Char
typedef unsigned char uint8_t; // 0 -> 255 // Unsigned Char
typedef signed short int int16_t; // -32768 -> 32767 // Int
typedef unsigned short int uint16_t; // 0 -> 65535 // Unsigned Int
typedef signed short long int int24_t; // -8388608 -> 8388607 // Short Long
typedef unsigned short long int uint24_t; // 0 -> 16777215 // Unsigned Short Long
typedef signed long int int32_t; // -2147483648 -> 2147483647 // Long
typedef unsigned long int uint32_t; // 0 -> 4294967295 // Unsigned Long
#else
# include <stdint.h>
#endif
Comment 'int24_t' est-il défini? –
On dirait que votre int24_t est défini comme étant de 16 bits. Voyons voir le typedef? :) –
La question la plus importante: Quelle est la taille de 'int'? Pourriez-vous vérifier 'INT_MAX' /' UINT_MAX' dans 'limits.h'? –