本帖最后由 eyancool 于 2018-5-9 19:18 编辑
实现功能:接收汇川伺服驱动器(IS620P)编码器反馈数据1.本演示程序使用NV32F101芯片ETM0定时器模块(PB2,PB3)做为正交编码器(A,B)接收输入口
2.ETM0设置为正交编码器AB相4倍频计数
3.IRQ0外部中断(PB1)做为正交编码器(Z)接收输入口
首先我们要对官方库文件etm.c做以下修改,原正交初始化函数
/*****************************************************************************//*!
*
* @brief 正交解码初始化.
*
* @param[in] pETM ETM0/ETM2.
*
* @return none.
*
*****************************************************************************/
void ETM_QD_Init(ETM_Type *pETM)
{
ASSERT((pETM == ETM0) || (pETM == ETM2));
SIM->SCGC |= SIM_SCGC_ETM2_MASK;
pETM->MODE |= ETM_MODE_WPDIS_MASK;
pETM->QDCTRL |= ETM_QDCTRL_QUADMODE_MASK;
pETM->CNTIN |= 0x0;
pETM->MOD = 0xFFFF;
pETM->QDCTRL |= ETM_QDCTRL_QUADEN_MASK;
pETM->MODE|= ETM_MODE_ETMEN_MASK;
}
修改后的的函数
void ETM_QD_Init(ETM_Type *pETM)
{
ASSERT((pETM == ETM0) || (pETM == ETM2));
if(pETM==ETM2)
{
SIM->SCGC |= SIM_SCGC_ETM2_MASK;
}
else
{
SIM->SCGC |= SIM_SCGC_ETM0_MASK;
}
pETM->MODE |= ETM_MODE_WPDIS_MASK;
pETM->QDCTRL &= ~ETM_QDCTRL_QUADMODE_MASK; //A,B相计数模式
pETM->CNTIN |= 0x0;
pETM->MOD = 0xFFFF;
pETM->QDCTRL |= ETM_QDCTRL_QUADEN_MASK;
pETM->MODE|= ETM_MODE_ETMEN_MASK;
}
初始化IRQ0外部中断
void IRQ0_Config()
{
IRQ_ConfigType sIRQConfig;
sIRQConfig.bMode = IRQ_MODE_EDGE_ONLY; /*!< 选择边沿检测 */
sIRQConfig.bEdg = IRQ_RISING_EDGE_HIGH_LEVEL; /*!< 选择 上升沿或上升沿/高电平 */
sIRQConfig.bIntEn = 1; /*使能IRQ中断*/
sIRQConfig.bPeEn = 1; /*中断信号输入引脚使能*/
sIRQConfig.bPdd=1; /*!<中断请求上拉器件禁用*/
IRQ_SetCallback(IRQ0, &IRQ0_Task); /*设置回调函数*/
NVIC_SetPriority(IRQ_IRQn,0);
IRQ_Init(IRQ0, &sIRQConfig);
}
IRQ中断回调函数
/*****************************************************************************//*!
*
* @brief IRQ0 回调函数
*
* @param none
*
* @return none
*
*****************************************************************************/
void IRQ0_Task(void)
{
Encodercount=ETM_QD_GetCount(ETM0)+Encodercount;//读取ETM0当前数据
ETM_QD_Clean(ETM0); //将ETM0计数清零
}
在isr.h添加IRQ外部中断注册
#undef VECTOR_023
#define VECTOR_023 IRQ0_Isr
extern void IRQ0_Isr(void);
主函数
int32_t XEncodercount,Encodercount;
int main (void)
{
/*系统初始化*/
sysinit();
cpu_identify();
ETM_QD_Init(ETM0);
IRQ0_Config();
while (1)
{
XEncodercount=ETM_QD_GetCount(ETM0)+Encodercount;
}
}
贴一张,NV32F101驱动伺服电机做加速运动的脉冲波形图.
|