王昱顺 发表于 2025-4-25 08:26:38

haiming8685 发表于 2025-4-25 07:58
王工您好!我说的电机磁编码器电角度的最大分辨率只有10位,您程序中的磁编码器分辨率是14位的,这个怎么匹 ...

数据左移4位即可

haiming8685 发表于 2025-5-10 22:18:08

王工您好!我的板子驱动电机在开环模式下,电机可以启动运行就是速度比较低,若设置成速度模式,启动时电流比较大,而且转不起来,我的电机是自带磁编码器,编码器输出A、B、Z三个脉冲,电机每转一圈A、B分别输出256个脉冲,测脉冲分辨率为10位,换算成14位替换进程序中。不知道问题出在哪里了

王昱顺 发表于 2025-5-11 00:09:46

haiming8685 发表于 2025-5-10 22:18
王工您好!我的板子驱动电机在开环模式下,电机可以启动运行就是速度比较低,若设置成速度模式,启动时电流 ...

大概是没有进行零点校准的问题,上电需要额外再给z信号一次校准应该才能用

haiming8685 发表于 2025-5-11 14:37:27

王工您好!请问一下,电机在启动前转子的位置应该是未知的,到底距Z点有多少度也是未知的,是不是要电机在开环状态下旋转才能使转子对到Z点实现校准,是不是每次上电启动前都要进行一次按键零点校准

王昱顺 发表于 2025-5-12 07:36:42

haiming8685 发表于 2025-5-11 14:37
王工您好!请问一下,电机在启动前转子的位置应该是未知的,到底距Z点有多少度也是未知的,是不是要电机在 ...

是这样的,磁编码器上电就能知道位置,但是ABZ必须校准一次的

haiming8685 发表于 2025-5-12 18:38:20

王工您好!电机设定在开环模式下可以启动运行,速度比较慢但是比较平稳,再设置为速度模式时,上电检测正常有三声响,按件校准时电机有左右转动后停止在一个位置上,但是我按键启动时电机惯量很大,转子转动一下就停下来不转了,若再按按键电机现象同样结果,我把三相U、V、W对调也不行,把编码器的A、B对调也不行,不知道问题出在哪里了

王昱顺 发表于 2025-5-12 18:42:06

haiming8685 发表于 2025-5-12 18:38
王工您好!电机设定在开环模式下可以启动运行,速度比较慢但是比较平稳,再设置为速度模式时,上电检测正常 ...

我的那个校准程序应该是不大适合你这个ABZ电机的
我给你一个思路啊,修改开环校准部分,找到Z信号后停下,然后将我那个偏移量清零,并且不要重启电机(因为重启后零点会不对)
后面按照极对数之类的正常映射过去就行了

haiming8685 发表于 2025-5-12 18:44:41

void abz_encoder(void)
{
    P2PU |= 0x40;
    P3PU |= 0x0c;
   
    if (((a_last == 0) && (ENCODER_A == 1))
      || ((a_last == 1) && (ENCODER_A == 0))
      || ((b_last == 0) && (ENCODER_B == 1))
      || ((b_last == 1) && (ENCODER_B == 0)))
      counter++;
   
    if ((z_last == 0) && (ENCODER_Z == 1))
      counter = 0;
   
    a_last = ENCODER_A;
    b_last = ENCODER_B;
    z_last = ENCODER_Z;
   
      _angle_this_dat = counter * 16;//(((Encoder_Data << 8) | (Encoder_Data & 0xfc)) >> 2);
      _angle_dangle = (_angle_this_dat - _angle_last_dat);
      if (_angle_dangle < -(Encode_bit_Max / 2))
      {
            _postion_add_dat++;
            __postion_add_dat++;
            _angle_dangle += Encode_bit_Max; // 过零处理
      }
      if (_angle_dangle > (Encode_bit_Max / 2))
      {
            _postion_add_dat--;
            __postion_add_dat--;
            _angle_dangle -= Encode_bit_Max;
      }
      if (fabs(postion_add) > 1 && Mode == Speed_Mode && Run_Flag)
      {
            moto.set_postion += (long)postion_add;
            postion_add -= (long)postion_add; // 自减整数部分
      }
      // 圈数累计,可以累计正负2^31圈
      _angle_last_dat = _angle_this_dat;
}

// 环控标志位
void Timer1_Isr(void) interrupt TMR1_VECTOR // 38us中断一次
{
        //Start_Read_Encoder();          // 启动一次SPI编码器读取,同步跟随输出控制
    abz_encoder();
        Output_Loop_Clk_Flag = 1; // 启动输出同步标志
        if (Mode == Postion_Mode || Mode == Set_ID_Mode || Mode == Speed_Mode || Mode == Servo_Mode)
                Postion_Loop_Clk_Flag = 1;
}

haiming8685 发表于 2025-5-12 18:51:18

这个是我修改的增量型编码器函数,您看看是哪里出错了,我通过串口看了一下,电机开环旋转时数值在增加,基本上与14位编码数值相当

haiming8685 发表于 2025-5-12 18:55:15

我的电机转子是4对极,我也把您的7对极也改成4对极了
页: 21 22 23 24 25 26 27 28 29 30 [31] 32 33 34
查看完整版本: 高性能FOC | 32F12K54-FOC Lite V2 开源!经多天测试,稳定无异常==目前最高水平