问题描述
我在C中具有用于电机控制应用程序的结构,该结构具有用于PID的元素。我创建了具有该结构的2个变量和指向这些变量的2个指针。我的应用程序是在微控制器上的,因此我还有一个对于PID的工作非常重要的寄存器,即编码器计数。 所以我想让我的指针指向它们各自的PID变量,但我想让元素“ Encoder”指向微控制器的编码器寄存器。这样,当我访问指针时,可以直接获取编码器位置。
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计数之后。
现在我做这样的事情:
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 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 属性((( sfr )));
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)