|
发表于 2019-12-15 17:56:39
|
显示全部楼层
我以前玩过,arduino有库,但是不好用,自己用中断,轮询、硬件加电容防抖,也和楼主一样。
直到最后用了stm32的定时器。那个好用……,建议楼主试一试。
最后得出结论,硬件没问题,主要还是软件检测脉冲和处理方式。
- static void MX_TIM4_Init(void)
- {
- TIM_Encoder_InitTypeDef sConfig;
- TIM_MasterConfigTypeDef sMasterConfig;
- htim4.Instance = TIM4;
- htim4.Init.Prescaler = 2-1;
- htim4.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数
- htim4.Init.Period = 0xff; //自动重装值65535 16位 0xff
- htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //内部不分频,改变没反应
- htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //自动重装
- sConfig.EncoderMode = TIM_ENCODERMODE_TI12; //A和B相都参与触发
- sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; //上升沿
- sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
- sConfig.IC1Prescaler = TIM_ICPSC_DIV1; //分频???改变没反应
- sConfig.IC1Filter = 0;
- sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
- sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
- sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
- sConfig.IC2Filter = 0;
- if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
- if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- }
- htim4.Init.Prescaler = 2-1; 预分频2,每两个脉冲算一次有效计数触发改变定时器的值。因为这里选择的是A和B相都参与采样,只在上升沿采样,编码器一格会触发两个上升沿。这里选择2分频,因为从0开始,所以2-1
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|