<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=19684&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-11-24T22:41:01+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19684&amp;mode</id>
<entry>
<author><name><![CDATA[wooojtekk]]></name></author>
<updated>2017-11-24T22:41:01+01:00</updated>
<published>2017-11-24T22:41:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19684&amp;p=199510#p199510</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19684&amp;p=199510#p199510"/>
<title type="html"><![CDATA[Obsługa magnetometru HMC5883L]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19684&amp;p=199510#p199510"><![CDATA[
Witajcie forumowicze  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />  Poszukuję pomocy w obsłudze magnetometru HMC5883L. Mianowicie, chcę na podstawie danych z magnetometru wyznaczyć kąt obrotu z kompensacją przechyleń, wykorzystując dodatkowo układ MPU6050. Udało mi się odczytać dane z obu czujników, jak i obliczyć kąt obrotu bez kompensacji. Natomiast, gdy próbuję obliczyć kąt obrotu z kompensacją to nie wychodzi. Gdy czujnik nie jest przechylany to obliczona wartość kąta jest taka sama jak ta, obliczona bez kompensacji. Jeżeli czujnik przechylę, to obliczona wartość kąta z kompensacją &quot;ucieka&quot;. Męczę się z tym problemem już 2 tygodnie i nadal nic. Może ktoś z was mógłby mi pomóc?  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Układ realizowany jest na uC Atmega8.  Poniżej przedstawiam funkcję odpowiedzialną za obliczanie kąta obrotu.<br /><br />[syntax=c]void calib_hmc5883l(void){<br /><br />//------- Kalibracja magnetometru HMC5883L ------------<br /><br />if (mx&lt;kalib.min_mx) kalib.min_mx=mx;<br />if (kalib.max_mx&lt;mx) kalib.max_mx=mx;<br /><br />if (my&lt;kalib.min_my) kalib.min_my=my;<br />if (kalib.max_my&lt;my) kalib.max_my=my;<br /><br />if (mz&lt;kalib.min_mz) kalib.min_mz=mz;<br />if (kalib.max_mz&lt;mz) kalib.max_mz=mz;<br /><br />kalib.mx_off = (kalib.max_mx + kalib.min_mx)/2;<br />kalib.my_off = (kalib.max_my + kalib.min_my)/2;<br />kalib.mz_off = (kalib.max_mz + kalib.min_mz)/2;<br /><br />//------- Wyrażenie wartości w mG ------------------------------<br />kalib.norm_mx = (mx - kalib.mx_off)*0.00092;<br />kalib.norm_my = (my - kalib.my_off)*0.00092;<br />kalib.norm_mz = (mz - kalib.mz_off)*0.00092;<br /><br /><br />//-----------obliczenie kąta obrotu bez kompensacji - yaw-----------<br /><br />yaw = atan2(kalib.norm_my,kalib.norm_mx)*180/M_PI;<br /><br />//-----------obliczenie kąta obrotu z kompensacją - yaw2  -----------<br /><br />// wartośc kąta roll i pitch obliczona na podstawie danych z akcelerometru<br />// roll = ((atan2(ay,az))*180/M_PI); <br />// pitch = -(atan2(ax,sqrt(ay*ay + az*az))*180)/M_PI;<br /><br />sinroll = sin(roll*M_PI/180);//wyznaczenie sin(roll),<br />cosroll = cos(roll*M_PI/180);//wyznaczenie cos(roll),<br />sinpitch = sin(pitch*M_PI/180);//wyznaczenie sin(pitch),<br />cospitch = cos(pitch*M_PI/180);//wyznaczenie cos(pitch),<br /><br />yaw2 = atan2(kalib.mx_off*sinroll*sinpitch + kalib.my_off*cosroll - kalib.mz_off*sinroll*cospitch,kalib.mx_off*cospitch + kalib.mz_off*sinpitch)*180/M_PI;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12652">wooojtekk</a> — 24 lis 2017, o 22:41</p><hr />
]]></content>
</entry>
</feed>