打印
[STM32F1]

小弟初学stm32,最近在看编码器有几个问题不大懂,望各位高手解答一下。

[复制链接]
4234|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
编码器,小弟有几个地方不大懂,
(1)计数器计数的是脉冲值,也就是码盘转过的角度值,如果要算速度的话,那还得知道时间,时间怎么知道的呢,我看到网上的程序都是直接
#define SPEED_SAMPLING_FREQ (u16)(2000/(SPEED_SAMPLING_TIME+1))     然后设置2000/(SPEED_SAMPLING_TIME等于9,这个是怎么来的?     以及后面的算角度时相邻两次计数值之间时间间隔是怎么样进行计算的?
(2)第二个问题是,计数器是根据输入脉冲来进行计数的,那编码器模式下,输入脉冲的频率我们可以知道吗?
(3)算角度时,这一段程序是什么意思?尤其下面一行为什么要除以65536?
s16 ENC_Get_Electrical_Angle(void)
{
  s32 temp;
  
  temp = (s32)(TIM_GetCounter(ENCODER_TIMER)) * (s32)(U32_MAX / (4*ENCODER_PPR));
  return((s16)(temp/65536)); // s16 result                                                   
}
为什么不能直接用TIM_GetCounter(ENCODER_TIMER) / (4*ENCODER_PPR)?
沙发
icecut| | 2014-5-12 11:48 | 只看该作者

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
打盹的小老虎520 + 1 赞一个!
板凳
mmuuss586| | 2014-5-12 12:27 | 只看该作者
1、你可以参考楼上发的链接;
2、除66536,DEMO的例程返回16位的符号数,你可以不除;
3、为什么不能直接用TIM_GetCounter(ENCODER_TIMER) / (4*ENCODER_PPR)?
   上面的程序是先转换成32位有符号数,有符号数的算法结果,和整型的算法结果,有区别的;
2,3:DEMO程序而已,你可以按照自己的思维修改;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
打盹的小老虎520 + 1 很给力!
地板
打盹的小老虎520|  楼主 | 2014-5-12 14:44 | 只看该作者
icecut 发表于 2014-5-12 11:48
https://bbs.21ic.com/icview-350126-1-1.html
参照这个

SPEED_SAMPLING_FREQ  是等于手册上的fsampling吗?是通过定时器进行设置的吗?
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  
  TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
这四行代码是用来设置采样频率的吗?

使用特权

评论回复
5
打盹的小老虎520|  楼主 | 2014-5-12 14:51 | 只看该作者
mmuuss586 发表于 2014-5-12 12:27
1、你可以参考楼上发的链接;
2、除66536,DEMO的例程返回16位的符号数,你可以不除;
3、为什么不能直接用T ...

您好,就是第二个问题,编码器输入的信号频率我们可以知道吗?可以算出来吗?
还有顺便问下这段程序里面两次捕获的时间是怎么确定的?

temp = (signed long long)(wDelta_angle * SPEED_SAMPLING_FREQ);
    temp *= 10;  // 0.1 Hz resolution
    temp /= (4*ENCODER_PPR);

#define SPEED_SAMPLING_FREQ (u16)(2000/(SPEED_SAMPLING_TIME+1))
#define SPEED_SAMPLING_TIME  9
希望您给讲讲。相邻两次采样时间怎么样进行计算和设置。

使用特权

评论回复
6
icecut| | 2014-5-12 16:36 | 只看该作者
打盹的小老虎520 发表于 2014-5-12 14:44
SPEED_SAMPLING_FREQ  是等于手册上的fsampling吗?是通过定时器进行设置的吗?
TIM_TimeBaseStructure.T ...

当定时器配置成编码器接口模式时,提供传感器当前位置的信息。使用第二个配置在捕获模式
的定时器,可以测量两个编码器事件的间隔,获得动态的信息(速度,加速度,减速度)。指示机
械零点的编码器输出可被用做此目的。根据两个事件间的间隔,可以按照固定的时间读出计数
器。如果可能的话,你可以把计数器的值锁存到第三个输入捕获寄存器(捕获信号必须是周期的
并且可以由另一个定时器产生);也可以通过一个由实时时钟产生的DMA请求来读取它的值

我看了几遍中文版的编码器模式.觉得他说的的确还是比较难懂的.首先,第二个配置在捕获模式
的定时器----这是第二个定时器,可能是一个定时器的某种信号,触发第二个定时器定时.这个不是你问的那种.这个信号也可以是编码器的机械0点信号.
还有一个就是定时捕获,例如定时器触发/dma触发...
这样也不是你问的问题的答案.

我和你一样,怀疑那段话是定时器设置.那可能就是上面定时捕获.使用一个外置的时间信号来触发捕获.这个时钟来自时钟分频..或者定时器....

我没详细的用过.所以还需要你在一些验证.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
打盹的小老虎520 + 1 很给力!
7
icecut| | 2014-5-12 16:38 | 只看该作者
有些时候,节约资源,使用了一些技巧.这些技巧稍微你难理解一点.需要一点时间.
这么玩还是很刺激的.希望lz挑战一下

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
打盹的小老虎520 + 1 很给力!
8
icecut| | 2014-5-12 16:39 | 只看该作者
打盹的小老虎520 发表于 2014-5-12 14:51
您好,就是第二个问题,编码器输入的信号频率我们可以知道吗?可以算出来吗?
还有顺便问下这段程序里面 ...

我认为lz在这个问题上不够认真
看注释:
* Return         : Rotor electrical angle: 0 -> 0 degrees,
*                                          S16_MAX-> 180 degrees,
*                                          S16_MIN-> -180 degrees      
你要可以按你的思想写代码.最后得到结果比较一下谁是正确.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
打盹的小老虎520 + 1 很给力!
9
打盹的小老虎520|  楼主 | 2014-5-12 19:11 | 只看该作者
icecut 发表于 2014-5-12 16:39
我认为lz在这个问题上不够认真
看注释:
* Return         : Rotor electrical angle: 0 -> 0 degrees,

谢谢版主批评,同时感谢版主的指导,我再多看一下,调试一下程序试试。

使用特权

评论回复
10
打盹的小老虎520|  楼主 | 2014-5-12 19:13 | 只看该作者
icecut 发表于 2014-5-12 16:38
有些时候,节约资源,使用了一些技巧.这些技巧稍微你难理解一点.需要一点时间.
这么玩还是很刺激的.希望lz挑 ...

我也知道有些地方就照别人的程序复制会节省很多时间,但我觉得如果能够把一个问题弄懂那就更好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝