在原子的通用定时器PWM模式程序的基础上编写编码器接口模式,遇到了几个问题:
STM32中文手册上:
选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的
SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则
置SMS=011。
通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以
对输入滤波器编程。
两个输入TI1和TI2被用来作为增量编码器的接口。参看表58,假定计数器已经启动(TIMx_CR1
寄存器中的CEN=1),则计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2
是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1;如
果没有滤波和变相,则TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信
号。依据两个输入信号的跳变顺序,计数器向上或向下计数,同时硬件对TIMx_CR1寄存器的
DIR位进行相应的设置。不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。
在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。
编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到
TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计
数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出
特性等仍工作如常。
在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指
示着编码器的位置。计数方向与相连的传感器旋转的方向对应。
我根据手册一步步设置好寄存器:
void Encoder_Init(u16 arr)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=0X04000000; //关闭JTAG
GPIOA->CRL&=0X00FFFFFF;//PA7.PA6输入
GPIOA->CRL|=0X88000000;//下拉输入
GPIOA->ODR|=1<<7;//PA7上拉
GPIOA->ODR|=1<<6;//PA7上拉
Ex_NVIC_Config(GPIO_A,7,FTIR); //上升沿触发
Ex_NVIC_Config(GPIO_A,6,FTIR);//上升沿触发
TIM3->ARR=arr;//设定计数器自动重装值
TIM3->CCMR1|=1<<0; //CC1S=01
TIM3->CCMR1|=1<<8; //CC2S=01
TIM3->CCER|=0<<1; //CC1P=0
TIM3->CCER|=0<<5; //CC2P=0
TIM3->SMCR|=3<<0; //SMS=011
TIM3->CR1|=1<<0;; //CEN使能
TIM3->CR1|=0x01; //使能定时器3
}
在text.c中:
int main(void)
{
//u16 led0pwmval=0;
//u8 dir=1;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
Encoder_Init(900); //不分频。PWM频率=72000/900=8Khz
while(1)
{
delay_ms(10);
if((TIM3->CR1&=1<<4)==0)
LED0=0;
if((TIM3->CR1&=1<<4)==1)
LED0=1;
}
}
实验结果是LED灯一开始就亮了。
有几个问题想高手们帮我解答一下的:
一,编码器模式下IO是下拉输入模式,需要关闭JTAG吗?
二,是不是与输出PWM实验一样,只要把IO设置为输出模式就是把TI1与TI2自动连接到PA6,PA7上去呢?
三,定时器自动重装值ARR与编码器模式的输入波形的方向有何影响?
四,编码器模式两输入波形超前于滞后判断应该有一个参考值设置的,是吗?
高手们帮我解答一下,指出我程序中的错误!!万分感谢!!
|