搜索
查看: 4732|回复: 10

Stm32 AS5045 DMA 中断 编程 烧录

[复制链接]

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2015-4-10 22:44:19 | 显示全部楼层 |阅读模式
Stm32 AS5045 DMA 中断 编程 烧录
1前言:以前做什么项目都会去网上搜一搜,借鉴别的的程序,好的方案,自己也该拿出点东西供大家参考一下
2、 最近做项目需要读绝对角度值,用到了as5045,as5045为12位输出的旋转磁编码器,个人感觉精度还是挺好的,不说废话了,
3
3.1 as5045编程主要是两点,读角度值,零位编程,下面先说读角度值,看时序。
file:///C:\Users\jole\AppData\Local\Temp\ksohtml\wps91CF.tmp.jpg
咋一看图就跟SPI时序差不多,为什么还叫SSI呢,网上查了一下,SSI信号是有两组RS422差分信号组成,如下图
file:///C:\Users\jole\AppData\Local\Temp\ksohtml\wps91D0.tmp.jpg
file:///C:\Users\jole\AppData\Local\Temp\ksohtml\wps91D1.tmp.png所以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读取所有角度值。
file:///C:\Users\jole\AppData\Local\Temp\ksohtml\wps91E1.tmp.jpg
硬件需要注意的地方时最后一个PROG必须接地
这个编程也没那么复杂,一个编码器19位,两个38位,依次叠加。具体可以参考附件的程序。(第一次发,码字真不容易啊)
4下面来说一下零位编程。
零位编程需要注意两点:
[size=10.5000pt]1、电机位置固定后,需要读实际角度值,然后将此角度值写入OTP寄存器
[size=10.5000pt]2、区分write data 和write data -programming
[size=10.5000pt]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这个千万不要忘记了。
  

回复

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
 楼主| 发表于 2015-4-10 22:45:12 | 显示全部楼层
本帖最后由 高手高手 于 2015-7-13 19:43 编辑

好了该说的我都说的差不多了,还有什么不明白的可以直接问我。下面讲讲我的疑惑吧,
首先我用DMA中断加SPI在读取单个角度值的时候,CLK打到1M可以正常读取角度值,当读取2个和2个以上的时候,读取的角度制就不正确了,我只能降低速率,并且每次读角度值的间隔为1ms。
  再讲一下我的程序是在STM32F407ZET6单片机上开发的,移植时请注意
1,读单个角度值可以用DMA+中断 也可以用DMA+1ms读DMA标志位
首先在as5045spi.h中
    #define DMA_IRQ
#define DMA_CHECK
屏蔽任一个都可以,单个角度制读取的话用 DMA_IRQ速度会更快,
#define MOTOR_NUM  1//一个角度值设置为1,
当读多个电机角度值时,只能用DMA_CHECK,屏蔽#define DMA_IRQ
,然后MOTOR_NUM为你设置的电机个数。
好了就说这么多了吧,个人知识有限,有错误的地方还请指出,lol去喽
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
 楼主| 发表于 2015-4-10 22:46:22 | 显示全部楼层
刚才发的那个帖子有点问题,不知道怎么删掉只能重新发了一个喽
回复 支持 反对

使用道具 举报

1

主题

3

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 2015-4-13 09:08:00 | 显示全部楼层
非常感谢您的分享~
回复 支持 反对

使用道具 举报

43

主题

122

帖子

426

积分

中级会员

Rank: 3Rank: 3

积分
426
发表于 2015-4-17 08:42:07 | 显示全部楼层
感谢分享!收益良多!
回复 支持 反对

使用道具 举报

36

主题

110

帖子

520

积分

高级会员

Rank: 4

积分
520
发表于 2015-4-19 12:23:13 | 显示全部楼层
谢谢
回复

使用道具 举报

43

主题

113

帖子

410

积分

中级会员

Rank: 3Rank: 3

积分
410
发表于 2015-4-24 15:53:40 | 显示全部楼层
感谢提供宝贵的设计经验
回复 支持 反对

使用道具 举报

cicibabe-105030 该用户已被删除
发表于 2015-5-27 23:31:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

1

主题

44

帖子

402

积分

中级会员

Rank: 3Rank: 3

积分
402
发表于 2015-5-28 07:46:35 | 显示全部楼层
很不错的分享,只是好像有几张图片没有帖上来。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2015-6-1 12:54:06 | 显示全部楼层
感谢提供宝贵的设计经验
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|EEFOCUS

论坛已做迁移,有相关技术资料和问题讨论可以到电路城对应版块(“模拟/电源”)
X

GMT+8, 2019-8-24 20:49 , Processed in 0.095913 second(s), 11 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表