我有一个用于电机控制应用的 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% 它不会像我想要的那样工作。取消引用元素编码器并分配编码器位置寄存器的地址只会将地址编号放入编码器元素中。它只是为了展示我想要完成的事情。但我不知道该怎么做。
在我希望能够调用函数而不需要在函数本身中包含编码器计数之后。
现在我做这样的事情:
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 变量,但元素编码器指向微控制器的编码器计数寄存器。
我怎么能做这样的事情?谢谢你。
编辑:我使用带有 XC16 编译器的微芯片微控制器。
我像使用普通变量一样使用 POS1CNTL:
我可以像这样读取它:A = POS1CNTL;
或者我可以给它写一个值,比如:POS1CNTL = 30;
POS1CNTL 定义如下:
#define POS1CNTL POS1CNTL
extern volatile uint16_t POS1CNTL attribute (( sfr ));