OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
楼主: 科科1987

STM32编码器接口模式--寄存器版

  [复制链接]

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-22 19:10:39 | 显示全部楼层
回复【151楼】科科1987:
---------------------------可不可以加我qq,帮我看下1049952505
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-22 19:46:05 | 显示全部楼层
回复【151楼】科科1987:
---------------------------------
请问程序里的TIM4的程序是不是没用
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-22 21:11:33 | 显示全部楼层
请你帮我看下哪里有问题,我用的是stm32f10x的战舰开发板加光电编码器,要实现编码器测量电机转速。程序文件是根据你的改的,TIM4作为pwm信号输出控制电机转动,TIM3控制编码器。毕业设计

STM32正交编码器程序改.rar

821.44 KB, 下载次数: 1515

回复 支持 1 反对 0

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-23 09:14:42 | 显示全部楼层
回复【153楼】血狼刃:
---------------------------------
1、我写的程序里 TIM4没有用;
2、你把编码器输入引脚改为上拉输入试试,或者在外部加上拉电阻。同时加滤波电容。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-23 10:59:07 | 显示全部楼层

还是不行,光电编码器转动就是65000,不动就是1,电机也不转动

回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-23 15:01:19 | 显示全部楼层
回复【156楼】血狼刃:
---------------------------------
在timer.h里:
#define ENCODER_TIM_PERIOD (u16)(65000)   // number of pulses per revolution
根据上面描述的现象转动就是65000,你仔细找一下原因。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-24 20:33:17 | 显示全部楼层
回复【157楼】科科1987:
---------------------------------
请问我要他显示电机的转速,该怎么改
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-25 09:09:21 | 显示全部楼层
回复【158楼】血狼刃:
---------------------------------
电机转速(rpm)=编码器信号频率f(Hz)×60/分辨率(N)
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-25 12:35:40 | 显示全部楼层
回复【159楼】科科1987:
---------------------------------
编码器信号频率是不是就是TIM4->CNT,计数器自动重装载值我给的是TIM4->ARR = (4*ENCODER_TIM_PERIOD)-1,ENCODER_TIM_PERIOD=200,编码器分辨率为200pr,那么电机转速rpm=TIM4->CNT*60/200?
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-25 17:58:51 | 显示全部楼层
回复【160楼】血狼刃:
---------------------------------
编码器信号频率就是每秒内编码器输出多少个计数值。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-25 21:16:38 | 显示全部楼层
回复【161楼】科科1987:
---------------------------------
不是计数器的计数值吗?那该怎样得到编码器信号频率?感谢楼主几天来的耐心解答
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-26 14:37:54 | 显示全部楼层
回复【162楼】血狼刃:
---------------------------------
1、请问你之前的那个计数器乱计数的问题解决了吗?

2、选择了编码器接口,计数器会根据编码器的信号计数,计数频率与编码器的转速有关。可以用一个定时器中断获得单位时间内的计数值,也就是编码器信号频率。

下面摘自《stm32参考手册》:
“编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。 在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1和TI2不同时变换。”
“当定时器配置成编码器接口模式时,提供传感器当前位置的信息。使用第二个配置在捕获模式的定时器,可以测量两个编码器事件的间隔,获得动态的信息(速度,加速度,减速度)。指示机械零点的编码器输出可被用做此目的。根据两个事件间的间隔,可以按照固定的时间读出计数器。如果可能的话,你可以把计数器的值锁存到第三个输入捕获寄存器(捕获信号必须是周期的并且可以由另一个定时器产生);也可以通过一个由实时时钟产生的DMA请求来读取它的值。”
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-3-16
在线时间
3 小时
发表于 2015-5-28 16:34:35 | 显示全部楼层
你好!我是按照你那样配置的,但是不知道为啥计数器的值总是0?
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-28 17:00:48 | 显示全部楼层
回复【164楼】GUN_xing:
---------------------------------
贴出的程序测试过了,我当时跑的时候没有问题。
计数器的值总是0要具体问题具体解决。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-3-16
在线时间
3 小时
发表于 2015-5-29 09:33:34 | 显示全部楼层
回复【165楼】科科1987:
---------------------------------
回复【165楼】科科1987:
---------------------------------
我也觉得你那程序是没有问题的。。。。
还是很感谢你的分享
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-5-29 11:53:00 | 显示全部楼层
回复【166楼】GUN_xing:
---------------------------------
多调试,从多方面找原因。一个一个地排除。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

2

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-5-24
在线时间
0 小时
发表于 2015-7-20 21:22:57 | 显示全部楼层
回复【28楼】科科1987:
---------------------------------
还有出来的数据很奇怪,没上电只接了A,B相的线串口就有很大的数值,不接任何线的话就为零,就算用手碰一下也会有很大的数值。接了上电后让电机转动,数值都是没什么变化都是在几万以上,我的电机转一圈才11个脉冲怎么会有几万出来  ,,,,,,郁闷中 求解答
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-7-21 12:16:20 | 显示全部楼层
回复【168楼】李东东:
---------------------------------
硬件有干扰
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-11-17
在线时间
0 小时
发表于 2015-7-23 15:53:21 | 显示全部楼层
void Pulse_Coder_Count_Init(void)//?????÷??????
{
GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  //PB6 A?à PB7 B?à
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_DeInit(TIM4);
  //????NVIC?è???????í???????è????????
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn ;                 //?ü???????¨???¨?±?÷×??????©
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;        //??????????1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;              //?ì????????0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //???í????
NVIC_Init(&NVIC_InitStructure);
  /* Timer configuration in Encoder mode */
  
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 65535; 
TIM_TimeBaseStructure.TIM_Prescaler = 0;  // No prescaling  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  
  TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, 
                             TIM_ICPolarity_BothEdge   , TIM_ICPolarity_BothEdge  );
  TIM_ICStructInit(&TIM_ICInitStructure);//???á?????????????±??????
  TIM_ICInitStructure.TIM_ICFilter = 15;//IC1F????????±??????¨?÷f(SAMPLING)/N>=2*f   f???????ù??????????  f(SAMPLING)???¨???????ù????

  TIM_ICInit(TIM4, &TIM_ICInitStructure);
  
 // Clear all pending interrupts
  TIM_ClearFlag(TIM4, TIM_FLAG_Update);//????TIM4???ü??±ê????
  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//????TIM4?ü??±ê??????
  //Reset counter
  TIM4->CNT = 0;
  TIM_Cmd(TIM4, ENABLE);
}
void TIM4_IRQHandler(void)
{

  if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  {
    //?????¨?±?÷5????????±ê????
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);aa++;
  }

}
这是我的程序,每次溢出,进入中断aa自加一次, aa代表进入中断的次数,现在发现aa有的时候不是加了1(有的时候加了2,3等数据)我的编码器是1000线的现在发现cnt值里的脉冲是对的上的,不知道为啥aa不正确,请大师帮忙解答下,我的A,B编码器信号相位不是严格的相差90这会又影响吗
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-7-27 14:07:29 | 显示全部楼层
回复【170楼】tianmin:
---------------------------------
A,B编码器信号相位不是严格的相差90应该影响不大;
参考手册中:TIM_IT_Update中断:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发),你看看除了溢出,是不是有地方计数器初始化了好几次。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-3-17
在线时间
20 小时
发表于 2015-7-29 16:44:02 | 显示全部楼层
回复【170楼】tianmin:
---------------------------------
我现在也是这样,但是在中断里做断点,单步走,不会出现这样的问题,连续跑就不行。
回复 支持 反对

使用道具 举报

  离线 

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-3-12
在线时间
0 小时
发表于 2015-7-31 15:54:44 | 显示全部楼层
 大家注意啊 编码器输出的电路 有些是输出电压 有些是NPN开集输出 有些是LINE Driver输出 
不同情况下GPIO的模式应该不同
比如说如果是输出电压 那么浮空输入当然可以
但是如果是NPN开集输出 应该用IPU也就是上拉输入 当然你自己外接上拉电阻也行。。。
以上是猜测 并未验证 求楼主指点
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-8-3 08:55:51 | 显示全部楼层
回复【173楼】ferdinand:
---------------------------------
看一下编码器说明书就知道了
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-3-12
在线时间
0 小时
发表于 2015-8-3 09:40:57 | 显示全部楼层
回复【174楼】科科1987:
---------------------------------
是阿 
主要就是我们这种新手 很容易直接COPY别人代码 注意到你的代码输入模式是浮空输入 所以我想知道你用的是不是电压输出型的编码器 验证一下~
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-8-3 11:00:24 | 显示全部楼层
回复【175楼】ferdinand:
---------------------------------
是开漏输出,需要上拉电阻的。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-3-12
在线时间
0 小时
发表于 2015-8-3 11:26:56 | 显示全部楼层
回复【176楼】科科1987:
---------------------------------
谢谢科科君~
回复 支持 反对

使用道具 举报

  离线 

19

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-1-14
在线时间
7 小时
发表于 2015-8-5 21:46:37 | 显示全部楼层
回复【90楼】逍遥winter:
---------------------------------
能否把您的程序给我参考参考,搞了几天了
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-8-25
在线时间
0 小时
发表于 2015-8-25 16:54:38 | 显示全部楼层
楼主麻烦看看我的程序,我用的是TIM2 设置好像和你的一样,但是出不来数,新手,勿怪。。void Encoder_Init(void)
{
/* TIM3 clock source enable */ 
RCC->APB1ENR|=1<<0;       //TIM3时钟使能
/* Enable GPIOA, clock */
RCC->APB2ENR|=1<<2;    //使能PORTA时钟

/* Configure A.06,07 as encoder input */
// GPIOA->CRL&=0XF0FFFFFF;//PA6
// GPIOA->CRL|=0X04000000;//浮空输入
// GPIOA->CRL&=0X0FFFFFFF;//PA7
// GPIOA->CRL|=0X40000000;//浮空输入

    GPIOA->CRL&=0XFFFFFFF0;//PA0
GPIOA->CRL|=0X04000000;//浮空输入
GPIOA->CRL&=0XFFFFFF0F;//PA1
GPIOA->CRL|=0X40000000;//浮空输入
   
/* Enable the TIM3 Update Interrupt */
//这两个东东要同时设置才可以使用中断
// TIM3->DIER|=1<<0;   //允许更新中断
// TIM3->DIER|=1<<6;   //允许触发中断
// MY_NVIC_Init(1,3,TIM3_IRQChannel,2);
MY_NVIC_Init(1,3,TIM2_IRQChannel,2);
    TIM2->DIER|=1<<0;   //允许更新中断
TIM2->DIER|=1<<6;   //允许触发中断


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

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

// TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
// TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2

TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM2->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;

TIM2->CCER &= ~(1<<1);  //CC1P='0'  IC1FP1不反相,IC1FP1=TI1
TIM2->CCER &= ~(1<<5);  //CC2P='0'  IC2FP2不反相,IC2FP2=TI2
TIM2->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器
TIM2->SMCR |= 3<<0;  //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM2->CNT = COUNTER_RESET;
TIM2->CR1 |= 0x01;
}
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-8-26 13:44:25 | 显示全部楼层
回复【179楼】zt19300597:
---------------------------------

GPIOA->CRL&=0XFFFFFFF0;//PA0
GPIOA->CRL|=0X04000000;//浮空输入  ------------------>这里有问题
GPIOA->CRL&=0XFFFFFF0F;//PA1
GPIOA->CRL|=0X40000000;//浮空输入 ------------------>这里有问题
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-8-25
在线时间
0 小时
发表于 2015-9-2 12:52:54 | 显示全部楼层
回复【180楼】科科1987:
---------------------------------
找到问题了,就是那里的,谢谢!!
回复 支持 反对

使用道具 举报

  离线 

5

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-18
在线时间
2 小时
发表于 2015-9-18 15:29:17 | 显示全部楼层
楼主寄存器版本能用的,没问题,非常感谢!对着楼主代码弄的库函数版本,也能用。贴下,希望对大家有所帮助:
void ENC_Init(void) 
{  

TIM_TimeBaseInitTypeDef 
TIM_TimeBaseStructure; 
TIM_ICInitTypeDef TIM_ICInitStructure; 

GPIO_InitTypeDef GPIO_InitStructure; 
NVIC_InitTypeDef NVIC_InitStructure; 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//TIM3 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
GPIO_StructInit(&GPIO_InitStructure);  
//TI1 TI2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //PA6,PA7 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
GPIO_Init(GPIOA, &GPIO_InitStructure);  

// NVIC_InitStructure.NVIC_IRQChannel = TIMER_IRQChannel;//TIM3_IRQn    
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;  
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY; 
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure); 

/* Timer configuration in Encoder mode */ 
TIM_DeInit(TIM3); 
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);  
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // ???
TIM_TimeBaseStructure.TIM_Period = (4*200)-1; //??????4*200-1 ENCODER_PPR=200
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); 
TIM_ICStructInit(&TIM_ICInitStructure);  
TIM_ICInitStructure.TIM_ICFilter = 6; // ICx_FILTER
TIM_ICInit(TIM3, &TIM_ICInitStructure); 
 
// Clear all pending interrupts  
TIM_ClearFlag(TIM3, TIM_FLAG_Update);    
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 

//Reset counter  
TIM3->CNT = 0 ; //COUNTER_RESET
TIM_Cmd(TIM3, ENABLE); 
}
嵌入式 Cortex-M0 M3 A8 电路 PCB VC C++ DSP FPGA 人与人之间的差距在于8小时之外的8小时
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-9-19 09:35:47 | 显示全部楼层
回复【182楼】asbnasbn:
---------------------------------
谢谢分享
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-12 20:55:35 | 显示全部楼层
楼主,麻烦问一下我在显示后面加了一个复位后,正转可以显示实时速度了,但反转就立刻溢出了,请问这个怎么办的?
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-11-12 22:39:39 | 显示全部楼层
回复【184楼】czcz200:
---------------------------------
打开溢出中断,在中断里统计溢出次数overflow_cnt,    结合正反转dir,
然后统计每个周期计数个数   正转:cnt = cnt_cur + overflow_cnt * 0xFFFF - cnt_last
                                         反转:cnt = cnt_last + overflow_cnt * 0xFFFF - cnt_cur
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-13 10:06:06 | 显示全部楼层
回复【185楼】科科1987:
---------------------------------
楼主,十分感谢回复我,真心谢谢,就是能否将思路跟我说一下,感谢,我可能学的不是很好,也请见谅
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-11-15 09:40:31 | 显示全部楼层
回复【186楼】czcz200:
---------------------------------
举个例子:
(1)编码器正转,STM32的编码器接口对应的计数器在向上计数(可以通过TIMx->CR1 & ((uint16_t)0x0010)获得编码器的转动方向),假设第一次采样计数值为65530,第二次采样计数值为10,期间计数器溢出1次,计数器的计数过程为:65530->65535->(向上溢出1次)0->10,那么两次采样期间计数个数为10-65530+65535*1=15,这样结合计数器计数频率和编码器分辨率就可以算出速度了。
(2)编码器反转,STM32的编码器接口对应的计数器在向下计数(可以通过TIMx->CR1 & ((uint16_t)0x0010)获得编码器的转动方向),假设第一次采样计数值为10,第二次采样计数值为65530,期间计数器溢出1次,计数器的计数过程为:10->0->(向下溢出1次)65535->65530,那么两次采样期间计数个数为10-65530+65535*1=15(这个值是用来求速度的大小,如果想得到速度大小和方向的话,那么65530-10-65535*1=-15),这样结合计数器计数频率和编码器分辨率就可以算出速度了。


if (编码器正转)  
 {
      Delta_cnt = (s32)(cnt_sample_cur - cnt_sample_last + Overflow_cnt * 0xFFFF);          
 }
else  
{
      Delta_cnt = (s32)(cnt_sample_cur - cnt_sample_last - Overflow_cnt * 0xFFFF);
}
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-16 10:29:54 | 显示全部楼层
回复【187楼】科科1987:
---------------------------------
哦,我明白了, Overflow_cnt=TIM3->CR1 & ((uint16_t)0x0010)是不是这样就可以获取是否溢出?然后您的意思是不是取两次速度,但楼主,我想问下取两次速度,中间的间隔是多少时间合适呢?感谢!
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-16 11:22:07 | 显示全部楼层
回复【188楼】czcz200:
---------------------------------
不是速度值,应该是取两次采样计数值,两次的间隔是多少比较好呢,谢谢楼主
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-16 11:38:45 | 显示全部楼层
还有楼主,就是请问一下,像一个STM32F103XZET6如果用这个程序的话,可以控制几个电机呢?再次十分感谢!
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-11-16 13:52:06 | 显示全部楼层
回复【188楼】czcz200:
哦,我明白了, Overflow_cnt=TIM3->CR1 & ((uint16_t)0x0010)是不是这样就可以获取是否溢出?然后您的意思是不是取两次速度,但楼主,我想问下取两次速度,中间的间隔是多少时间合适呢?感谢!
---------------------------------
(1)TIM3->CR1 & ((uint16_t)0x0010)是获取计数方向,看看《stm32参考手册》就明白了;
(2)间隔时间与你所测的速度范围有关系,越小实时性越好。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-11-16 13:57:22 | 显示全部楼层
回复【190楼】czcz200:

还有楼主,就是请问一下,像一个STM32F103XZET6如果用这个程序的话,可以控制几个电机呢?再次十分感谢!
---------------------------------
具体看数据手册
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-26 21:37:45 | 显示全部楼层
万分感谢楼主的耐心解答,但楼主我加入PWM的程序后,如果有MY_NVIC_Init(1,3,TIM3_IRQChannel,2);这句的话,函数就会进入中断,从而产生不了PWM了,这该咋办啊,再次感谢。
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-11-27 09:12:07 | 显示全部楼层
回复【193楼】czcz200:
---------------------------------
编码器接口和pwm输出是用的同一个定时器吗?
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-27 09:59:57 | 显示全部楼层
回复【194楼】科科1987:
---------------------------------
嗯嗯。我PWM输出用的是TIM2,编码器用的是TIM3呢
回复 支持 反对

使用道具 举报

  离线 

8

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2015-1-28
在线时间
29 小时
发表于 2015-11-27 11:05:09 | 显示全部楼层
感谢楼主。我解决了,是串口设置的问题。
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-11-27 12:08:07 | 显示全部楼层
回复【196楼】czcz200:
---------------------------------
好的
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

  离线 

12

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-1-5
在线时间
21 小时
发表于 2015-12-6 18:26:36 | 显示全部楼层
不错,讨论的很是详尽
天道酬勤
回复 支持 反对

使用道具 举报

  离线 

0

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-6
在线时间
2 小时
发表于 2015-12-24 14:15:38 | 显示全部楼层
强贴留名,学习学习
回复 支持 反对

使用道具 举报

  离线 

9

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-12-14
在线时间
49 小时
发表于 2015-12-24 22:16:45 | 显示全部楼层
谢谢楼主,怪不得之前串口输出的数,我觉得不对,看了下手册的图发现,确实是上升沿和下降沿都计数。
Keep moving,to be NO.1!
回复 支持 反对

使用道具 举报

  离线 

38

主题

523

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1393
金钱
1393
注册时间
2011-11-27
在线时间
118 小时
 楼主| 发表于 2015-12-25 13:33:34 | 显示全部楼层
回复【200楼】Jokyfjk:
---------------------------------
祝Jokyfjk的仿声鸟早日起翔
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

正点原子STM32/FPGA资料免费洗澡上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-12-17 08:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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