[demo程序] [NV32F101单轴伺服控制板]正交编码器接收演示

[复制链接]
650|10
 楼主 | 2018-5-6 19:25 | 显示全部楼层 |阅读模式
本帖最后由 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驱动伺服电机做加速运动的脉冲波形图.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-5-19 10:04 | 显示全部楼层
支持下,波形的实际效果不错,用什么软件读取的呢?
| 2018-5-19 15:52 | 显示全部楼层
正交编码器是干什么用的,用在电机方面的吗?
| 2018-5-29 09:21 | 显示全部楼层
HKingS 发表于 2018-5-19 15:52
正交编码器是干什么用的,用在电机方面的吗?

正交编码器(又名增量式编码器或光电式编码器)。正交编码器可以对多种电机控制应用实现闭环控制,诸如开关磁阻电机和交流感应电机。常见于伺服电机中。
| 2018-5-29 09:22 | 显示全部楼层
123ycli 发表于 2018-5-19 10:04
支持下,波形的实际效果不错,用什么软件读取的呢?

波形确实不错,很给力!
| 2018-5-29 16:29 | 显示全部楼层
支持下,谢谢分享!
| 2018-5-30 13:38 | 显示全部楼层
123ycli 发表于 2018-5-19 10:04
支持下,波形的实际效果不错,用什么软件读取的呢?

应该是PWM输出的波形
| 2018-6-24 09:20 | 显示全部楼层
merry_zsp 发表于 2018-5-30 13:38
应该是PWM输出的波形

我是对这个软件比较好奇的。
| 2018-6-27 09:49 | 显示全部楼层
是自己做的效果吗
| 2018-11-7 13:56 | 显示全部楼层
膜拜大佬
| 2018-11-12 13:14 | 显示全部楼层
学习了,谢谢!
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表