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正交脉冲不对。这样可能出现干扰导致磁栅尺错误,从而可以做个这样的时序,就算出现干扰好也能恢复。

stm32 SSI读编码器相关推荐

  1. STM32定时器捕获编码器模式测速和方向测不准问题

    ** STM32定时器捕获编码器模式测速和方向测不准问题 问题概述 关于STM32编码器模式电机测速的资料网上一抓一大把,却发现真的拿过来用还是有问题的,比如刚刚做了个东西,是个个头比较大的麦克纳姆轮 ...

  2. STM32—TIMx实现编码器四倍频

    文章目录 一.储备知识 二.TIMx的编码器模式介绍 1.计数边沿设置 2.选择极性和使能 3.使能 4.计数方向 三.代码部分 一.储备知识 通过STM32的定时器编码器接口模式对编码器进行四倍频, ...

  3. STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机

    文章目录 1.L298N电机驱动 1.1 产品参数 1.2 实物图和接线 2.编码器 2.1 编码器简介 2.2 常用编码器分类 2.3 霍尔编码器实物图接线!!!! 2.4 编码器倍频原理 3.控制 ...

  4. STM32读取旋钮编码器

    视频演示 #define ROTATE_A PAin(2) #define ROTATE_B PAin(3) s16 DATA=0;void EXTI2_IRQHandler(void) {if(EX ...

  5. STM32定时器---正交编码器模式详解

    编码器分类: 按工作原理:光电式.磁电式和触点电刷式 按码盘的刻孔方式:增量式和绝对式两类 由于博主接触面还不是很广,一共就用过两个种类的编码器,都是属于光电的 差分编码器:一般由8根线连接 信号线分 ...

  6. STM32 EC11 旋转编码器

    **先给大家看看我选用的EC11元器件** 代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种.一种是转两格,A.B对C端输出一个 ...

  7. STM32,读保护解锁

    环境 正点原子STM32H743开发板,ST-LINK烧写器,ST-LINK Utility软件 现象 无法擦除.烧写.读出程序,提示Can not read memory(或从Flash读到全是00 ...

  8. STM32芯片读保护解锁

    工具 开发板 USB-TTL模块 官方下载软件Flash loader demostrator 解除读写保护 一直next到这个页面(注意板子连接正常,boot0=1,boot1=0,中间可能有提示按 ...

  9. stm32 状态 读gpio_STM32单片机的GPIO模式解析

    一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定. 推挽电路是两个参数相同的三极管或M ...

  10. MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600

      MT6701是麦歌恩(MagnTek)公司的磁性角度传感器芯片,提供14Bit 0~360°单圈绝对角度检测,拥有 ABZ/PWM/模拟量/I2C/SSI 等多种信息输出方式,还可根据磁场强度的瞬 ...

最新文章

  1. 机器学习(三)--- scala学习笔记
  2. 图数据库Titan安装与部署
  3. c++面向对象的编程
  4. 赠书:分布式系统中的监控怎么做?
  5. php及时提醒反馈,php,实时交互_请问PHP脚本执行时如何实时提供反馈,php,实时交互 - phpStudy...
  6. 微博机器学习平台云上最佳实践
  7. mysql innodb monitor_mysql:innodb monitor(show engine innodb status)探秘
  8. FileZilla:425 Can't open data connection for transfer of解决办法
  9. Docker 学习5 Docker容器网络
  10. vivado.2019.1 安装教程
  11. Linux沙箱技术简介
  12. 互联网+脑科学,中国脑计划的机会
  13. 移动端网页的基础制作
  14. 这一周 火火火 的 GitHub 项目
  15. 如何用AVS Video Editor给视频添加文字?
  16. [学习打卡]Python基础入门(一)
  17. 全网最全pytest大型攻略,单元测试学这就够了
  18. IBM Guardium
  19. Spring MVC 如何实现RESTFull的 delete和put提交
  20. 联通大数据携U10峰会而来……

热门文章

  1. 【python写一个无限弹窗】
  2. 计算不确定度(C语言-大物实验)-复制即可使用
  3. 漫谈android系统(4)bring up panel
  4. linux zip命令安装,linux安装zip命令
  5. 项目管理计划_通用模板
  6. 2019/9/11,机器学习(周志华)第二章及学习笔记
  7. 【AD封装】DB9接口公母头(带3D)
  8. WIN2000大硬盘补丁
  9. 2018年全国大学生电子设计竞赛TI杯赛题简单回顾和准备经验分享
  10. ORACLE 9 默认密码