主题中讨论的其他器件:C2000WARE
您能解释一下 eQEP 的 GPIO 初始化问题吗?因为 POSITION_NOW 未得到更新,我已经对它进行了调试,但无法找到速度。
#include "F28x_Project.h"
#include "math.h"
#define SYS_CLK 200000000
#define PI 3.14159265358979323846
void Setup_GPIO();
void initEQEP();
void InitEQep1Gpio();
void delay_loop ();
uint16_t value1 = 0;
uint16_t value2 = 0;
uint16_t 值3 = 0;
uint16_t 值4 = 0;
int spcnt = 0;
浮点 wr_mech = 0;
浮动 RAD_PER_COUNT = 0.000785;//编码器每转脉冲数
浮点 lPrevPos = 0;
float lNowPos = 0;
INT B=0;
浮点 lDifference = 0;
// uint32_t pulseCount = 0;
外部中断 void cpu_timer0_isr (void);
INT A=0;
空 main (void)
{
//初始化系统时钟、GPIO 和其它必要外设
//初始化 eQEP 模块
InitGpio();
//编码器
// GPIO_SetupPinMux (105、GPIO_MUX_CPU1、0);
// GPIO_SetupPinOptions (105、GPIO_output、GPIO_PushPull);
// GpioDataRegs.GPDSET.bit.GPIO105 = 1;
initEQEP();
InitSysCtrl();
// InitEQep1Gpio();
Dint;
//设置 ADC 以进行软件转换
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
EDIS;
InitCpuTimers ();
ConfigCpuTimer (&CpuTimer 0,200,100);
CpuTimer0Regs.tcr.all = 0x4000;
IER |= M_INT1;
IER |= M_INT3;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
EINT;
ERTM;
while (1)
{
}
}
浮点读编码器()
{
浮动 position_now;
position_now = EQep1Regs.QPOSCNT;
立即返回 position_now;
}
void InitEQep1Gpio()
//{
///// Page 959 Table Mux,第965页寄存器和 spruhm8i.pdf -技术参考
EALLOW;
//
// GpioCtrlRegs.GPAMUX1.all = 0;
// GpioCtrlRegs.GPAMUX2.all = 0;
// GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1;//禁用 GPIO10上的上拉电阻(EQEP1A)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0;//将 GPIO10同步到 SYSCLK (EQEP1A)
GpioCtrlRegs.GPAGMUX2.bit.GPIO20 = 1;//将 GPIO6配置为 EQEP1A
// GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1;//将 GPIO6配置为 EQEP1A
////
// GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1;//禁用 GPIO7上的上拉电阻(EQEP1B)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0;//将 GPIO7同步到 SYSCLK (EQEP1B)
GpioCtrlRegs.GPAGMUX2.bit.GPIO21= 1;//将 GPIO7配置为 EQEP1B
// GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1;//将 GPIO7配置为 EQEP1B
////
// GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1;//禁用 GPIO7上的上拉电阻(EQEP1B)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0;//将 GPIO7同步到 SYSCLK (EQEP1B)
GpioCtrlRegs.GPAGMUX2.bit.GPIO22= 1;//将 GPIO7配置为 EQEP1B
// GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1;//将 GPIO7配置为 EQEP1B
////
// GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1;//禁用 GPIO9上的上拉电阻(EQEP1I)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0;//将 GPIO9同步到 SYSCLK (EQEP1I)
GpioCtrlRegs.GPAGMUX2.bit.GPIO23 = 1;//将 GPIO9配置为 EQEP1I
// GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1;//将 GPIO9配置为 EQEP1I
// EDIS;
//
//
//启用所选引脚的内部上拉。
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0;//启用 GPIO20上拉(EQEP1A)
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0;//启用 GPIO21上的上拉(EQEP1B)
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//启用 GPIO22上的上拉(EQEP1S)
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0;//启用 GPIO23上的上拉(EQEP1I)
//输入默认与 SYSCLKOUT 同步。
GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0;//同步到 SYSCLKOUT GPIO20 (EQEP1A)
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0;//同步到 SYSCLKOUT GPIO21 (EQEP1B)
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0;//同步到 SYSCLKOUT GPIO22 (EQEP1S)
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0;//同步到 SYSCLKOUT GPIO23 (EQEP1I)
//使用 GPIO 寄存器配置 eQEP-1引脚
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1;//将 GPIO20配置为 EQEP1A
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1;//将 GPIO21配置为 EQEP1B
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1;//将 GPIO22配置为 EQEP1S
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1;//将 GPIO23配置为 EQEP1I
// value1 = GpioDataRegs.GPADAT.bit.GPIO20;
// value2= GpioDataRegs.gpadat.bit.gpio21;
// value3 = GpioDataRegs.gpadat.bit.gpio22;
// value4 = GpioDataRegs.gpadat.bit.gpio23;
EDIS;
}
//
void initEQEP()
{
// CPUSysRegs.PCLKCR4.bit.EQEP1ENCLK = 1;
EQep1Regs.QUPRD = SYS_CLK;// 100Hz 频率的单位计时器周期(任意、根据需要调整)
EQep1Regs.QDECCTL.bit.QSRC = 1;//正交方向计数模式
// EQep1Regs.QDECCTL.bit.QSP = 0;// 1x 分辨率(默认值)
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2;//针对仿真挂起运行
EQep1Regs.QDECCTL.bit.XCR = 0;// 0表示上升沿/下降沿。 1仅对于上升沿、XCR = 1x 分辨率
// EQep1Regs.QDECCTL.bit.swap = 1;// 0表示无变化。 1表示交换 A 和 B。
EQep1Regs.QEPCTL.bit.PCRM = 2;//位置计数器复位0表示索引时复位,1表示最大复位一次,
//第一个索引上的2平均复位,单元时间事件上的3平均复位
EQep1Regs.QEPCTL.bit.QCLM = 1;//锁存单元超时
EQep1Regs.QEPCTL.bit.UTE = 1;
//单位定时器启用
EQep1Regs.QPOSIIT = 0;
EQep1Regs.QPOSMAX = 0xFFFFFFFF;//所需的最大计数
EQep1Regs.QEPCTL.bit.QPEN = 1;// QEP enable
EQep1Regs.QCAPCTL.bit.UPPS = 5;// 1/32表示单元位置
EQep1Regs.QCAPCTL.bit.CCP = 6;// CAP 时钟为1/64
EQep1Regs.QCAPCTL.bit.CEN = 1;// QEP 捕获启用
}
//void dalcSpeed (float lEncCount)
//{
//
// wr_mech = lEncCount*RAD_PER_COUNT/(10);
外部中断 void cpu_timer0_isr ()
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
lNowPos = ReadEncoder();
A+;
SPCNT++;
if (spcn>9)
{B++;
lDifference = lNowPos - lPrevPos;
wr_mech = lDifference *RAD_PER_COUNT*1000;
lPrevPos = lNowPos;
spcnt = 0;
}
// pulseCount = EQep1Regs.QPOSCNT;//读取脉冲计数
// motorSpeed = pulseCount * 60 * SYS_CLK /(ENCODER_PPR * EQep1Regs.QPOSCNT);//以 RPM 计算电机转速
//必要时清除中断标志
// EQep1Regs.QCLR.bit.UTO = 1;
}