你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Stm32 AS5045 DMA 中断 编程 烧录

[复制链接]
bobbi 发布时间:2015-7-27 13:34
1前言:以前做什么项目都会去网上搜一搜,借鉴别的的程序,好的方案,自己也该拿出点东西供大家参考一下
2、 最近做项目需要读绝对角度值,用到了as5045,as5045为12位输出的旋转磁编码器,个人感觉精度还是挺好的,不说废话了,
3
3.1 as5045编程主要是两点,读角度值,零位编程,下面先说读角度值,看时序。

咋一看图就跟SPI时序差不多,为什么还叫SSI呢,网上查了一下,SSI信号是有两组RS422差分信号组成,如下图
所以as5045读角度时序为SPI时序,下面以SPI读角度值为例详细介绍
3.2 如图,
  初始电平:
CS =1;
CLK=1;
DO=0;
   当CS拉低,需要给予一定的延时,让CLK持续一定时间的高电平,然后再CLK的每一个上升沿DO输出一位数据,单片机需要在CLK的下降沿采样,个完整的周期,DO移出19位数据,前12位角度制信息,高位在前,其他位可以参考手册。
前12位为角度值所以SPI设置如下
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;         
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                        
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                        
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                        
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 0;        
SPI_Init(SPI3, &SPI_InitStructure);
SPI_Cmd(SPI3, ENABLE);
首先设置SPI为两线全双工模式(本来应该设置为两线只读模式,就是只读角度值就行了,可是我测试没有通过,所以采用全双工的,每次发送数据全为零,)
然后设置为主机模式这个就不说了,CLK需要提供嘛。
每次读八位数据
然后有时序图知,CLK初始为高电平,所以设置为SPI_CPOL_High。
时序图为下降沿采样,设置为CLK的第一次跳变采样,SPI_CPHA_1Edge。
片选都软件控制: SPI_NSS_Soft;
下一个就是分频系数了,as5045最大CLK为1M所以这个分频系数就看自己MCU的配置了,读单个角度值的话最高达到1M没有问题,采用菊花链的方式,速度会大大降低,等下面我会详细说明。
然后设置MSB先行,就是高位在前。
最后初始化并使能,这个SPI配置就搞定了,I/O的配置我就不详细说了。
3.2 下面开始读角度值啦
PCout(8)=0;        //拉低片选
Angle1=SPI_FLASH_SendByte(0x00); //发送0x00,并读取八位数据
Angle2=SPI_FLASH_SendByte(0x00);
PCout(8)=1;//拉高片选
这样连续读两个八位数据,就得到了DO的前15位,为什么是前15位呢,请在看一下时序图,CLK的第一个下降沿,DO只是锁存至输出移位寄存器,并没有输出数据,在第二个下降沿才开始有数据。
     虽然这样就可以读取角度值了,但是对于一些实时性要求比较高的,就需要加DMA了,还有中断,这些我就不详细介绍了。
3.3下面说一下菊花链(这个命名感觉好邪恶啊)
     就是可以让多个AS5045串联在一起,只用一个SPI读取所有角度值。
硬件需要注意的地方时最后一个PROG必须接地
这个编程也没那么复杂,一个编码器19位,两个38位,依次叠加。具体可以参考附件的程序。(第一次发,码字真不容易啊)
4下面来说一下零位编程。
零位编程需要注意两点:
1、电机位置固定后,需要读实际角度值,然后将此角度值写入OTP寄存器
2、区分write data 和write data -programming
3、   write data是指你每次write data之后,数据被保存到OTP寄存器中,并且立即生效,下次上电OTP寄存器初始化,你保存的数据会丢失,这个主要用于你测试中使用。
   如果你write data之后读出角度值为零,那么恭喜你可以进行write data -programming
   write data -programming是一个完整的编程过程,write data将数据写入,programming将熔丝熔断,进行永久性编程,下次上电也不会丢失。
   write data的过程就没什么说的了,看时序图上面标注的延时时间,只要足够大就没问题
但是  write data -programming过程中, programming阶段的CLK上升沿保持时间还有其他的一些时间间隔是有明确规定的,还有 programming阶段的PROG为7.5v这个千万不要忘记了。



收藏 2 评论6 发布时间:2015-7-27 13:34

举报

6个回答
丁南 回答时间:2015-7-27 13:38:16
苏柚 回答时间:2015-7-27 17:01:58
谢谢分享
Paderboy 回答时间:2015-7-27 21:05:49
多谢分享。。。。学习
yanhaijian 回答时间:2015-7-28 18:15:51
好SHOW。
Dylan疾风闪电 回答时间:2017-1-9 10:26:07
mark,感谢分享。
Gort 回答时间:2017-8-24 17:33:51
你的程序每次读取只有16位数据,少了3位数据,在对一个AS5045操作是没有什么问题,但是菊花链时,数据包都是完整的,你无法区分,所以。。。。。。。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版