OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14421|回复: 8

基于PWM实验-通用定时器的编码器接口模式-判断两输入波形的超前于滞后用DIR位显示

[复制链接]

4

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-2-21
在线时间
0 小时
发表于 2011-2-27 19:46:42 | 显示全部楼层 |阅读模式

在原子的通用定时器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与编码器模式的输入波形的方向有何影响?
四,编码器模式两输入波形超前于滞后判断应该有一个参考值设置的,是吗?

高手们帮我解答一下,指出我程序中的错误!!万分感谢!!

编码器模式.rar

803.71 KB, 下载次数: 538

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-2-27 20:25:09 | 显示全部楼层
回复【楼主位】陈婷:
-------------------------------
1,如果与JTAG复用了,必须关闭JTAG.
2,把IO设置为复用功能即可。但是定时器的寄存器还需要一些设置。
3,自动重装值与方波的方向,应该无关吧。
4,参考值是要的。

至于你程序的错误,就得你自己慢慢调了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-2-21
在线时间
0 小时
 楼主| 发表于 2011-3-1 11:16:48 | 显示全部楼层
1,你说把IO设置为复用就可以,但是IO设置为复用只有OXB是复用输出,我要设置为输入哦。。没有复用输入模式
2,你说参考值是要有的,但是参考值应该是哪个寄存器呢。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-1 11:38:12 | 显示全部楼层
回复【3楼】陈婷:
-------------------------------
1,复用是用来给特殊外设用的。你要输入,一般就是0X8了。
2,参考值,要根据你的实验结果来确定。定时器连接编码器的,我没做过,你可以看《STM32参考手册》,里面好像有提到吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2011-3-23
在线时间
5 小时
发表于 2011-9-15 15:33:09 | 显示全部楼层
回复【4楼】正点原子:
-------------------------------- 
原子哥: 这两根线我该怎么接啊? 还有
回复 支持 反对

使用道具 举报

18

主题

158

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2011-11-23
在线时间
0 小时
发表于 2012-8-31 11:08:05 | 显示全部楼层
回复【5楼】苹果:
---------------------------------
接在stm32的IO引脚上,这两个管脚复用为TIMx_CH1及TIMx_CH2
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-9-10 19:17:01 | 显示全部楼层
回复【楼主位】陈婷:
在原子的通用定时器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。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信 
       号。依
......
---------------------------------
不知楼主的问题解决了吗?
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
发表于 2014-5-15 21:49:58 | 显示全部楼层
你的程序我看了,编码器初始化就有问题。参考下http://www.openedv.com/posts/list/8274.htm
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-7-1 16:28:27 | 显示全部楼层
楼主有解决问题了吗?
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 20:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表