stm32 SSI读编码器

void Init_PIC(void)
{
    AS5311_CLK_H;
    AS5311_CSN_DIS;        
    delay_ms(2);
    AS5311_CSN_EN;    //CLK为高电平时,CSN来个下降沿可以使能磁栅尺AB脉冲
    delay_ms(100);
}

uint32_t read_AS5311chip(void)
{
  uint32_t raw_value;// = 0;
  uint16_t inputstream;// = 0;
  uint16_t c;
  inputstream = 0;
    raw_value = 0;
  AS5311_CLK_H;//digitalWrite(_clock, HIGH);
  AS5311_CSN_H;//digitalWrite(_cs, HIGH);
    delay_Systick_200ns(DELAYNUM);//delay_us(2);//
//  AS5311_CLK_H;//digitalWrite(_clock, HIGH);
//    delay_us(DELAYNUM);
  AS5311_CSN_L;//digitalWrite(_cs, LOW);下降沿
    delay_Systick_200ns(1);//delay_us(1);//
  AS5311_CLK_L;//digitalWrite(_clock, LOW);
    delay_Systick_200ns(DELAYNUM);//delay_us(2);
  for (c = 0; c < 18; c++)
  {
    AS5311_CLK_H;//digitalWrite(_clock, HIGH);
        delay_Systick_200ns(DELAYNUM);//delay_us(2);//
    inputstream = GPIO_ReadInputDataBit(GPIO_AS5311_DO,PIN_AS5311_DO);//digitalRead(_data);
    raw_value = ((raw_value << 1) + inputstream);
    AS5311_CLK_L;//digitalWrite(_clock, LOW);
        delay_Systick_200ns(DELAYNUM);//delay_us(2);//
  }
    AS5311_CLK_H;
//    delay_us(10);
    return raw_value;
}

void AS5311_AnalyzeSSICode(void)    //获取0-4096
{
    uint8_t cnt;
    uint8_t cnt_1;
    AS5311Dt.SSICode = read_AS5311chip();
//    AS5311Dt.detail.Errcode = AS5311Dt.SSICode & 0x0000003F;
//    AS5311Dt.detail.AbsCode = AS5311Dt.SSICode >> 6;
//检验数据是否有效 OCF COF LIN MagINC MagDEC Parity
//                 1   0   0    不能同时为1 奇偶校验
//OCF 0 补偿算法未完成,bit11-0可能无效
//COF    1 溢出,bit11-0无效
//LIN    1 线性度不好,bit11-0无效,若出现需增强磁栅尺的强度
//MagINC MagDEC 磁场强度    ,1 1表示磁场强度若
//Parity 偶校验
    if(3 == AS5311Dt.Class.Mag)
    {    //磁栅尺信号弱
        GbDt.Gb.SysAlm = AS5311WEAKERR;
    }
    else
    {
        if(4 != AS5311Dt.Class.Err)
        {        
            GbDt.Gb.SysAlm = AS5311READYERR;
        }
        else
        {
            cnt = 18;
            cnt_1 = 0;
            Seg32data.all = 0x0000A8A1;//AS5311Dt.SSICode;
            do
            {
                if(Seg32data.bits.bit0 == 1)
                {
                    cnt_1++;
                }
                Seg32data.all = Seg32data.all >> 1;
            }while(cnt--);
            cnt_1 = cnt_1 % 2;
            if(!cnt_1)
            {
                checkCounter();
                switch(GbDt.Gb.SysAlm)
                {
                    case AS5311READYERR:        //准备错误
                    case AS5311WEAKERR:            //信号弱
                    case AS5311EVENERR:            //奇偶错误
                        GbDt.Gb.SysAlm = NORMAL;
                        break;
                }
            }
            else
            {    //偶校验失败
                    GbDt.Gb.SysAlm = AS5311EVENERR;
            }
        }
    }
}

void checkCounter(void)
{
    int32_t temp;
    float Buf;
    GlPara.Curpole = AS5311Dt.detail.AbsCode/1366;    //[0,1366) 0;[1366,2732) 1;[2732,4095] 2

  if (GlPara.Lastpole == 2 && GlPara.Curpole == 0)
    {
    GlPara.SSIcount++;
  }

  if (GlPara.Lastpole == 0 && GlPara.Curpole == 2)
    {
    GlPara.SSIcount--;
  }
  //lastEncoderVal = encoderVal;
  GlPara.Lastpole = GlPara.Curpole;
    //转换为nm
    temp = AS5311Dt.detail.AbsCode;
    temp = 200000*(temp - GlPara.ZeroCode)/4096;
    temp += GlPara.SSIcount * 200000;
    GlPara.SSICurPos = temp;        //单位10nm=0.01um
//    Buf = GlPara.SSICurPos;
//    Buf = Buf * SSIPOS_TO_TPLS;
//    GbDt.Gb.CrrntPstn[OPTMTR] = Buf;
}

void Init_Zero(void)
{
    AS5311_AnalyzeSSICode();
    GlPara.Lastpole = 1;
    GlPara.ZeroCode = AS5311Dt.detail.AbsCode;
    //checkCounter();    
    GlPara.SSIcount = 0;
}

注意不用SSI模式时,CSN下降沿时CLK要处于高电平状态,否则AB正交脉冲不对。这样可能出现干扰导致磁栅尺错误,从而可以做个这样的时序,就算出现干扰好也能恢复。

### 回答1: STM32 SSI编码器是一种与STM32微控制器结合使用的编码器接口。SSI代表同步串行接口,它是一种高速并行接口,常用于与外部设备进行数据通信。 STM32微控制器是一系列由STMicroelectronics公司推出的高性能、低功耗的32位ARM Cortex-M核心的微控制器。它们广泛应用于各种应用领域,包括工业自动化、消费电子、汽车电子等。 编码器是用于测量旋转或线性运动的装置,它将运动转换为电信号输出。SSI编码器是一种专门为STM32微控制器设计的编码器接口。STM32微控制器通常具有丰富的外设功能,包括高速定时器和通信接口,可以实现对SSI编码器的完整支持。 SSI编码器通过串行数据传输方式将编码器的位置信息传送给STM32微控制器。它通常使用两根线来传输数据:时钟线和数据线。时钟线用于同步数据传输,控制数据的采样和发送,而数据线用于传输实际的编码器数据。 编码器通过SSI接口与STM32微控制器通信,可以实时地获取编码器的位置、速度和加速度等信息。这些信息可以用于控制系统中的位置反馈、运动控制和导航等应用。 总之,STM32 SSI编码器是一种专门为STM32微控制器设计的接口,可用于与编码器进行高速、可靠的数据通信。它广泛应用于各种应用领域,在工业自动化和机器人控制等领域具有重要作用。 ### 回答2: STM32 SSI编码器是指使用STM32微控制器来实现的具有SSI接口的编码器SSI(Synchronous Serial Interface,同步串行接口)是一种串行通信接口,用于在两个设备之间传输数据。编码器是一种用于测量旋转角度或线性位置变化的传感器。 STM32微控制器可以通过SSI接口与编码器通信。该接口支持全双工通信,能够同时接收和发送数据。通过SSI接口,STM32可以编码器发送的数据,并实时获取编码器的旋转角度或线性位移。 使用STM32 SSI编码器具有以下优点: 1. 高精度:SSI接口具有较高的数据传输速率和稳定性,可以实现高精度的数据取,保证了编码器的测量精度。 2. 快速实现:使用STM32微控制器,可以轻松地实现SSI编码器的接口,减少了硬件设计的工作量和复杂性。 3. 多功能性:STM32微控制器具有强大的计算和控制能力,可以根据需要对编码器的数据进行处理和分析,以实现各种功能,如速度控制、位置反馈等。 4. 可靠性:STM32微控制器具有优异的抗干扰性能和可靠性,可以在恶劣的工作环境下稳定工作。 5. 灵活性:STM32微控制器支持多种编程语言和开发环境,可以根据用户的需求进行定制开发,使得系统更加灵活和易于维护。 综上所述,STM32 SSI编码器是一种使用STM32微控制器来实现的具有SSI接口的编码器,具有高精度、快速实现、多功能性、可靠性和灵活性等优点。它在各种应用中广泛使用,包括工业自动化、机器人控制、位置测量等领域。 ### 回答3: STM32 SSI编码器是一种广泛应用于工业控制系统中的编码器接口。SSI(Synchronous Serial Interface)是一种同步串行通信接口,可以实现将旋转编码器的位置数据传输给STM32单片机。 首先,STM32单片机在硬件上提供了SSI编码器接口。该接口包括时钟线(CLK)、数据线(DATA)和使能线(NSS)。时钟线用于同步数据传输,数据线用于传输编码器位置数据,使能线用于外部设备的使能控制。 在软件层面,我们需要在STM32的固件库中初始化SSI接口,并配置相应的引脚作为SSI功能的功能针脚。然后,我们需要设置SSI的时钟极性(CPOL)和时钟相位(CPHA)以保证与编码器的通信兼容。此外,还可以设置SSI的帧格式、数据位、校验位等参数,以满足具体的编码器规格要求。 一旦SSI编码器初始化完成,我们可以使用STM32的中断或轮询方式编码器位置数据。通过在适当的时间取数据线上的电平变化,我们可以获取到编码器的转动方向和位置。此外,SSI接口还可以提供硬件过滤器功能,用于降噪处理,提高编码器数据的稳定性。 总之,STM32 SSI编码器是一种高效可靠的编码器接口,适用于各种工业控制系统中的位置检测和运动控制应用。通过合适的硬件和软件配置,我们可以实现对编码器数据的取和处理,从而实现精准的位置控制和运动监测。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值