<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									MFAM - Geometrics Forum				            </title>
            <link>https://www.geometrics.com/community/mfam/</link>
            <description>Geometrics Discussion Board</description>
            <language>en-US</language>
            <lastBuildDate>Fri, 22 May 2026 09:57:54 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>Teensy 4.1 with MFAM</title>
                        <link>https://www.geometrics.com/community/mfam/teensy-4-1-with-mfam/</link>
                        <pubDate>Wed, 25 Mar 2026 09:21:36 +0000</pubDate>
                        <description><![CDATA[Hi All,
&nbsp;
We are using the Teensy 4.1 as a logger (Adafruit GPS is linked with the Teensy) for the MFAM SX. Below is the code for the Arduino IDE (Teensy), for people who might find i...]]></description>
                        <content:encoded><![CDATA[<p>Hi All,</p>
<p>&nbsp;</p>
<p>We are using the Teensy 4.1 as a logger (Adafruit GPS is linked with the Teensy) for the MFAM SX. Below is the code for the Arduino IDE (Teensy), for people who might find it useful,</p>
<p>Roi</p>
<p>&nbsp;</p>
<div>
<div><span>#include</span><span> </span><span>&lt;NativeEthernet.h&gt;</span></div>
<div><span>#include</span><span> </span><span>&lt;SD.h&gt;</span></div>
<br />
<div><span>// ---- NETWORK CONFIGURATION ----</span></div>
<div><span>byte mac[] = </span><span>{</span><span> 0x</span><span>DE</span><span>, 0x</span><span>AD</span><span>, 0x</span><span>BE</span><span>, 0x</span><span>EF</span><span>, 0x</span><span>FE</span><span>, 0x</span><span>ED</span><span> </span><span>}</span><span>;</span></div>
<div><span>IPAddress </span><span>ip</span><span>(</span><span>192</span><span>, </span><span>168</span><span>, </span><span>2</span><span>, </span><span>10</span><span>)</span><span>;</span></div>
<div><span>IPAddress </span><span>mfamIP</span><span>(</span><span>192</span><span>, </span><span>168</span><span>, </span><span>2</span><span>, </span><span>2</span><span>)</span><span>;</span></div>
<div><span>uint16_t</span><span> mfamPort = </span><span>1000</span><span>;</span></div>
<br />
<div><span>EthernetClient client;</span></div>
<br />
<div><span>// ---- PACKET STRUCTURE ----</span></div>
<div><span>const</span><span> </span><span>int</span><span> PACKET_SIZE = </span><span>1380</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> SAMPLE_SIZE = </span><span>32</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> HEADER_SIZE = </span><span>16</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> NUM_SAMPLES = </span><span>40</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> SD_CHIP_SELECT = BUILTIN_SDCARD;</span></div>
<br />
<div><span>uint8_t</span><span> </span><span>buffer</span><span>;</span></div>
<div><span>int</span><span> bufferPos = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- SD CARD ----</span></div>
<div><span>File logFile;</span></div>
<div><span>bool</span><span> sdReady = </span><span>false</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> sampleCount = </span><span>0</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> fileStartTime = </span><span>0</span><span>;</span></div>
<div><span>char</span><span> </span><span>filename</span><span>;</span></div>
<br />
<div><span>// ---- AUXILIARY CHANNEL STORAGE ----</span></div>
<div><span>double</span><span> gyroX = </span><span>0</span><span>, gyroY = </span><span>0</span><span>, gyroZ = </span><span>0</span><span>, gyroT = </span><span>0</span><span>;</span></div>
<div><span>double</span><span> accelX = </span><span>0</span><span>, accelY = </span><span>0</span><span>, accelZ = </span><span>0</span><span>, accelT = </span><span>0</span><span>;</span></div>
<div><span>double</span><span> compassX = </span><span>0</span><span>, compassY = </span><span>0</span><span>, compassZ = </span><span>0</span><span>, compassT = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- GPS FROM ADAFRUIT MODULE ON SERIAL1 (Pin 0 = RX) ----</span></div>
<div><span>char</span><span> </span><span>gpsBuffer</span><span>;</span></div>
<div><span>int</span><span> gpsBufferPos = </span><span>0</span><span>;</span></div>
<div><span>char</span><span> </span><span>gpsString</span><span> = </span><span>""</span><span>;</span></div>
<div><span>char</span><span> </span><span>gpsDate</span><span> = </span><span>"00/00/00"</span><span>;</span></div>
<div><span>char</span><span> </span><span>gpsTime</span><span> = </span><span>"00:00:00.000"</span><span>;</span></div>
<div><span>bool</span><span> gpsFix = </span><span>false</span><span>;</span></div>
<div><span>uint8_t</span><span> tsStatus = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- OUTPUT CONTROL ----</span></div>
<div><span>// Set to 1 to log every sample, 10 for 100Hz, 20 for 50Hz, etc.</span></div>
<div><span>const</span><span> </span><span>int</span><span> DOWNSAMPLE_FACTOR = </span><span>1</span><span>;</span><span> // 50 Hz output</span></div>
<div><span>int</span><span> downsampleCounter = </span><span>0</span><span>;</span></div>
<br />
<div><span>// How many minutes per file. Set to 10, 20, 60, etc.</span></div>
<div><span>const</span><span> </span><span>int</span><span> FILE_MINUTES = </span><span>10</span><span>;</span></div>
<br />
<div><span>// ---- LED INDICATOR ----</span></div>
<div><span>// Off = starting up</span></div>
<div><span>// Very slow blink (every 3 sec) = connected and logging</span></div>
<div><span>// Fast blink (4/sec) = connected but no data arriving</span></div>
<div><span>// Solid on = no SD card</span></div>
<div><span>// 3 quick flashes then pause = cannot connect to MFAM</span></div>
<div><span>const</span><span> </span><span>int</span><span> LED_PIN = </span><span>13</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> lastBlinkTime = </span><span>0</span><span>;</span></div>
<div><span>bool</span><span> ledState = </span><span>false</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> lastDataTime = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- FUNCTION PROTOTYPES ----</span></div>
<div><span>void</span><span> </span><span>createNewFile</span><span>()</span><span>;</span></div>
<div><span>void</span><span> </span><span>parsePacket</span><span>(</span><span>uint8_t*</span><span> </span><span>pkt)</span><span>;</span></div>
<div><span>void</span><span> </span><span>parseAuxChannels</span><span>(</span><span>uint8_t*</span><span> </span><span>sample</span><span>, </span><span>uint16_t</span><span> </span><span>frameID)</span><span>;</span></div>
<div><span>void</span><span> </span><span>readGPS</span><span>()</span><span>;</span></div>
<div><span>void</span><span> </span><span>parseGPRMC</span><span>(</span><span>char*</span><span> </span><span>sentence)</span><span>;</span></div>
<div><span>void</span><span> </span><span>writeSample</span><span>(</span><span>unsigned</span><span> </span><span>long</span><span> </span><span>timestamp</span><span>, </span><span>uint16_t</span><span> </span><span>fiducial</span><span>, </span><span>double</span><span> </span><span>mag1</span><span>, </span><span>uint16_t</span><span> </span><span>mag1s</span><span>,</span></div>
<div><span> </span><span>double</span><span> </span><span>mag2</span><span>, </span><span>uint16_t</span><span> </span><span>mag2s</span><span>, </span><span>uint16_t</span><span> </span><span>sysStatus)</span><span>;</span></div>
<div><span>int16_t</span><span> </span><span>toSigned16</span><span>(</span><span>uint16_t</span><span> </span><span>val)</span><span>;</span></div>
<br />
<div><span>void</span><span> </span><span>createNewFile</span><span>()</span><span> </span><span>{</span></div>
<div><span> </span><span>static</span><span> </span><span>int</span><span> fileNumber = </span><span>0</span><span>;</span></div>
<div><span> // On first call, find the next available file number</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>fileNumber == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>char</span><span> </span><span>testName</span><span>;</span></div>
<div><span> </span><span>for</span><span> </span><span>(</span><span>int</span><span> i = </span><span>1</span><span>; i &lt;= </span><span>99999</span><span>; i++</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>testName, sizeof</span><span>(</span><span>testName</span><span>)</span><span>, </span><span>"MFAM_%05d.txt"</span><span>, i</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>!</span><span>SD</span><span>.</span><span>exists</span><span>(</span><span>testName</span><span>))</span><span> </span><span>{</span></div>
<div><span> fileNumber = i - </span><span>1</span><span>;</span><span> // Will be incremented below</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> fileNumber++;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>filename, sizeof</span><span>(</span><span>filename</span><span>)</span><span>, </span><span>"MFAM_%05d.txt"</span><span>, fileNumber</span><span>)</span><span>;</span></div>
<br />
<div><span> logFile = </span><span>SD</span><span>.</span><span>open</span><span>(</span><span>filename, FILE_WRITE</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>logFile</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>println</span><span>(</span><span>"Mag 1,Mag 2,Fid,SysS,Mg1S,Mg2S,Gyro X,Gyro Y,Gyro Z,Gyro T,Accel X,Accel Y,Accel Z,Accel T,CompassX,CompassY,CompassZ,Comp T,Date,Time,TS Status,GPS"</span><span>)</span><span>;</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>flush</span><span>()</span><span>;</span></div>
<div><span> fileStartTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"Logging to: "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>filename</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"ERROR: Could not create "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>filename</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>setup</span><span>()</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>begin</span><span>(</span><span>115200</span><span>)</span><span>;</span></div>
<div><span> </span><span>delay</span><span>(</span><span>2000</span><span>)</span><span>;</span></div>
<br />
<div><span> // Start GPS serial port (Adafruit Ultimate GPS defaults to 9600 baud)</span></div>
<div><span> </span><span>Serial1</span><span>.</span><span>begin</span><span>(</span><span>9600</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>pinMode</span><span>(</span><span>LED_PIN, OUTPUT</span><span>)</span><span>;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, LOW</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>memset</span><span>(</span><span>gpsString, </span><span>0</span><span>, sizeof</span><span>(</span><span>gpsString</span><span>))</span><span>;</span></div>
<br />
<div><span> // Initialize SD card</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>SD</span><span>.</span><span>begin</span><span>(</span><span>SD_CHIP_SELECT</span><span>))</span><span> </span><span>{</span></div>
<div><span> sdReady = </span><span>true</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"SD card ready."</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"WARNING: No SD card found. Serial output only."</span><span>)</span><span>;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, HIGH</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // Initialize Ethernet</span></div>
<div><span> </span><span>Ethernet</span><span>.</span><span>begin</span><span>(</span><span>mac, ip</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>Ethernet</span><span>.</span><span>hardwareStatus</span><span>()</span><span> == EthernetNoHardware</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"ERROR: No Ethernet hardware found!"</span><span>)</span><span>;</span></div>
<div><span> </span><span>while</span><span> </span><span>(</span><span>true</span><span>)</span><span> </span><span>{}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"Teensy IP: "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>Ethernet</span><span>.</span><span>localIP</span><span>())</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"Connecting to MFAM at "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>mfamIP</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>":"</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>mfamPort</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>client</span><span>.</span><span>connect</span><span>(</span><span>mfamIP, mfamPort</span><span>))</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Connected to MFAM!"</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Connection failed!"</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Waiting for GPS fix..."</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>createNewFile</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Mag 1,Mag 2,Fid,SysS,Mg1S,Mg2S,Gyro X,Gyro Y,Gyro Z,Gyro T,Accel X,Accel Y,Accel Z,Accel T,CompassX,CompassY,CompassZ,Comp T,Date,Time,TS Status,GPS"</span><span>)</span><span>;</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>loop</span><span>()</span><span> </span><span>{</span></div>
<div><span> // Always read GPS data from Serial1</span></div>
<div><span> </span><span>readGPS</span><span>()</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>!</span><span>client</span><span>.</span><span>connected</span><span>())</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Disconnected. Reconnecting..."</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady &amp;&amp; logFile</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>flush</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>for</span><span> </span><span>(</span><span>int</span><span> i = </span><span>0</span><span>; i &lt; </span><span>3</span><span>; i++</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, HIGH</span><span>)</span><span>;</span></div>
<div><span> </span><span>delay</span><span>(</span><span>100</span><span>)</span><span>;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, LOW</span><span>)</span><span>;</span></div>
<div><span> </span><span>delay</span><span>(</span><span>100</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>delay</span><span>(</span><span>1400</span><span>)</span><span>;</span></div>
<div><span> </span><span>client</span><span>.</span><span>connect</span><span>(</span><span>mfamIP, mfamPort</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>client</span><span>.</span><span>connected</span><span>())</span><span> </span><span>{</span></div>
<div><span> lastDataTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>return</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>while</span><span> </span><span>(</span><span>client</span><span>.</span><span>available</span><span>())</span><span> </span><span>{</span></div>
<div><span> </span><span>buffer</span><span> = </span><span>client</span><span>.</span><span>read</span><span>()</span><span>;</span></div>
<div><span> bufferPos++;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>bufferPos &gt;= PACKET_SIZE</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>parsePacket</span><span>(</span><span>buffer</span><span>)</span><span>;</span></div>
<div><span> bufferPos = </span><span>0</span><span>;</span></div>
<div><span> lastDataTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // LED patterns</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>millis</span><span>()</span><span> - lastDataTime &gt; </span><span>3000</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>millis</span><span>()</span><span> - lastBlinkTime &gt; </span><span>125</span><span>)</span><span> </span><span>{</span></div>
<div><span> ledState = !ledState;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, ledState ? HIGH : LOW</span><span>)</span><span>;</span></div>
<div><span> lastBlinkTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>millis</span><span>()</span><span> - lastBlinkTime &gt; </span><span>1500</span><span>)</span><span> </span><span>{</span></div>
<div><span> ledState = !ledState;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, ledState ? HIGH : LOW</span><span>)</span><span>;</span></div>
<div><span> lastBlinkTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // New file every FILE_MINUTES minutes</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady &amp;&amp; logFile &amp;&amp; </span><span>(</span><span>millis</span><span>()</span><span> - fileStartTime &gt; </span><span>(</span><span>unsigned</span><span> </span><span>long</span><span>)</span><span>FILE_MINUTES * </span><span>60</span><span>UL * </span><span>1000</span><span>UL</span><span>))</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>close</span><span>()</span><span>;</span></div>
<div><span> </span><span>createNewFile</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>// ---- GPS READING FROM ADAFRUIT MODULE ON SERIAL1 ----</span></div>
<div><span>void</span><span> </span><span>readGPS</span><span>()</span><span> </span><span>{</span></div>
<div><span> </span><span>while</span><span> </span><span>(</span><span>Serial1</span><span>.</span><span>available</span><span>())</span><span> </span><span>{</span></div>
<div><span> </span><span>char</span><span> c = </span><span>Serial1</span><span>.</span><span>read</span><span>()</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>c == </span><span>'$'</span><span>)</span><span> </span><span>{</span></div>
<div><span> gpsBufferPos = </span><span>0</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>gpsBufferPos &lt; </span><span>(</span><span>int</span><span>)</span><span>sizeof</span><span>(</span><span>gpsBuffer</span><span>)</span><span> - </span><span>1</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>gpsBuffer</span><span> = c;</span></div>
<div><span> gpsBufferPos++;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>c == </span><span>'</span><span>\n</span><span>'</span><span> || c == </span><span>'</span><span>\r</span><span>'</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>gpsBuffer</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>strncmp</span><span>(</span><span>gpsBuffer, </span><span>"$GPRMC"</span><span>, </span><span>6</span><span>)</span><span> == </span><span>0</span><span> || </span><span>strncmp</span><span>(</span><span>gpsBuffer, </span><span>"$GNRMC"</span><span>, </span><span>6</span><span>)</span><span> == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> // Save full sentence for logging</span></div>
<div><span> </span><span>strncpy</span><span>(</span><span>gpsString, gpsBuffer, sizeof</span><span>(</span><span>gpsString</span><span>)</span><span> - </span><span>1</span><span>)</span><span>;</span></div>
<div><span> </span><span>gpsString</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<br />
<div><span> // Remove trailing newline/carriage return</span></div>
<div><span> </span><span>int</span><span> slen = </span><span>strlen</span><span>(</span><span>gpsString</span><span>)</span><span>;</span></div>
<div><span> </span><span>while</span><span> </span><span>(</span><span>slen &gt; </span><span>0</span><span> &amp;&amp; </span><span>(</span><span>gpsString</span><span> == </span><span>'</span><span>\n</span><span>'</span><span> || </span><span>gpsString</span><span> == </span><span>'</span><span>\r</span><span>'</span><span>))</span><span> </span><span>{</span></div>
<div><span> </span><span>gpsString</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<div><span> slen--;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>parseGPRMC</span><span>(</span><span>gpsBuffer</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> gpsBufferPos = </span><span>0</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>parseGPRMC</span><span>(</span><span>char*</span><span> </span><span>sentence)</span><span> </span><span>{</span></div>
<div><span> // $GPRMC,HHMMSS.sss,A,lat,N,lon,W,speed,course,DDMMYY,...</span></div>
<div><span> </span><span>char</span><span> </span><span>copy</span><span>;</span></div>
<div><span> </span><span>strncpy</span><span>(</span><span>copy, sentence, sizeof</span><span>(</span><span>copy</span><span>)</span><span> - </span><span>1</span><span>)</span><span>;</span></div>
<div><span> </span><span>copy</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<br />
<div><span> </span><span>char</span><span>* token = </span><span>strtok</span><span>(</span><span>copy, </span><span>","</span><span>)</span><span>;</span></div>
<div><span> </span><span>int</span><span> field = </span><span>0</span><span>;</span></div>
<br />
<div><span> </span><span>while</span><span> </span><span>(</span><span>token != </span><span>NULL</span><span> &amp;&amp; field &lt; </span><span>10</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>switch</span><span> </span><span>(</span><span>field</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>case</span><span> </span><span>1</span><span>:</span><span> // Time</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>strlen</span><span>(</span><span>token</span><span>)</span><span> &gt;= </span><span>6</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>gpsTime, sizeof</span><span>(</span><span>gpsTime</span><span>)</span><span>, </span><span>"%c%c:%c%c:%s"</span><span>,</span></div>
<div><span> </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, token + </span><span>4</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>2</span><span>:</span><span> // Fix status</span></div>
<div><span> gpsFix = </span><span>(</span><span>token</span><span> == </span><span>'A'</span><span>)</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>9</span><span>:</span><span> // Date</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>strlen</span><span>(</span><span>token</span><span>)</span><span> &gt;= </span><span>6</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>gpsDate, sizeof</span><span>(</span><span>gpsDate</span><span>)</span><span>, </span><span>"%c%c/%c%c/%c%c"</span><span>,</span></div>
<div><span> </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span></span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> token = </span><span>strtok</span><span>(</span><span>NULL</span><span>, </span><span>","</span><span>)</span><span>;</span></div>
<div><span> field++;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // Update GPS bits of tsStatus</span></div>
<div><span> tsStatus = </span><span>(</span><span>tsStatus &amp; 0x</span><span>0C</span><span>)</span><span>;</span><span> // Keep MFAM PPS bits (3,2)</span></div>
<div><span> tsStatus |= 0x</span><span>01</span><span>;</span><span> // Bit 0: RMC sentence received</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>gpsFix</span><span>)</span><span> </span><span>{</span></div>
<div><span> tsStatus |= 0x</span><span>02</span><span>;</span><span> // Bit 1: GPS fix valid</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>// ---- MFAM DATA PARSING ----</span></div>
<div><span>int16_t</span><span> </span><span>toSigned16</span><span>(</span><span>uint16_t</span><span> </span><span>val)</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>val &gt; </span><span>32767</span><span>)</span><span> </span><span>return</span><span> </span><span>(</span><span>int16_t</span><span>)(</span><span>val - </span><span>65536</span><span>)</span><span>;</span></div>
<div><span> </span><span>return</span><span> </span><span>(</span><span>int16_t</span><span>)</span><span>val;</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>parseAuxChannels</span><span>(</span><span>uint8_t*</span><span> </span><span>sample</span><span>, </span><span>uint16_t</span><span> </span><span>frameID)</span><span> </span><span>{</span></div>
<div><span> </span><span>uint8_t</span><span> auxID = </span><span>(</span><span>frameID &gt;&gt; </span><span>11</span><span>)</span><span> &amp; 0x</span><span>07</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> aux0 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> aux1 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> aux2 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> aux3 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>switch</span><span> </span><span>(</span><span>auxID</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>case</span><span> </span><span>1</span><span>:</span></div>
<div><span> compassX = </span><span>toSigned16</span><span>(</span><span>aux0</span><span>)</span><span> / </span><span>0.01333333</span><span>;</span></div>
<div><span> compassY = </span><span>toSigned16</span><span>(</span><span>aux1</span><span>)</span><span> / </span><span>0.01333333</span><span>;</span></div>
<div><span> compassZ = </span><span>toSigned16</span><span>(</span><span>aux2</span><span>)</span><span> / </span><span>0.01333333</span><span>;</span></div>
<div><span> compassT = </span><span>toSigned16</span><span>(</span><span>aux3</span><span>)</span><span> / </span><span>128.0</span><span> + </span><span>25.0</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>2</span><span>:</span></div>
<div><span> gyroX = </span><span>toSigned16</span><span>(</span><span>aux0</span><span>)</span><span> / </span><span>16.384</span><span>;</span></div>
<div><span> gyroY = </span><span>toSigned16</span><span>(</span><span>aux1</span><span>)</span><span> / </span><span>16.384</span><span>;</span></div>
<div><span> gyroZ = </span><span>toSigned16</span><span>(</span><span>aux2</span><span>)</span><span> / </span><span>16.384</span><span>;</span></div>
<div><span> gyroT = </span><span>toSigned16</span><span>(</span><span>aux3</span><span>)</span><span> / </span><span>512.0</span><span> + </span><span>23.0</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>4</span><span>:</span></div>
<div><span> accelX = </span><span>toSigned16</span><span>(</span><span>aux0</span><span>)</span><span> / </span><span>16384.0</span><span>;</span></div>
<div><span> accelY = </span><span>toSigned16</span><span>(</span><span>aux1</span><span>)</span><span> / </span><span>16384.0</span><span>;</span></div>
<div><span> accelZ = </span><span>toSigned16</span><span>(</span><span>aux2</span><span>)</span><span> / </span><span>16384.0</span><span>;</span></div>
<div><span> accelT = </span><span>toSigned16</span><span>(</span><span>aux3</span><span>)</span><span> / </span><span>512.0</span><span> + </span><span>23.0</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>default</span><span>:</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>writeSample</span><span>(</span><span>unsigned</span><span> </span><span>long</span><span> </span><span>timestamp</span><span>, </span><span>uint16_t</span><span> </span><span>fiducial</span><span>, </span><span>double</span><span> </span><span>mag1</span><span>, </span><span>uint16_t</span><span> </span><span>mag1s</span><span>,</span></div>
<div><span> </span><span>double</span><span> </span><span>mag2</span><span>, </span><span>uint16_t</span><span> </span><span>mag2s</span><span>, </span><span>uint16_t</span><span> </span><span>sysStatus)</span><span> </span><span>{</span></div>
<br />
<div><span> </span><span>char</span><span> </span><span>tsStr</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>tsStr, sizeof</span><span>(</span><span>tsStr</span><span>)</span><span>, </span><span>"%d%d%d%d%d%d%d%d"</span><span>,</span></div>
<div><span> </span><span>(</span><span>tsStatus &gt;&gt; </span><span>7</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>6</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>5</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>4</span><span>)</span><span> &amp; </span><span>1</span><span>,</span></div>
<div><span> </span><span>(</span><span>tsStatus &gt;&gt; </span><span>3</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>2</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>1</span><span>)</span><span> &amp; </span><span>1</span><span>, tsStatus &amp; </span><span>1</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>char</span><span> </span><span>sysHex</span><span>, </span><span>m1sHex</span><span>, </span><span>m2sHex</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>sysHex, sizeof</span><span>(</span><span>sysHex</span><span>)</span><span>, </span><span>"%04X"</span><span>, sysStatus</span><span>)</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>m1sHex, sizeof</span><span>(</span><span>m1sHex</span><span>)</span><span>, </span><span>"%04X"</span><span>, mag1s</span><span>)</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>m2sHex, sizeof</span><span>(</span><span>m2sHex</span><span>)</span><span>, </span><span>"%04X"</span><span>, mag2s</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>char</span><span> </span><span>line</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>line, sizeof</span><span>(</span><span>line</span><span>)</span><span>,</span></div>
<div><span> </span><span>"%10.4f,%10.4f,%4d,%s,%s,%s,%10.2f,%10.2f,%10.2f,%5.1f,%8.5f,%8.5f,%8.5f,%5.1f,%8.1f,%8.1f,%8.1f,%5.1f,%s,%s,%s,%s"</span><span>,</span></div>
<div><span> mag1, mag2, fiducial, sysHex, m1sHex, m2sHex,</span></div>
<div><span> gyroX, gyroY, gyroZ, gyroT,</span></div>
<div><span> accelX, accelY, accelZ, accelT,</span></div>
<div><span> compassX, compassY, compassZ, compassT,</span></div>
<div><span> gpsDate, gpsTime, tsStr, gpsString</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady &amp;&amp; logFile</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>println</span><span>(</span><span>line</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sampleCount % </span><span>1000</span><span> == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>flush</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>sampleCount % </span><span>500</span><span> == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>line</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>parsePacket</span><span>(</span><span>uint8_t*</span><span> </span><span>pkt)</span><span> </span><span>{</span></div>
<div><span> // Get PPS bits from MFAM system status</span></div>
<div><span> </span><span>uint16_t</span><span> firstSysStatus = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint8_t</span><span> mfamPPSbits = </span><span>(</span><span>firstSysStatus &gt;&gt; </span><span>12</span><span>)</span><span> &amp; 0x</span><span>0C</span><span>;</span></div>
<div><span> tsStatus = </span><span>(</span><span>tsStatus &amp; 0x</span><span>03</span><span>)</span><span> | mfamPPSbits;</span></div>
<br />
<div><span> </span><span>for</span><span> </span><span>(</span><span>int</span><span> i = </span><span>0</span><span>; i &lt; NUM_SAMPLES; i++</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>int</span><span> offset = HEADER_SIZE + </span><span>(</span><span>i * SAMPLE_SIZE</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> frameID = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> fiducial = frameID &amp; 0x</span><span>07FF</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> sysStatus = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>uint32_t</span><span> mag1raw = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span> |</span></div>
<div><span> </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>16</span><span>)</span><span> | </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>24</span><span>)</span><span>;</span></div>
<div><span> </span><span>double</span><span> mag1 = mag1raw * </span><span>0.05</span><span> / </span><span>1000.0</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> mag1status = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>uint32_t</span><span> mag2raw = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span> |</span></div>
<div><span> </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>16</span><span>)</span><span> | </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>24</span><span>)</span><span>;</span></div>
<div><span> </span><span>double</span><span> mag2 = mag2raw * </span><span>0.05</span><span> / </span><span>1000.0</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> mag2status = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>parseAuxChannels</span><span>(</span><span>pkt + offset, frameID</span><span>)</span><span>;</span></div>
<br />
<div><span> sampleCount++;</span></div>
<div><span> downsampleCounter++;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>downsampleCounter &gt;= DOWNSAMPLE_FACTOR</span><span>)</span><span> </span><span>{</span></div>
<div><span> downsampleCounter = </span><span>0</span><span>;</span></div>
<div><span> </span><span>writeSample</span><span>(</span><span>millis</span><span>()</span><span>, fiducial, mag1, mag1status, mag2, mag2status, sysStatus</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
</div>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/mfam/">MFAM</category>                        <dc:creator>Roi Granot</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/mfam/teensy-4-1-with-mfam/</guid>
                    </item>
				                    <item>
                        <title>1000 Hz Sample Rate and Powerline Variations</title>
                        <link>https://www.geometrics.com/community/mfam/1000-hz-sample-rate-and-powerline-variations/</link>
                        <pubDate>Wed, 09 Aug 2023 21:10:08 +0000</pubDate>
                        <description><![CDATA[The MFAM Magnetometer samples at 1000 Hz, which in turns captures a lot of unique waveforms. When viewing the data raw, it can therefore appear to be a bit noisy. But a closer examination of...]]></description>
                        <content:encoded><![CDATA[<p>The <a href="https://www.geometrics.com/product/mfam-developer-kit/" target="_blank">MFAM Magnetometer</a> samples at 1000 Hz, which in turns captures a lot of unique waveforms. When viewing the data raw, it can therefore appear to be a bit noisy. But a closer examination of the data will reveal a real variation of the magnetic field which is caused caused by the power distribution network. Proper filtering is required to reduce the power line caused variations and reveal the strong signal of interest.</p>

<img width="800" align="middle" src="https://www.geometrics.com/wp-content/uploads/2021/03/1kHz_vs_10Hz.png" alt="">
<br></br>

<p>It is not obvious that 60 or 50 hertz electromagnetic radiation is real, since in ordinary experience any power line “noise” is electrostatically coupled into a system (think 60 hertz hum on a stereo system) and is a fault that needs to be fixed. In this case however the variation in the magnetic field is induced by the power grid and is real. The magnetometer is simply and dutifully reporting the variation.</p>

<p>These power line variations are to some extent present everywhere – even miles from the nearest power line. But obviously being close to power lines will increase the amplitude of the variations a lot. Often on a MagArrow survey the power line variations will be larger at one end of the survey area than the other. Poking in the GPS coordinates at the survey area nearest the larger variations into Google Earth will usually reveal the power lines from an aerial view – even if they are not visible on the ground.</p>

<p>After applying a Fourier Frequency Transform on the MFAM data to identify the noise sources, 50 and 60 Hz noise amplitudes are easily observed. Also observable is the likely to be 20.8 Hz Schumann resonance of the third node and some other ultra-low frequency electro magnetic radiation produced naturally by the Earth. Harmonics of 60 Hz are also present.</p>

<img width="600" align="middle" src="https://www.geometrics.com/wp-content/uploads/2021/03/psd.png" alt="">
<br></br>

<p>Another common question is “Why is the power line variations not a sine wave like the power line voltage?”  Remember that voltages do not make magnetic fields. Only current generates magnetic fields, and the current being drawn is not a sine wave at all. Many loads, for example, only draw current at the voltage peaks. This makes for a non-sinusoidal magnetic field that is rich in harmonics. Also note that most power distribution system use a 3 phase topology. The ripple current in such a system will be 150 or 180 Hz. Thus you will often see large peaks in the power spectrum at these frequencies and their harmonics.</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/mfam/">MFAM</category>                        <dc:creator>Gretchen Schmauder</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/mfam/1000-hz-sample-rate-and-powerline-variations/</guid>
                    </item>
				                    <item>
                        <title>What are the differences between the standard MFAM and SX Versions</title>
                        <link>https://www.geometrics.com/community/mfam/what-are-the-differences-between-the-standard-mfam-and-sx-versions/</link>
                        <pubDate>Wed, 09 Aug 2023 21:08:01 +0000</pubDate>
                        <description><![CDATA[The only difference between the standard and SX version is the sensitivity is 4pT/rt-Hz and 20 pT/rt-Hz respectively. 
 
Here is an expected response with the magnetometer moving past a ge...]]></description>
                        <content:encoded><![CDATA[<p>The only difference between the standard and SX version is the sensitivity is 4pT/rt-Hz and 20 pT/rt-Hz respectively.</p> 
 
<p>Here is an expected response with the magnetometer moving past a generic magnetic projectile:</p>
 
<img width="800" align="middle" src="https://www.geometrics.com/wp-content/uploads/2021/03/MFAM-vs-SX-1.png" alt="">
<br></br>

<p>In this case the amplitude is about 2nT in total from peak to peak. The feature itself is quite distinguishable. This is assuming there is no noise in the system. Here is what the data looks like with 4pT/rt-Hz noise:</p>

<img width="800" align="middle" src="https://www.geometrics.com/wp-content/uploads/2021/03/MFAM-vs-SX-2.png" alt="">
<br></br>

<p>You can see the general structure is still there but there is a little more wiggle on the trace that is associated with the noise of the system. Here is the data with 20 pT/rt-Hz noise:</p>
 
<img width="800" align="middle" src="https://www.geometrics.com/wp-content/uploads/2021/03/MFAM-vs-SX-3.png" alt="">
<br></br>

<p>Again, here the structure is generally there but the data looks quite a bit noisier. So for smaller targets or more subtle anomalies they can be obscured or missed entirely.</p>

<p>To understand this concept better, you can use the <a href="https://www.geomatrix.co.uk/tools/gradient-calculator" target="_blank">magnetic gradient tool</a> developed by our partner in the UK, <a href="https://www.geomatrix.co.uk/" target="_blank">Geomatrix Earth Science</a>.</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/mfam/">MFAM</category>                        <dc:creator>Gretchen Schmauder</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/mfam/what-are-the-differences-between-the-standard-mfam-and-sx-versions/</guid>
                    </item>
							        </channel>
        </rss>
		