[技术问答]

HC32L176 处理 编码器信号的问题,求指导

[复制链接]
85|2
手机看帖
扫描二维码
随时随地手机跟帖
re9527|  楼主 | 2023-1-17 17:45 | 显示全部楼层 |阅读模式
本帖最后由 re9527 于 2023-1-17 17:45 编辑

       求高手指导。
      小弟在使用HC32L176处理编码器信号,不能正常工作。
      现象是单片机能对编码器信号计数,电机停止,计数停止,但电机反向时,计数方向不变。感觉是只对编码器的一路信号在计数,另外一路没起作用,所以电机反向但计数方向没改变。
      有两个疑问:1、手册里写的是CH0A/CH0B,实际电路里编码器信号接入了TIM3的CH2A/CH2B,不知接入这两个通道还能不能使用编码器计数功能?                         2、编码器计数时如何使能CHA/CHB两路输入?我的程序里看起来有一路输入没起作用。
      测试程序如下,都放在main函数里的。
int32_t main(void)
{
  static uint16_t num;
    App_ClockCfg();      //时钟初始化
   
    uint16_t                        u16ArrValue;
    uint16_t                        u16CntValue;   
    stc_gpio_cfg_t            stcTIM3Port;   
    stc_tim3_mode23_cfg_t        stcTim3BaseCfg;
    stc_tim3_m23_input_cfg_t     stcTim3PortCapCfg;   
    stc_tim3_m23_master_slave_cfg_t  stcTim3MSCfg;

    //结构体初始化清零
    DDL_ZERO_STRUCT(stcTIM3Port);   
    DDL_ZERO_STRUCT(stcTim3BaseCfg);
    DDL_ZERO_STRUCT(stcTim3PortCapCfg);   
    DDL_ZERO_STRUCT(stcTim3MSCfg);
      
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE);   //Timer3外设时钟使能
   
    ///<TIM3 的模式23功能初始化
    stcTIM3Port.enDir  = GpioDirIn;
    Gpio_Init(GpioPortE, GpioPin12, &stcTIM3Port);
    Gpio_SetAfMode(GpioPortE,GpioPin12,GpioAf1);   //PE12设置为TIM3_CH2B,输入
    Gpio_Init(GpioPortE, GpioPin13, &stcTIM3Port);
    Gpio_SetAfMode(GpioPortE,GpioPin13,GpioAf1);   //PE13设置为TIM3_CH2A,输入
        
    stcTim3BaseCfg.enWorkMode    = Tim3WorkMode2;     //锯齿波模式
    stcTim3BaseCfg.enCT          = Tim3Timer;         //定时器功能,计数时钟为内部PCLK
    stcTim3BaseCfg.enPRS         = Tim3PCLKDiv64;     //PCLK/64
//    stcTim3BaseCfg.enCntDir      = Tim3CntDown;         //记数方向,似乎不影响
    Tim3_Mode23_Init(&stcTim3BaseCfg);                        //TIM3 的模式23功能初始化
     
    ///<TIM3端口输入初始化
//    stcTim3PortCapCfg.enCHxACmpCap   = Tim3CHxCapMode;        //CHA通道设置为捕获模式,似乎不影响
//    stcTim3PortCapCfg.enCHxACapSel   = Tim3CHxCapRise;    //CHA通道上升沿捕获使能,似乎不影响
    stcTim3PortCapCfg.enCHxAInFlt    = Tim3FltNone;  //不滤波
//    stcTim3PortCapCfg.enCHxAPolarity = Tim3PortPositive;      //正常输入输出,似乎不影响
//    stcTim3PortCapCfg.enCHxBCmpCap   = Tim3CHxCapMode;        //CHB通道设置为捕获模式,似乎不影响
//    stcTim3PortCapCfg.enCHxBCapSel   = Tim3CHxCapRise;    //CHB通道上升沿捕获使能,似乎不影响
    stcTim3PortCapCfg.enCHxBInFlt    = Tim3FltNone;  //不滤波
//    stcTim3PortCapCfg.enCHxBPolarity = Tim3PortPositive;      //正常输入输出,似乎不影响
    Tim3_M23_PortInput_Cfg(Tim3CH2, &stcTim3PortCapCfg);   //端口输入初始化
   
    ///<TIM3从模式设置
    M0P_TIM3_MODE23->MSCR_f.IA0S = 1;      //TIM3 A通道选择 CH0A CH1A CH2A XOR(实际硬件接入TIM3的CH2A)
    M0P_TIM3_MODE23->MSCR_f.IB0S = 1;      //TIM3 B通道选择 内部触发TS选择信号 (实际硬件接入TIM3的CH2B,但这里只能选0即CH0B,1即当前选择。选0不能正常计数)         
    stcTim3MSCfg.enMasterSlaveSel = Tim3SlaveMode;  //从模式
    stcTim3MSCfg.enSlaveModeSel = Tim3SlaveCodeCnt1;  //正交编码计数模式1,对CHA边沿计数
    stcTim3MSCfg.enTsSel= Tim3Ts6IAFP;    //TIM3_CH2A外部输输入滤波后的相位选择信号。编码器需要CHA/CHB两路信号,这里只能选一路,另外一路信号怎么选中?
    Tim3_M23_MasterSlave_Set(&stcTim3MSCfg);
      
    u16ArrValue = 0xFFFF;
    Tim3_M23_ARRSet(u16ArrValue, TRUE);                       //设置重载值,并使能缓存
    u16CntValue = 0;
    Tim3_M23_Cnt16Set(u16CntValue);                           //设置计数初值
   
    Tim3_ClearAllIntFlag();                                   //清中断标志
    Tim3_Mode23_EnableIrq(Tim3CA0Irq);                        //使能TIM3 CB0比较/捕获中断
    Tim3_Mode23_EnableIrq(Tim3UevIrq);                        //使能TIM3 Uev更新中断
    EnableNvic(TIM3_IRQn, IrqLevel1, TRUE);                   //TIM3中断使能
   
    Tim3_M23_Run();      //TIM3运行。
   
    while (1)
    {      
      num = Tim3_M23_Cnt16Get();      
    }
}



3.png
2.png

手册里设置说明

手册里设置说明

使用特权

评论回复
re9527|  楼主 | 2023-1-19 12:04 | 显示全部楼层
已解决。这款芯片编码器只能接在定时器的第一个通道,即CHA\CHB.

使用特权

评论回复
麻花油条| | 2023-1-28 11:13 | 显示全部楼层
学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则