0

モーター制御アプリケーション用の 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 ));

4

0 に答える 0