本帖最后由 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();
}
}
|