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);
}
将磁铁放置再芯片上面,旋转。角度信息相应产生变化,导致为止开发测试结束。
AS5600磁编码器开发记录的更多相关文章
- CozyRSS开发记录22-界面退化
CozyRSS开发记录22-界面退化 1.问题1-HtmlTextBlock 找的这个HtmlTextBlock有很严重的bug,有时候显示不完全,有时候直接就崩了.然后看了下代码,完全是学生仔水平写 ...
- CozyRSS开发记录21-默认RSS源列表
CozyRSS开发记录21-默认RSS源列表 1.默认列表 在第一次使用CozyRSS的情况下,我们让它内置五个RSS源吧: 2.响应RSS源的更新 先不处理RSS源列表项的点击,响应下下拉菜单里的更 ...
- CozyRSS开发记录20-CanResizeWithGrip
CozyRSS开发记录20-CanResizeWithGrip 1.窗口样式 首先,WindowStyle有四种: 然后,对于窗口缩放的ResizeMode,也有四种,CanResize和CanRes ...
- CozyRSS开发记录19-窗口标题栏交互
CozyRSS开发记录19-窗口标题栏交互 1.谈谈对mvvm解耦的看法 在使用mvvm时,如何操作窗口,这是一个问题.这个问题的关键点是:mvvm是把view和viewmodel解耦了的,很多写法一 ...
- CozyRSS开发记录18-番外之Atom1.0的支持
CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...
- CozyRSS开发记录17-Html2Xaml
CozyRSS开发记录17-Html2Xaml 1.RssContentView还需要优化 上回做了RssContentView的显示,但是对于rss返回的描述(摘要),连换行的没有,更别说里面还有h ...
- CozyRSS开发记录16-RssContentView显示
CozyRSS开发记录16-RssContentView显示 1.RssContentView的布局和绑定 继续参照原型图来写xaml: 然后在RSSContentFrameViewModel里提供绑 ...
- CozyRSS开发记录15-获取和显示RSS内容
CozyRSS开发记录15-获取和显示RSS内容 1.内容列表 我们先给RSSContentFrame增加一个ViewModel,里面和RSS源列表一样,提供一个ObservableCollectio ...
- CozyRSS开发记录14-RSS源管理初步完工
CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...
随机推荐
- SQL Server ->> FileTable
FileTable是SQL Server 2012的新特性之一.它是基于SQL Server 2008的FILESTREAM特性上而来的,允许我们把Windows文件存储在SQL Server中,让S ...
- devexpress chart 散点图加载并分组显示(可以自定义颜色 同组中的点颜色相同)
this.dChart.Diagram.Series.Clear();//清空图的内容 var groups = result.GroupBy(itm => itm["flag&quo ...
- 从Event Loop谈JS的运行机制
这里主要是结合Event Loop来谈JS代码是如何运行的. 事件循环对于我们平时开发可以说是特别重要,可以让我们写出更好的代码. 到这里相信我们已经知道了JS引擎是单线程,而且这里会用到前面说的的几 ...
- Jsp Cookie的创建与读取 标签: cookiejsp 2016-11-17 15:14 61人阅读 评论(0)
Cookie.jsp <%@ page language="Java" import="java.util.*" pageEncoding="u ...
- Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
本课主题 Master 资源调度的源码鉴赏 资源调度管理 任务调度与资源是通过 DAGScheduler.TaskScheduler.SchedulerBackend 等进行的作业调度 资源调度是指应 ...
- PHP5.5的新特性
看了@轩脉刃 今天出炉的PHP 5.5 新特性.不过没有翻译全,我这里稍微补充下,整理成完整的一篇:) 原文:http://www.php.net/manual/zh/migration55.new- ...
- IOS UIWebView(浏览器控件)
什么是UIWebViewUIWebView是iOS内置的浏览器控件系统自带的Safari浏览器就是通过UIWebView实现的 UIWebView不但能加载远程的网页资源,还能加载绝大部分的常见文件h ...
- AngularJs学习笔记--Understanding the Controller Component
原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular中,controller是一个javasc ...
- commons.pool2 对象池的使用
commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency> <groupId>org.apache.commons</groupI ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(内容已过期,阅读请慎重)
项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: Elast ...