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

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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版