疯壳AI开源无人机SPI(六轴传感器数据获取)
<div class='showpostmsg'> 本帖最后由 fengke 于 2021-3-30 11:42 编辑<p>一、ICM20602简介</p>
<p> 六轴传感器在当今智能穿戴和定位导航产品中被广泛应用,而六轴传感器中做的最好的要属InvenSense公司的产品了,ICM20602便是其推出的优秀六轴传感器之一。</p>
<p>ICM20602集成3轴加速度计和3轴陀螺仪,其中陀螺仪量程范围可以选择+/-250dps,+/-500dps,+/-1000dps和+/-2000dps这四种,而加速度计量程范围可选择+/-2g,+/-4g,+/-8g和+/-16g四种。</p>
<p>ICM20602支持高达400KHz的I<sup>2</sup>C以及高达10MHz的SPI,具有较高的接口兼容性。</p>
<p>ICM20602的实物图如下所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587886988586671.png" title="1587886988586671.png" /></p>
<p>ICM20602的引脚如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587886999574073.png" title="1587886999574073.png" /></p>
<p>二、SPI概述</p>
<p>SPI是指Serial Peripheral Interface的缩写,即串行外围设备接口,是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的引脚,SPI的4条通信线为:</p>
<p>(1)MISO主入从出接口;</p>
<p>(2)MOSI主出从入接口;</p>
<p>(3)SCLK由主设备产生的时钟信号;</p>
<p>(4)CS由主设备控制的从设备片选信号。</p>
<p>STM32F103的SPI的时钟最高可达18MHz,支持DMA。</p>
<p>SPI主从机通信,如下图所示:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887011176453.png" title="1587887011176453.png" /></p>
<p>当有多个设备挂载在SPI总线上,其接线图如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887024223278.png" title="1587887024223278.png" /></p>
<p>单片机和外围器件之间进行SPI同步串行数据传输时,在主器件的移位脉冲下,数据按位传输,低位在前,高位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbp,相比于其它总线,SPI协议简单,相对数据速率高,但是SPI也有它的缺点,比如没有指定的流控制,没有应答机制确认是否接收到数据。</p>
<p> </p>
<p>三、SPI总线协议</p>
<p>SPI通信需要掌握以下知识: 时钟极性、时钟相位以及SPI的传输时序。</p>
<p>(1)时钟极性,SPI通过时钟极性(CPOL)来决定在总线空闲时,同步时钟(SCLK)信号线的电平是高电平还是低电平。当时钟极性为0时(CPOL=0),SCLK信号线在空闲时为低电平;当时钟极性为1时(CPOL=1),SCLK信号线在空闲时为高电平;</p>
<p>(2)时钟相位,SPI通过时钟相位(CPHA)用来决定何时进行信号采样。当时钟相位为1时(CPHA=1),在SCK信号线的第二个跳变沿进行采样;这里的跳变沿究竟是上升沿还是下降沿?这取决于时钟的极性。当时钟极性为0时,取下降沿;当时钟极性为1时,取上升沿;如下图所示:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887044815669.png" title="1587887044815669.png" /></p>
<p>当时钟相位为0时(CPHA=0),在SCK信号线的第一个跳变沿进行采样。跳变沿同样与时钟极性有关:当时钟极性为0时,取上升沿;当时钟极性为1时,取下降沿;如下图所示:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887055588380.png" title="1587887055588380.png" /></p>
<p> </p>
<p>四、 SPI寄存器</p>
<p>在本次实验中使用到的是STM32的硬件SPI,STM32的硬件SPI所涉及的寄存器较多,这里挑选较为重要的来讲解。</p>
<p>(1)SPI_CR1:SPI控制寄存器1,如下图所示:</p>
<p>其中SPE为SPI使能控制位,等于1时使能SPI,等于0时关闭SPI;BR为SPI的波特率控制位,BR等于000则波特率为f<sub>PCLK</sub>/2,等于001则波特率为f<sub>PCLK</sub>/4,等于010则波特率为f<sub>PCLK</sub>/8,等于011则波特率为f<sub>PCLK</sub>/16,等于100则波特率为f<sub>PCLK</sub>/32,等于101则波特率为f<sub>PCLK</sub>/64,等于110则波特率为f<sub>PCLK</sub>/128,等于111则波特率为f<sub>PCLK</sub>/256;MSTR为SPI主从模式选择位,等于0时为从模式,等于1时为主模式;CPOL为SPI时钟极性设置位,为0则空闲时钟为低电平,为1则空闲时钟为高电平;CPHA为SPI时钟相位设置位,等于0时,在第一个时钟跳边沿开始采集,等于1时,在第2个时钟跳边沿开始采集。</p>
<p>(2)SPI_SR:SPI状态寄存器,如下图所示:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887078632515.png" title="1587887078632515.png" /></p>
<p>其中TXE是发送缓冲区状态位,该位为0时发送缓冲区非空,为1时发送缓冲区为空;RXNE为接收缓冲区状态位,该位为0时接收缓冲区为空,该位为1时,接收缓冲区为非空。</p>
<p>(3)SPI_DR:SPI数据寄存器,用于存储接收或者发送的数据。SPI_DR的描述如下图所示:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887088253717.png" title="1587887088253717.png" /></p>
<p>其中DR存放SPI数据。</p>
<p>五、六轴传感器数据获取实验</p>
<p>六轴传感器数据获取实验使用STM32的硬件SPI与六轴传感器ICM20602相连接,串口1即UART1,通过USB转串口模块连接电脑,把SPI获取到的六轴数据通过串口1传输到电脑端的串口调试助手显示出来。做该实验的时候需要把视觉模组暂时取下,并且把USB转串口的线接到视觉模组接口处。六轴传感器ICM20602在无人机顶部的白色RGB彩灯盒里,通过软排把SPI及供电口接出,如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887099138815.png" title="1587887099138815.png" /></p>
<p>根据原理图,可以看到ICM20602的的SPI接口分别是:PB13、PA5、PA6、PA7,如下图所示。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887110124167.png" title="1587887110124167.png" /><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887115857116.png" title="1587887115857116.png" /></p>
<p>串口1的配置可以参考《串口(基础收发),配置代码(通过调用官方库)</p>
<p>获取ICM20602的数据代码编写的思路如下:</p>
<p> </p>
<p>代码思路</p>
<table>
<tbody>
<tr>
<td width="63">
<p>1</p>
</td>
<td width="134">
<p>管脚配置</p>
</td>
<td width="240">
<p>1、定义结构体;</p>
<p>2、使能时钟;</p>
<p>3、填充结构体;</p>
<p>4、装载结构体。</p>
</td>
</tr>
<tr>
<td width="63">
<p>2</p>
</td>
<td width="134">
<p>SPI配置</p>
</td>
<td width="240">
<p>1、定义结构体;</p>
<p>2、使能时钟;</p>
<p>3、填充结构体;</p>
<p>4、装载结构体;</p>
<p>5、使能SPI。</p>
</td>
</tr>
<tr>
<td width="63">
<p>3</p>
</td>
<td width="134">
<p>SPI读写逻辑</p>
</td>
<td width="240">
<p>1、读一个字节;</p>
<p>2、写一个字节。</p>
</td>
</tr>
<tr>
<td width="63">
<p>4</p>
</td>
<td width="134">
<p>ICM20602驱动</p>
</td>
<td width="240">
<p>1、从传感器读;</p>
<p>2、从传感器写;</p>
<p>3、ICM20602初始化。</p>
</td>
</tr>
</tbody>
</table>
<p>SPI初始化代码如下:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887126655961.png" title="1587887126655961.png" /></p>
<p>SPI的读写代码如下。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887139708202.png" title="1587887139708202.png" /></p>
<p>ICM20602的初始化代码如下。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887163163984.png" title="1587887163163984.png" /></p>
<p>ICM20602的读写代码如下。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887174571349.png" title="1587887174571349.png" /></p>
<p>这里注意要把串口的发送也配置好,这样才能把数据发送到电脑。串口1通过USB转串口模块接到电脑,获取ICM20602代码如下。</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887184474316.png" title="1587887184474316.png" /></p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887188261978.png" title="1587887188261978.png" /></p>
<p>保存、编译、下载代码,可以看到USB转串口模块在不断地打印ICM20602的X轴加速度高8位,数据如下图所示:</p>
<p><img alt="image.png" src="http://uphotos.eepw.com.cn/1497260930/pics/1587887201655782.png" title="1587887201655782.png" /></p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>疯壳AI开源无人机 感谢楼主的整个xi整个系列系统性分享 谢谢</p>
页:
[1]