STM32
直播中

李鸿洋

10年用户 923经验值
擅长:可编程逻辑
私信 关注
[问答]

请问2.0电机库里编码器初始化时,计数器初值的计算公式是怎么来的呢?

请问2.0电机库里编码器初始化时,计数器初值的计算公式是怎么来的呢?//Reset counter
        tiM2->CNT = COUNTER_RESET;


#define COUNTER_RESET       (u16) ((((s32)(ALIGNMENT_ANGLE)*4*ENCODER_PPR/360)
                                                              -1)/POLE_PAIR_NUM)



还有就是机械角度和电角度的计算,看不明白啊。。。。
还请大神指点
s16 ENC_Get_Mechanical_Angle(void)
{
        s32 temp;

        temp = (s32)(TIM_GetCounter(ENCODER_TIMER)) * (s32)(U32_MAX / (4*ENCODER_PPR)) ;
        return((s16)(temp/65536)); // s16 result
}


s16 ENC_Get_Electrical_Angle(void)
{
        s32 temp;

        temp = (s32)(TIM_GetCounter(ENCODER_TIMER)) * (s32)(U32_MAX / (4*ENCODER_PPR));         
        temp *= POLE_PAIR_NUM;  
        return((s16)(temp/65536)); // s16 result
}



回帖(1)

jfsky

2024-4-30 17:19:14
在这个问题中,您提到了2.0电机库中的编码器初始化,以及计数器初值的计算公式。首先,我们需要了解编码器和电机库的基本概念。

编码器是一种将机械位置转换为数字信号的设备,通常用于测量电机的旋转角度和速度。在电机控制系统中,编码器提供了精确的位置反馈,有助于实现精确的速度和位置控制。

电机库是一组预先编写的函数和程序,用于简化电机控制任务。这些库通常包含初始化、配置、控制和监测电机的各种功能。

现在,让我们分析您提供的代码片段:

```c
//Reset counter
TIM2->CNT = COUNTER_RESET;
#define COUNTER_RESET (u16) ((((s32)(ALIGNMENT_ANGLE)*4*ENCODER_PPR/360)
```

这段代码的目的是在电机库中初始化编码器,并设置计数器的初值。以下是计算计数器初值的步骤:

1. `ALIGNMENT_ANGLE`:这是一个角度值,表示电机需要旋转到的初始位置。这个值通常以度(°)为单位。

2. `ENCODER_PPR`:这是一个常量,表示编码器每转一圈产生的脉冲数(Pulses Per Revolution)。这个值取决于编码器的分辨率。

3. `360`:这是一个常数,表示一个完整的圆周角度。

4. `4`:这个值可能与电机的极对数(Poles)有关。在某些电机控制系统中,需要将编码器的脉冲数乘以一个因子,以适应电机的极对数。

计算公式的解释:

```
COUNTER_RESET = (u16) ((((s32)(ALIGNMENT_ANGLE) * 4 * ENCODER_PPR) / 360)
```

这个公式计算了从0度开始,电机需要旋转到`ALIGNMENT_ANGLE`所需的编码器脉冲数。首先,将`ALIGNMENT_ANGLE`乘以4,以适应电机的极对数。然后,将结果乘以`ENCODER_PPR`,得到在该角度下编码器产生的总脉冲数。最后,将这个值除以360,以将角度转换为编码器的脉冲数。

`COUNTER_RESET`是一个16位无符号整数(u16),用于存储计算出的脉冲数。在电机库中,这个值被用作计数器的初始值,以便在启动电机时,系统知道电机的初始位置。

总之,这个计算公式用于确定电机在特定角度下的编码器脉冲数,并将其用作计数器的初始值。这有助于实现电机控制系统中的精确位置反馈和控制。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分