MCU為STM32L431,通用定時器框圖:
編碼器接口模式一共有三種,通過TIMx_SMCR寄存器的SMS[3:0]位來選擇。模式1計數(shù)器僅在TI1FP1的邊沿根據(jù)TI2FP2的電平來判斷向上/下計數(shù);模式2計數(shù)器僅在TI2FP2的邊沿根據(jù)TI1FP1的電平來判斷向上/下計數(shù);模式3計數(shù)器同時在TI1FP1和TI2FP2的邊沿根據(jù)另外一條線的電平來判斷向上/下計數(shù)。
計數(shù)方向與編碼器信號的關(guān)系:
使用編碼器模式3,假如使用如下配置時,
IC1FP1和IC2FP2不反相,IC1FP1=TI1,IC2FP2=TI2;TI1FP1相對信號是TI2,TI2FP2相對信號是TI1,對應(yīng)關(guān)系如下:
向前 | 點位 | TI1FP1信號 | TI2FP2信號 | 相對信號及電平 | 計數(shù)器方向 |
---|---|---|---|---|---|
1 | 上升 | TI2(低) | 向上 | ||
2 | 上升 | TI1(高) | 向上 | ||
3 | 下降 | TI2(高) | 向上 | ||
4 | 下降 | TI1(低) | 向上 | ||
5 | 上升 | TI2(低) | 向上 | ||
6 | 上升 | TI1(高) | 向上 | ||
向后 | 點位 | TI1FP1信號 | TI2FP2信號 | 相對信號及電平 | 計數(shù)器方向 |
1 | 上升 | TI2(高) | 向下 | ||
2 | 下降 | TI1(高) | 向下 | ||
3 | 下降 | TI2(低) | 向下 | ||
4 | 上升 | TI1(低) | 向下 | ||
5 | 上升 | TI2(高) | 向下 | ||
6 | 下降 | TI1(高) | 向下 |
同樣使用編碼器模式3,當IC1FP1極性反相時計數(shù)器的操作實例(CC1P=’1’,其他配置與上例相同),TI1極性相反,IC2FP2=TI2;TI1FP1相對信號是TI2,TI2FP2相對信號是TI1,對應(yīng)關(guān)系如下:
向前 | 點位 | TI1原信號 | TI1FP1信號 | TI2FP2信號 | 相對信號及電平 | 計數(shù)器方向 |
---|---|---|---|---|---|---|
1 | 上升 | 下降 | TI2(低) | 向下 | ||
2 | 上升 | TI1(低) | 向下 | |||
3 | 下降 | 上升 | TI2(高) | 向下 | ||
4 | 下降 | TI1(高) | 向下 | |||
5 | 上升 | 下降 | TI2(低) | 向下 | ||
6 | 上升 | TI1(低) | 向下 | |||
向前 | 點位 | TI1原信號 | TI1FP1信號 | TI2FP2信號 | 相對信號及電平 | 計數(shù)器方向 |
1 | 上升 | 下降 | TI2(高) | 向上 | ||
2 | 下降 | TI1(低) | 向上 | |||
3 | 下降 | 上升 | TI2(低) | 向上 | ||
4 | 上升 | TI1(高) | 向上 | |||
5 | 上升 | 下降 | TI2(高) | 向上 | ||
6 | 下降 | TI1(低) | 向上 |
如果使用編碼器模式1,IC1FP1和IC2FP2不反相,IC1FP1=TI1,IC2FP2=TI2;TI1FP1相對信號是TI2,TI2FP2相對信號是TI1,計數(shù)器在TI1FP1的邊沿根據(jù)IC2FP2的電平來計數(shù)。
向前 | 點位 | TI1FP1信號 | 相對信號及電平 | 計數(shù)器方向 |
---|---|---|---|---|
1 | 上升 | TI2(低) | 向上 | |
2 | 下降 | TI2(高) | 向上 | |
3 | 上升 | TI2(低) | 向上 | |
4 | 下降 | TI2(高) | 向上 | |
向后 | 點位 | TI1FP1信號 | 相對信號及電平 | 計數(shù)器方向 |
1 | 上升 | TI2(高) | 向下 | |
2 | 下降 | TI2(低) | 向下 | |
3 | 上升 | TI2(高) | 向下 | |
4 | 下降 | TI2(低) | 向下 |
定時器編碼器模式配置:
void Encoder_TIM2_Init(void)
{
TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = (ENCODER_RELOAD_NUM - 1);
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
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(&htim2, &sConfig) != HAL_OK)
{
PRINT_ERR("Encoder Tim Init Err\r\n");
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
PRINT_ERR("Encoder Init Mode Err\r\n");
}
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
}
其中htim2.Init.Period的值為重裝載值,計數(shù)器的計數(shù)值在0(包含)至Period(包含)之間向上或向下計數(shù),可以通過計數(shù)值的變化根據(jù)編碼器接口的模式來判斷編碼器的方向,也可以TIMx_CR1寄存器的DIR位來判斷方向。如果不需要判斷編碼器轉(zhuǎn)過的圈數(shù),那么重裝載值可以順便設(shè)置,比如65535;如果需要判斷轉(zhuǎn)過的圈數(shù),假定使用模式3,編碼器旋轉(zhuǎn)一周產(chǎn)生的脈沖數(shù)是X,那么重裝載值可以設(shè)置為(X-1)*4,因為模式3在TI1和TI2的邊沿都計數(shù),此時可以通過定時器的溢出中斷來判斷是不是旋轉(zhuǎn)一周。
如果只需要判斷旋轉(zhuǎn)方向,并且編碼器旋轉(zhuǎn)一周的產(chǎn)生的脈沖數(shù)很小的話,那就使用模式1或者模式2比較好,如果使用模式3的話僅通過TIMx_CNT寄存器的值來計算轉(zhuǎn)過角度的話誤差比較大。文章來源:http://www.zghlxwxcb.cn/news/detail-414216.html
另外配置的時候編碼器模式IC1Polarity和IC2Polarity的極性只能選擇上升沿或者下降沿,不能設(shè)置為所有邊沿,這樣的話會導(dǎo)致計數(shù)器計數(shù)失敗,并且方向判斷也會有問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-414216.html
到了這里,關(guān)于STM32定時器的編碼器接口模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!