查看: 5146|回复: 10

Stm32 AS5045 DMA 中断 编程 烧录

[复制链接]

主题

好友

0

积分

白丁

该用户从未签到

发表于 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

积分

白丁

该用户从未签到

发表于 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

积分

白丁

该用户从未签到

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

使用道具 举报

主题

好友

10

积分

白丁

该用户从未签到

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

使用道具 举报

主题

好友

703

积分

举人

该用户从未签到

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

使用道具 举报

主题

好友

459

积分

秀才

该用户从未签到

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

使用道具 举报

主题

好友

15

积分

白丁

该用户从未签到

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

使用道具 举报

主题

好友

1

积分

白丁

该用户从未签到

发表于 2015-5-27 23:31:44 |显示全部楼层
                厉           害
回复

使用道具 举报

主题

好友

1万

积分

翰林

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2237 天

    连续签到: 4 天

    [LV.Master]伴坛终老

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

    使用道具 举报

    主题

    好友

    805

    积分

    举人

  • TA的每日心情
    奋斗
    2017-12-1 14:21
  • 签到天数: 91 天

    连续签到: 1 天

    [LV.6]常住居民II

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

    使用道具 举报

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

    关闭

    站长推荐上一条 /5 下一条

    手机版|电路城

    GMT+8, 2019-9-18 05:19 , Processed in 0.139496 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部