Stm8s 定时器TIM1的编码模式 与旋转开关的接口 - 图文

更新时间:2023-12-02 00:12:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Stm8s 定时器TIM1的编码模式 与旋转开关的接口

Stm8s只有定时器一有编码模式,硬件根据两个通道CH1 和CH2进来相位的关系,计数器自动加减。不需要再通过外部中断来进行旋转编码。一共有三种工作模式。

1.计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的 SMS=001;

2.只在TI1边沿计数,则置SMS=010;

3.计数器同时在TI1和TI2边沿计数,则置SMS=011。 代码

CLK->PCKENR1 |=0X80; //开启time1时钟

TIM1->SMCR |= 0X02; //工作在编码器模式2

TIM1->CCMR1 |= 0X1; //IC1FP1映射到TI1)

TIM1->CCMR2 |= 0X1; //IC2FP2映射到TI2 CC2 MAP TI2FP2 CH2

TIM1->ARRH = 0XEA; // 60000产生溢出 最大65535

TIM1->ARRL = 0X60;

TIM1->IER |=0X1; //开中断 ,开中断前要有中断处理程序,中断

里需要清除中断标志位

TIM1->CNTRH = 0xea; / /我要有个大的初始化值 TIM1->CNTRL=0x56;

TIM1->CR1 =0X01; //启动计数

中断处理程序 #pragma vector=0x0d

__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) {

TIM1_ClearITPendingBit(TIM1_IT_UPDATE); if((TIM1->CR1&0x10)!=0) count2--; else count2++; }

当计数寄存器(TIM1_CNTR)里的计数值到由TIM1->ARR到0时,开中断的话,会产生溢出中断,根据读TIM1->CR1里的DIR位可以读出方向, DIR位等于1向下计数,DIR等于0向上计数(此时的DIR只读)

普通旋转编码开关的的波形。实际测试结果如下:

与网上所介绍的有所不同,根据旋转方向的不同,两个波形有相位差(超前或滞后)同一时刻对应的两个波形的脉宽相同,不同的是占空比。

实际操作中

1 TIM1->SMCR |= 0X01

顺时针旋转 不稳定 有时+2 逆时针 稳定-2 2 TIM1->SMCR |= 0X02 顺时针 +1逆时针-1 稳定 3 TIM1->SMCR |= 0X03 顺时针+1 逆时针-3

选用第二种模式比较稳定,与旋转开关的输出波形有关。按理说模式一和模式2应该效果一样但是实际不同。

本文来源:https://www.bwwdw.com/article/lnvt.html

Top