モーター制御アプリケーション用の C の構造体があり、その構造体には PID の要素があります。その構造を持つ 2 つの変数と、それらの変数を指す 2 つのポインターを作成しました。私のアプリケーションはマイクロコントローラ上にあるため、PID が機能するために非常に重要な別のレジスタ、つまりエンコーダ カウントがあります。したがって、それぞれの PID 変数を指すポインターを持ちたいのですが、マイクロコントローラーのエンコーダーレジスタを指す要素「エンコーダー」を持ちたいと思います。そのため、ポインターにアクセスすると、エンコーダーの位置を直接取得できます。
typedef struct{
int Error;
int DeadBand;
int SetPoint;
int Encoder;
.
.
.
double Integral;
double Derivative;
double Kp;
double Ki;
double Kd;
float Position;
bool Done;
}Upid;
Upid PID1, PID2, *pPID1, *pPID2;
pPID1 = &PID1;
pPID2 = &PID2;
pPID1->Encoder = &POS1CNTL;
pPID2->Encoder = &POS2CNTL;
上記のコードは試していません。100% 思い通りに動作しないからです。要素 Encoder を逆参照し、エンコーダ位置レジスタのアドレスを割り当てると、アドレス番号が Encoder 要素に入れられます。私が達成したいことを少しだけ示すためにそこにあるだけです。しかし、私はそれを行う方法がわかりません。
関数自体に Encoder カウントを含める必要なく関数を呼び出せるようにしたい後。
今、私はこのようなことをします:
void MovePosition(Upid* PID, int Acceleration, int MaxVelocity, int StartPosition, int EndPosition)
{
PID->Acceleration = Acceleration;
PID->MaxVelocity = MaxVelocity;
PID->Position = PID->StartPos = StartPosition;
PID->EndPos = EndPosition;
PID->DeceleratonStarted = false;
PID->VelocityMode = false;
PID->Step = 0;
PID->Done = false;
}
この関数を呼び出すときは、常に現在のエンコーダ カウント (マイクロコントローラのエンコーダ カウント レジスタの値) を StartPosition に入れます。
私はこのようなことをしたいと思います:
void MovePosition(Upid* PID, int Acceleration, int MaxVelocity, int EndPosition)
{
PID->Acceleration = Acceleration;
PID->MaxVelocity = MaxVelocity;
PID->Position = PID->StartPos = PID->Encoder;
PID->EndPos = EndPosition;
PID->DeceleratonStarted = false;
PID->VelocityMode = false;
PID->Step = 0;
PID->Done = false;
}
すべてが PID1 または PID2 変数を指していますが、エレメント Encoder はマイクロコントローラのエンコーダ カウント レジスタを指しています。
どうすればこのようなことができるでしょうか?ありがとうございました。
編集:XC16コンパイラでマイクロチップマイクロコントローラを使用しています。
私は通常の変数のように POS1CNTL を使用します。次
のように読み取ることができます。
または、次のように値を書き込むこともできます。POS1CNTL = 30;
POS1CNTL は次のように定義されます。
#define POS1CNTL POS1CNTL
extern volatile uint16_t POS1CNTL attribute (( sfr ));