【ST B-L475E-IOT01A1蓝牙Wi-Fi开发板】3-读取lis3mdl三轴磁力传感器数据判断方向
<div class='showpostmsg'> 本帖最后由 qiao--- 于 2024-3-12 16:26 编辑<p><strong><span style="font-size:18px;">1.查看原理图查看引脚</span></strong></p>
<p>开发一个新的模块时,第一步是看该传感器挂载哪个片上外设上,他的引脚是什么,如下图</p>
<p> </p>
<p> 从上图可以看到这个传感器挂载在I2C2上,引脚为PB10和PB11,接下来我们就可以用cubemx来进行配置了。</p>
<p> </p>
<p><strong><span style="font-size:18px;">2.用cubemx配置I2C2的引脚</span></strong></p>
<p> </p>
<p>然后配置I2C需要的一些参数,我这里采用默认的就行。</p>
<p> </p>
<p><strong><span style="font-size:18px;">3.移植LIS3MDLTR传感器的驱动</span></strong></p>
<p>我在网上找了一些这个传感器的启动,本次就教大家如何去移植这个驱动</p>
<p> </p>
<p>上面是我在网上找的驱动,我们直接把drvier下面的驱动添加到我们的工程里面,并新建一个应用文件</p>
<p> </p>
<p>驱动代码是使用面向对象的编程实现的,所以移植起来非常方便。</p>
<p>我们在应用里面只用复制他的example示例代码做修改。</p>
<p> </p>
<p> </p>
<p><span style="font-size:18px;"><strong>4.LIS3MDLTR传感器应用代码修改</strong></span></p>
<p>我们将他的应用代码复制到我们的文件夹下面,然后实现他设备的结构体</p>
<p> </p>
<p>这些代码是需要我们完成的,就是I2C的读取和发送函数,库文件已经帮我们实现好了,代码如下所示:</p>
<pre>
<code>static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp,
uint16_t len)
{
HAL_I2C_Mem_Write(handle, LIS3MDL_I2C_ADD_H, Reg,
I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
return 0;
}
static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp,
uint16_t len)
{
HAL_I2C_Mem_Read(handle, LIS3MDL_I2C_ADD_H, Reg,
I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
return 0;
}
/*
*Function to print messages
*/
void tx_com( uint8_t *tx_buffer, uint16_t len )
{
HAL_UART_Transmit( &huart1, tx_buffer, len, 1000 );
}</code></pre>
<p>这样读取他的三轴磁力的代码就写完了,我们打开串口看看输出的事实我们需要的</p>
<p> </p>
<p>输出正确,温度输出也在正常的范围内。</p>
<p> </p>
<p><strong><span style="font-size:18px;">5.用LIS3MDLTR传感器做方向判断</span></strong></p>
<p>用三轴磁力计可以判断方向的,我这里就以简单的东西南北方向的判断举例。我是先算出他的方向角,进而用他的方向角来判断方向,这里我们只需要取y方向的磁力和x方向的磁力的atan2值来算方向角就可以了,代码如下所示</p>
<pre>
<code>float heading = atan2(magnetic_mG, magnetic_mG);
heading = heading < 0 ? (heading + 2 * PI) : heading;
heading = heading * 180 / PI;</code></pre>
<p>然后进行判断</p>
<pre>
<code>char direction;
if ((heading >= 337.5 && heading <= 360) || (heading >= 0 && heading < 22.5)) {
sprintf(direction,"N");
} else if (heading >= 22.5 && heading < 67.5) {
sprintf(direction,"NE");
} else if (heading >= 67.5 && heading < 112.5) {
sprintf(direction,"E");
} else if (heading >= 112.5 && heading < 157.5) {
sprintf(direction,"SE");
} else if (heading >= 157.5 && heading < 202.5) {
sprintf(direction,"S");
} else if (heading >= 202.5 && heading < 247.5) {
sprintf(direction,"SW");
} else if (heading >= 247.5 && heading < 292.5) {
sprintf(direction,"W");
} else if (heading >= 292.5 && heading < 337.5) {
sprintf(direction,"NW");
}
printf("the direction is %s\r\n",direction);</code></pre>
<p> </p>
<p><strong><span style="font-size:18px;">6.验证</span></strong></p>
<p>我们打开串口助手看看方向正确与否,下面是我将板子放着不动输出的数据,可以看到后面数据是稳定的。方向是西南方</p>
<p> </p>
<p> </p>
<p><strong><span style="font-size:18px;">总结</span></strong>:通过本期测评,我读出了板载的LIS3MDLTR三轴磁力传感器,并可以读出对于开发板而言的方向。</p>
<p> </p>
<div></div>
<p> </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>
页:
[1]