OpenEdv-开源电子网

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

STM32编码器接口模式程序问题

[复制链接]

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
发表于 2013-8-9 17:59:36 | 显示全部楼层 |阅读模式
请教下论坛里有没有哪位大神用SYM32的编码器接口做过编码器位置控制的?小弟刚刚学习这一块,遇到了一些问题,我的程序是这样的:
//TIME3 编码器接口模式
//编码器模式初始化
void encoder_Init(u16 ENCODER_TIM_PERIOD,u16 COUNTER_RESET)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能 

RCC->APB2ENR|=1<<2;    //使能PORTA时钟
GPIOA->CRL&=0X00FFFFFF;
GPIOA->CRL|=0X4400000;//PA6,7浮空输入 

TIM3->DIER|=1<<0;   //允许更新中断
TIM3->DIER|=1<<6;   //允许触发中断
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);
/* Timer configuration in Encoder mode */ 
TIM3->SC = 0x0;//预分频器
TIM3->ARR = ENCODER_TIM_PERIOD;//设定计数器自动重装值 
TIM3->CR1 &=~(3<<8);// 选择时钟分频:不分频
TIM3->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式
TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM3->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1
TIM3->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2
TIM3->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器
TIM3->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM3->CNT = COUNTER_RESET; //计数器初始值
TIM3->CR1 |= 0x01;    //CEN=1,使能定时器
}
然后在主函数里读出计数器的值:
        encoder_Init(1999,0);
while(1)
{
delay_ms(100);
currentCount=TIM3->CNT;
        }
现在是当电机转动时,要么读不出数据,currentCount一直为0 ,要么就是读出的数据为ENCODER_TIM_PERIOD(即是1999).而且之后也一直是这个值不会变化。不知是什么情况?望有这方面经验的兄弟们指教。还有就是我想用编码器来做定位,该怎么来实现呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-9 18:12:57 | 显示全部楼层
没搞过这个接口,帮顶.
不过论坛有人发过类似的帖子,你可以看下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-8-12 17:19:40 | 显示全部楼层
回复【2楼】正点原子:
-----------------------------
谢谢原子哥,论坛那些帖子都看过了,也有看到有我类似问题的,但是没看到有解决方法。
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-10-19
在线时间
0 小时
发表于 2013-10-22 15:05:50 | 显示全部楼层
回复【楼主位】648342243:
---------------------------------
请问楼主解决没?我也出现这个问题了 会不会是因为输入的脉冲电压过高导致的呢?
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-10-24 16:03:14 | 显示全部楼层
回复【4楼】kkingkeen:
---------------------------------
问题是解决了,但是具体是什么样的原因我也不是很清楚,程序也基本没变,就是可以了。
//TIME4 编码器接口模式
//编码器模式初始化
void encoder_Init()
{
RCC->APB1ENR|=1<<2;//TIM4时钟使能 

RCC->APB2ENR|=1<<3;    //使能PORTB时钟
GPIOB->CRL&=0XF0FFFFFF;//PB6
GPIOB->CRL|=0X04000000;//浮空输入
GPIOB->CRL&=0X0FFFFFFF;//PB7
GPIOB->CRL|=0X40000000;//浮空输入 


TIM4->DIER|=1<<0;   //允许更新中断
TIM4->DIER|=1<<6;   //允许触发中断
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);

/* Timer configuration in Encoder mode */ 
TIM4->SC = 0x00;//预分频器
TIM4->ARR = 2000;//设定计数器自动重装值 
TIM4->CR1 &=~(3<<8);// 选择时钟分频:不分频
TIM4->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式

TIM4->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM4->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM4->CCER &= ~(1<<1);  //CC1P='0'  IC1FP1不反相,IC1FP1=TI1
TIM4->CCER &= ~(1<<5);  //CC2P='0'  IC2FP2不反相,IC2FP2=TI2
TIM4->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器
TIM4->SMCR |= 3<<0;  //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM4->CNT = 0; //计数器初始值
TIM4->CR1 |= 1<<0;    //CEN=1,使能定时器
}
主程序里:
        while(1)
{

delay_us(50);
currentCount=TIM4->CNT;
}
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-10-19
在线时间
0 小时
发表于 2013-10-24 20:02:35 | 显示全部楼层
回复【5楼】648342243:
---------------------------------
能不能给个工程 具体参考下 我都被困惑两周了 谢谢
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-11-7 10:43:03 | 显示全部楼层
主要的程序就是我贴出来的,其它都没关系的啊!
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-6-27 17:30:39 | 显示全部楼层
回复【7楼】648342243:
---------------------------------
这个有解决吗?我也是用的TIM3来接解决这个问题?
但是一直度不行了,楼主,主要是什么问题呢!!!!求详细解释!!!
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-17
在线时间
0 小时
发表于 2014-7-18 16:38:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我想问一下,stm32f101c8t6这个芯片有没有编码器模式的?
安逸的生活只会毁了你
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-18 22:33:12 | 显示全部楼层
回复【9楼】伤心地中海:
---------------------------------
应该有吧,你看看数据手册.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-17
在线时间
0 小时
发表于 2014-7-18 22:49:00 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
101的器件数据手册上没提到,只有10X的参考手册上有写
安逸的生活只会毁了你
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-18 23:15:37 | 显示全部楼层
回复【11楼】伤心地中海:
---------------------------------
额,101有固件库函数么?
有的话,找找看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-17
在线时间
0 小时
发表于 2014-7-19 10:55:31 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
101和103的固件库好像是同一个的,通用的
安逸的生活只会毁了你
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-19 23:28:46 | 显示全部楼层
回复【13楼】伤心地中海:
---------------------------------
谢谢
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2014-7-5
在线时间
21 小时
发表于 2014-9-18 12:18:38 | 显示全部楼层
RCC->APB1ENR|=1<<1;     // (RCC_APB1ENR  TIM3EN:定时器3时钟使能   1:定时器3时钟开  位1
 RCC->APB2ENR|=1<<2;     //使能PORTA时钟
 GPIOA->CRL&=0X00FFFFFF;    
 GPIOA->CRL|=0X44000000; 
     
 TIM3->CCMR1|=1<<0; // CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)位1:0
 TIM3->CCMR1|=1<<8;     // CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2)位9:8
    // CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)位1
    // CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2)位5

 TIM3->SMCR|=3<<0;     //SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效). SMS[2:0]位2:0
 TIM3->CNT=5;
 TIM3->ARR=arr;
 TIM3->CR1|=1<<0;     // CEN=’1’ (TIMx_CR1寄存器,计数器使能)
 }
回复 支持 反对

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2014-7-5
在线时间
21 小时
发表于 2014-9-18 12:19:37 | 显示全部楼层
我是这样配置就可以的
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2013-10-9
在线时间
21 小时
发表于 2014-12-28 23:26:08 | 显示全部楼层
刚在找这样的例程,看到你第一个程序,100ms读取一次,会不会时间太久了,计数器都不知道溢出多少了
回复 支持 反对

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2013-11-29
在线时间
7 小时
发表于 2015-3-10 15:34:17 | 显示全部楼层
请教大神硬件是如何连接的?
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-4-24
在线时间
1 小时
发表于 2017-4-25 14:54:11 | 显示全部楼层
您好,您这个程序调试出来了吗?
回复 支持 反对

使用道具 举报

13

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2016-11-15
在线时间
38 小时
发表于 2017-4-25 16:00:35 | 显示全部楼层
void Quadratur_encoder_Init(u16 arr)  //编码器模式四个数为一个脉冲
{
        RCC->APB1ENR|=1<<2;
        RCC->APB2ENR|=1<<3; //使能GPIOB时钟
        GPIOB->CRL&=0X00FFFFFF;       
        GPIOB->CRL|=0X44000000;        //PB7,PB6输入
//        GPIOB->ODR|=(1<<6); //PB7,PB6上拉
//        GPIOB->ODR|=(1<<7) ;
        TIM4->ARR=arr;
       
        TIM4->CCMR1|=0xF1F1; // IC1FP1=TI1 IC2FP2=TI2
        TIM4->CCER&=0xFFdd; //
        TIM4->SMCR &= 0xFFF8;
        TIM4->SMCR |= 0x0003;
        TIM4->CR1|=0x01;
}

这个程序可以完成但是你要知道你的编码器是什么输出
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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