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这个千万不要忘记了。
|