AS5600磁编码器开发记录

AS5600使用简介——(程序员版)

-----------------本文由“智御电子”提供,同时提供范例教程,以便电子爱好者交流学习。----------------

前言:

最近由于工作需要接触到AS5600这颗磁角度传感器,以前就对相关的磁应用感到各种高大上(例如霍尔传感器,磁流体等)。既然接触到了,就开始搜索相关资料,发现有用的资料并不多,仅限官网上发布的一些。作为程序员看完datasheet,肯定是要搞一份代码拜读一下。在这里 吐槽一下这AMS官网的揍性:手册里写了官网有ardunio的例子,一顿好找好不容易才找到,接着注册账号想下载,竟然提示没有权限下载(一脸茫然,你个卖芯片的,配套软件环境挂网上不能下载是什么鬼),功夫不负有心人,还是在好心网友的分享下找到了一些代码。特此将自己开发经过记录下来,与君共享!

开发流程:

从手册了解到AS5600这颗芯片支持IIC通信,但是输出的信号的方式还有PWM,模拟电压等多种方式。本文直接上手IIC通信。

接着直接就是设计原理图了,这部分手册都有推荐的电路,需要注意的是VDD5V和VDD3V3引脚的选择。因为本文采用的是STM32F0芯片的主控,供电电压是3V3,故选择3.3v Operation的如下电路。

再就是设计模块PCB,模块电路PCB打样回来,如下图所示。

本文把几个引脚都留出来,通过杜邦线跟控制板连接,连接线如下表所示。

AS5600模块 STM32F0系统板
VCC 3.3V
GND GND
DIR GND
SCL PA9
SDA PA10
GPO 3.3V

紧接着就是程序设计。出去对STM32硬件IIC的敬畏,我选择敬而远之,采用普通引脚软件模拟IIC的通信过程。软件模拟IIC的过程主要把握两方面:速率控制和时序控制。

速率控制就是SCL的变化速率,只要控制再AS5600允许的范围内即可。AS5600支持Fast-mode Plus模式,SCL能达到1MHz。

时序控制就是SCL和SDA变化的规则。有的芯片的IIC还是有点小异同的,所以我们需要对照手册的时序再进行模式时序。

本文首先利用CubeMX直接生成STM32F0的Keil工程代码,将PA9(SCL)和PA10(SDA)设置普通的输出引脚。需要注意的是SCL一直由主机提供,故一直都是输出模式;但是SDA为数据线,当从机传数据至主机的时候,主机需要将SDA的模式改为输入模式。代码如下

#define SDA1_IN()  IIC_SDA_GPIO_Port->MODER &= ~(0x3<<(10*2))
#define SDA1_OUT() IIC_SDA_GPIO_Port->MODER &= ~(0x3<<(10*2));IIC_SDA_GPIO_Port->MODER |= (0x1<<(10*2))

然后就是将IIC的通信协议进行分解,拆解成:

Sim_I2C1_START()、Sim_I2C1_SendByte()、Sim_I2C1_Wait_Ack()、Sim_I2C1_STOP()

最后整合成读和写两个函数,如下所示。

/**

- @brief  模拟IIC的多字节读

- @param

- @note

- @retval void

- @author 智御电子
  */
  uint8_t Sim_I2C_Read8(uint8_t moni_dev_addr, uint8_t moni_reg_addr, uint8_t moni_i2c_len, uint8_t *moni_i2c_data_buf)
  {

  Sim_I2C1_START();
  Sim_I2C1_SendByte(moni_dev_addr << 1 | I2C1_Direction_Transmitter);
  Sim_I2C1_Wait_Ack();
  Sim_I2C1_SendByte(moni_reg_addr);
  Sim_I2C1_Wait_Ack();
  //Sim_I2C1_STOP();

  Sim_I2C1_START();
  Sim_I2C1_SendByte(moni_dev_addr << 1 | I2C1_Direction_Receiver);
  Sim_I2C1_Wait_Ack();
  while (moni_i2c_len)
  {
    if (moni_i2c_len==1) *moni_i2c_data_buf =Sim_I2C1_ReceiveByte();
    else *moni_i2c_data_buf =Sim_I2C1_ReceiveByte_WithACK();
    moni_i2c_data_buf++;
    moni_i2c_len--;
  }
  Sim_I2C1_STOP();
  return 0x00;
  }

/**

- @brief  模拟IIC的多字节写

- @param

- @note   当启用check功能的时候,只能是单字节写的情况,多字接写不可启用check功能

- @retval void

- @author 智御电子
  */
  int8_t Sim_I2C1_Write8(uint8_t moni_dev_addr, uint8_t moni_reg_addr, uint8_t moni_i2c_len, uint8_t *moni_i2c_data_buf)
  {
  uint8_t i;
  Sim_I2C1_START();
  Sim_I2C1_SendByte(moni_dev_addr << 1 | I2C1_Direction_Transmitter);
  Sim_I2C1_Wait_Ack();
  Sim_I2C1_SendByte(moni_reg_addr);
  Sim_I2C1_Wait_Ack();

  //Sim_I2C1_START();
  for (i=0; i<moni_i2c_len; i++)
  {
    Sim_I2C1_SendByte(moni_i2c_data_buf[i]);
    Sim_I2C1_Wait_Ack();
  }
  Sim_I2C1_STOP();
    return 0;
  }

下面就是开始对AS5600进行IIC的寄存器设置了。其实AS5600的设置相对来说比较简单。特别是对于360度旋转检测的应用,基本不需要设置,直接读取raw data寄存器就可以读出角度信息。但是如果对于小范围角度检测的应用场景,AS5600可以设置其实起始角度和终点角度(大于18度)来和实际的应用对应起来。这个时候就需要按照datasheet的设计步骤一步一步初始化相应的寄存器。本文需要360度检测,故不考虑这种情况。

再main函数中直接利用iic读取角度寄存器的数值,然后转化成角度,最后通过串口打印出来。

void Programe_Run(void)
{
    uint8_t dect= 0;
    dect = detectMagnet();
    printf("detectMagnet is %d\r\n",dect);
    rawdata = getRawAngle();
    printf("rawdata is %d\r\n",rawdata);
    degress = convertRawAngleToDegrees(rawdata);
    printf("degress is %f\r\n",degress);
}

将磁铁放置再芯片上面,旋转。角度信息相应产生变化,导致为止开发测试结束。

原文地址:https://www.cnblogs.com/SC-Electronic/p/10241953.html

时间: 2025-01-13 08:03:22

AS5600磁编码器开发记录的相关文章

CozyRSS开发记录5-订阅列表栏里的项

CozyRSS开发记录5-订阅列表栏里的项 1.订阅列表栏里的项的原型图 这里列表项依然参考傲游的RSS阅读器,以后可能会微调. 2.使用ControlTemplate来定制ListBoxItem 给展示RSS源名称的TextBlock设置MaxWidth和ToolTip,是为了优化名称过长的情况. 这里暂时把内容都写死,后面会使用MVVM和bindling来处理. 3.ListBox效果展示 最后,我们修改ListBox的xaml,用上我们的模版. 效果还行

个人知识管理系统Version1.0开发记录(08)

切入点 前面,我们已经搭建好了web端的一种基本结构,需要进一步定位的主要问题有三点: 1.界面的选择和确定,用extjs做的初步样式,进一步改动为jqueryUI/html,再进一步改变为HTML5等.我们思考一种用户思维,只要有一个地方让用户不喜欢,用户就会全盘否定该款软件:所以,软件界面一定要简单.精致.能引起用户的兴趣.符合用户习惯和用户思维. 2.框架的选择和确定,struts2,hibernate/mybatis,spring等,在编写知识体核心功能模块前,需要完成选择和改写. 3.

个人知识管理系统Version1.0开发记录(04)

demo model 我们采用mvc软件架构模式,方便以后用Struts2框架技术优化.重构.封装.这次主要设计一些常用的方法工具,即数据访问逻辑.工具:eclipse.oracle.sqldeveloper. 思路如下: 1.  用sqldeveloper新建表oneds,写入一条name="cookie"的数据. 细节: 参数越多,越要细致检查单词拼写. 2.  用java读取和写入对象属性,与数据库互动. 3.  用java进行数据访问,先完成五个方法,查询所有知识点,增加知识点

jquery easyui根据需求二次开发记录

1.tree需要显示多个图标 实际需求:设备树上节点需搁三个图片,分别标识运行状态.告警状态.设备类型 解决方法:给tree的iconCls传入一个数组,分别是各状态下的class(css),然后要改动easyui关于tree节点组装部分的代码 if(item.iconCls ){ cc.push("<span class=\"tree-icon tree-folder "+(item.iconCls?item.iconCls:"")+"\

ios应用内购买开发记录教程 ios iap In-App Purchases

以下问题在2014年7月测试的.不保证以后有啥不一样的 1.在iTunes Connect里添加应用,标题/截图/描述/关键字不能更改,icon和包名可以更改.添加后应用不能删除. 2.在In-App Purchases里添加商品,没有4个类型的选项.原因:iTunes Connect上的“Contracts, Tax, and Banking”信息没有设置 3.In-App Purchases的商品添加后无法删除. 4.ios6模拟器可以测试,ios7模拟器测试会说无法连上iTunes.“Er

LNMP系列网站零基础开发记录(三)

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 三.web页面开发 好吧,本来想单独写一章bootstrap的,但是前端确实没什么好写的,这里我们直接结合实际直接开搞吧.做WEB我习惯先把想要的页面模板做完,然后再根据razar或者这里要用到的django template修改.美工确实不太好,P得一手烂图,所以一般都用现成的开源框架,这里我

CozyRSS开发记录8-解析一份RSS

CozyRSS开发记录8-解析一份RSS 1.使用Rss20FeedFormatter解析RSS 使用Rss20FeedFormatter配合XmlReader来解析RSS非常的简单,几行搞定: 来试试效果: 貌似一切顺利,爽的一笔. 2.这是一个悲伤的故事 然而,故事总是没有这么简单.我们再试一下另一个网站的RSS. 虽然可能是因为这个网站提供的RSS不规范造成的,但是这个RSS在别的RSS阅读器都没问题啊! 看看Mono里的代码: 真是呵呵啊. 3.CozyRSS.Syndication 所

CozyRSS开发记录1-原型图与Grid

CozyRSS开发记录1-原型图与Grid 1.使用MockPlus画出最简陋的原型图 这个界面参考了目前我最常使用的RSS阅读-傲游浏览器的内置RSS阅读器.主体框架划分为上.左下.右下三块,分别是标题栏(工具类)TitleBar.订阅列表栏RSSListFrame.订阅内容栏RSSContentFrame.订阅内容栏又划分为上.左下.右下三部分,分别是RSSContentTitle.RSSContentList.RssContentView. 2.建立CozyRSS工程,用Grid划分窗口

CozyRSS开发记录2-酷炫的皮肤库

CozyRSS开发记录2-酷炫的皮肤库 1.MaterialDesignToolkit 最开始微软推出Metro设计风格的时候,有人喜欢有人喷.紧接着,Ios也开始做扁平化的UI,这时候,扁平化已成为新的设计趋势.再往后,谷歌也推出了Material Design. MaterialDesignToolkit是一个帮助桌面程序快速应用Material Design的库,并且它是开源的,github地址为: https://github.com/ButchersBoy/MaterialDesign