基于DSP28335的EQEP模块测量增量式编码器速度代码
时间: 2023-07-27 14:07:00 浏览: 288
eqep_pos_speed.rar_28335测速_DSP 测速_dsp28335编码器_编码器 28335_编码器测速
5星 · 资源好评率100%
以下是基于DSP28335的EQEP模块测量增量式编码器速度的示例代码:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
void InitEQEP(void);
volatile struct EQEP_REGS *EQep1Regs;
Uint32 Position;
Uint32 PrePosition;
float Speed;
void main(void)
{
InitSysCtrl();
InitPieCtrl();
InitPieVectTable();
InitEQEP();
EINT;
while(1)
{
// 计算速度
Position = EQep1Regs->QPOSCNT;
Speed = (float)(Position - PrePosition) / 400000 * 100000000; // 400000为编码器线数,100000000为时钟频率
PrePosition = Position;
DELAY_US(1000);
}
}
void InitEQEP(void)
{
EQep1Regs = &EQEP1_REGS;
// 初始化EQEP模块
EQep1Regs->QDECCTL.bit.QSRC = 0; // 使用A、B相
EQep1Regs->QDECCTL.bit.XCR = 1; // 2倍计数
EQep1Regs->QDECCTL.bit.SPSEL = 1; // 时钟频率为SYSCLKOUT/2
EQep1Regs->QDECCTL.bit.SOEN = 3; // 使能正向和负向计数器
EQep1Regs->QPOSCTL.bit.PCSHDW = 1; // PCSHRD复位时,将PCSHDW更新到POS
EQep1Regs->QPOSCTL.bit.PCLOAD = 1; // PCSHRD发生计数器复位,POS计数器将被重新加载
EQep1Regs->QPOSCTL.bit.PCPOL = 1; // PCSHRD极性为正
EQep1Regs->QPOSCTL.bit.PCE = 1; // 使能位置计数器
EQep1Regs->QEINT.bit.PCU = 1; // 使能PCU中断
EQep1Regs->QCAPCTL.bit.UPPS = 0; // 1倍计数
EQep1Regs->QCAPCTL.bit.CCPS = 7; // 128倍预分频
EQep1Regs->QCAPCTL.bit.CEN = 1; // 使能捕获单元
}
```
在该示例代码中,我们通过 `InitEQEP` 函数初始化了EQEP模块,并且在主循环中使用了 EQep1Regs->QPOSCNT 计算了当前的位置值,然后通过计算上一次位置值和当前位置值之间的差值来计算编码器的速度。其中,编码器的线数为400000,时钟频率为100MHz,因此计算公式为 `(Position - PrePosition) / 400000 * 100000000`。
阅读全文