Skip to content

PDM add example and fix a few library issues #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Dec 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

//Global variables needed for PDM library
#define pdmDataBufferSize 4096 //Default is array of 4096 * 32bit
uint32_t pdmDataBuffer[pdmDataBufferSize];
uint16_t pdmDataBuffer[pdmDataBufferSize];

//Global variables needed for the FFT in this sketch
float g_fPDMTimeDomain[pdmDataBufferSize * 2];
Expand All @@ -21,47 +21,39 @@ uint32_t sampleFreq;
#define PRINT_FFT_DATA 0

#include <PDM.h> //Include PDM library included with the Aruino_Apollo3 core
AP3_PDM myPDM; //Create instance of PDM class
AP3_PDM myPDM; //Create instance of PDM class

//Math library needed for FFT
#define ARM_MATH_CM4
#include <arm_math.h>

void setup()
{
Serial.begin(9600);
Serial.begin(115200);
Serial.println("SparkFun PDM Example");

if (myPDM.begin() == false) // Turn on PDM with default settings
if (myPDM.begin() == false) // Turn on PDM with default settings, start interrupts
{
Serial.println("PDM Init failed. Are you sure these pins are PDM capable?");
while (1);
while (1)
;
}
Serial.println("PDM Initialized");

printPDMConfig();

myPDM.getData(pdmDataBuffer, pdmDataBufferSize); //This clears the current PDM FIFO and starts DMA
}

void loop()
{
noInterrupts();

if (myPDM.available())
{
printLoudest();

while (PRINT_PDM_DATA || PRINT_FFT_DATA);

// Start converting the next set of PCM samples.
myPDM.getData(pdmDataBuffer, pdmDataBufferSize);

printLoudest();
}

// Go to Deep Sleep until the PDM ISR or other ISR wakes us.
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);

interrupts();
}

//*****************************************************************************
Expand All @@ -73,7 +65,7 @@ void printLoudest(void)
{
float fMaxValue;
uint32_t ui32MaxIndex;
int16_t *pi16PDMData = (int16_t *) pdmDataBuffer;
int16_t *pi16PDMData = (int16_t *)pdmDataBuffer;
uint32_t ui32LoudestFrequency;

//
Expand Down Expand Up @@ -146,27 +138,49 @@ void printPDMConfig(void)
//
switch (myPDM.getClockDivider())
{
case AM_HAL_PDM_MCLKDIV_4: MClkDiv = 4; break;
case AM_HAL_PDM_MCLKDIV_3: MClkDiv = 3; break;
case AM_HAL_PDM_MCLKDIV_2: MClkDiv = 2; break;
case AM_HAL_PDM_MCLKDIV_1: MClkDiv = 1; break;

default:
MClkDiv = 0;
case AM_HAL_PDM_MCLKDIV_4:
MClkDiv = 4;
break;
case AM_HAL_PDM_MCLKDIV_3:
MClkDiv = 3;
break;
case AM_HAL_PDM_MCLKDIV_2:
MClkDiv = 2;
break;
case AM_HAL_PDM_MCLKDIV_1:
MClkDiv = 1;
break;

default:
MClkDiv = 0;
}

switch (myPDM.getClockSpeed())
{
case AM_HAL_PDM_CLK_12MHZ: PDMClk = 12000000; break;
case AM_HAL_PDM_CLK_6MHZ: PDMClk = 6000000; break;
case AM_HAL_PDM_CLK_3MHZ: PDMClk = 3000000; break;
case AM_HAL_PDM_CLK_1_5MHZ: PDMClk = 1500000; break;
case AM_HAL_PDM_CLK_750KHZ: PDMClk = 750000; break;
case AM_HAL_PDM_CLK_375KHZ: PDMClk = 375000; break;
case AM_HAL_PDM_CLK_187KHZ: PDMClk = 187000; break;

default:
PDMClk = 0;
case AM_HAL_PDM_CLK_12MHZ:
PDMClk = 12000000;
break;
case AM_HAL_PDM_CLK_6MHZ:
PDMClk = 6000000;
break;
case AM_HAL_PDM_CLK_3MHZ:
PDMClk = 3000000;
break;
case AM_HAL_PDM_CLK_1_5MHZ:
PDMClk = 1500000;
break;
case AM_HAL_PDM_CLK_750KHZ:
PDMClk = 750000;
break;
case AM_HAL_PDM_CLK_375KHZ:
PDMClk = 375000;
break;
case AM_HAL_PDM_CLK_187KHZ:
PDMClk = 187000;
break;

default:
PDMClk = 0;
}

//
Expand All @@ -175,7 +189,7 @@ void printPDMConfig(void)
//
sampleFreq = (PDMClk / (MClkDiv * 2 * myPDM.getDecimationRate()));

frequencyUnits = (float) sampleFreq / (float) pdmDataBufferSize;
frequencyUnits = (float)sampleFreq / (float)pdmDataBufferSize;

Serial.printf("Settings:\n");
Serial.printf("PDM Clock (Hz): %12d\n", PDMClk);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

//Global variables needed for PDM library
#define pdmDataBufferSize 4096 //Default is array of 4096 * 32bit
uint32_t pdmDataBuffer[pdmDataBufferSize];
uint16_t pdmDataBuffer[pdmDataBufferSize];

//Global variables needed for the FFT in this sketch
float g_fPDMTimeDomain[pdmDataBufferSize * 2];
Expand All @@ -20,15 +20,15 @@ uint32_t sampleFreq;
#define PRINT_FFT_DATA 0

#include <PDM.h> //Include PDM library included with the Aruino_Apollo3 core
AP3_PDM myPDM; //Create instance of PDM class
AP3_PDM myPDM; //Create instance of PDM class

//Math library needed for FFT
#define ARM_MATH_CM4
#include <arm_math.h>

void setup()
{
Serial.begin(9600);
Serial.begin(115200);
Serial.println("SparkFun PDM Example");

// The variant files for Artemis carrier boards have Mic data and clock pins defined
Expand All @@ -37,7 +37,8 @@ void setup()
if (myPDM.begin(22, 23) == false) //Data, clock on Artemis Nano - These are the pin names from variant file, not pad names
{
Serial.println("PDM Init failed. Are you sure these pins are PDM capable?");
while (1);
while (1)
;
}
Serial.println("PDM Initialized");

Expand All @@ -52,28 +53,19 @@ void setup()
//The equivalent getGain(), getClockSpeed(), etc are available

printPDMConfig();

myPDM.getData(pdmDataBuffer, pdmDataBufferSize); //This clears the current PDM FIFO and starts DMA
}

void loop()
{
noInterrupts();

if (myPDM.available())
{
printLoudest();

while (PRINT_PDM_DATA || PRINT_FFT_DATA);

// Start converting the next set of PCM samples.
myPDM.getData(pdmDataBuffer, pdmDataBufferSize);

printLoudest();
}

// Go to Deep Sleep until the PDM ISR or other ISR wakes us.
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);

interrupts();
}

//*****************************************************************************
Expand All @@ -85,7 +77,7 @@ void printLoudest(void)
{
float fMaxValue;
uint32_t ui32MaxIndex;
int16_t *pi16PDMData = (int16_t *) pdmDataBuffer;
int16_t *pi16PDMData = (int16_t *)pdmDataBuffer;
uint32_t ui32LoudestFrequency;

//
Expand Down Expand Up @@ -158,27 +150,49 @@ void printPDMConfig(void)
//
switch (myPDM.getClockDivider())
{
case AM_HAL_PDM_MCLKDIV_4: MClkDiv = 4; break;
case AM_HAL_PDM_MCLKDIV_3: MClkDiv = 3; break;
case AM_HAL_PDM_MCLKDIV_2: MClkDiv = 2; break;
case AM_HAL_PDM_MCLKDIV_1: MClkDiv = 1; break;

default:
MClkDiv = 0;
case AM_HAL_PDM_MCLKDIV_4:
MClkDiv = 4;
break;
case AM_HAL_PDM_MCLKDIV_3:
MClkDiv = 3;
break;
case AM_HAL_PDM_MCLKDIV_2:
MClkDiv = 2;
break;
case AM_HAL_PDM_MCLKDIV_1:
MClkDiv = 1;
break;

default:
MClkDiv = 0;
}

switch (myPDM.getClockSpeed())
{
case AM_HAL_PDM_CLK_12MHZ: PDMClk = 12000000; break;
case AM_HAL_PDM_CLK_6MHZ: PDMClk = 6000000; break;
case AM_HAL_PDM_CLK_3MHZ: PDMClk = 3000000; break;
case AM_HAL_PDM_CLK_1_5MHZ: PDMClk = 1500000; break;
case AM_HAL_PDM_CLK_750KHZ: PDMClk = 750000; break;
case AM_HAL_PDM_CLK_375KHZ: PDMClk = 375000; break;
case AM_HAL_PDM_CLK_187KHZ: PDMClk = 187000; break;

default:
PDMClk = 0;
case AM_HAL_PDM_CLK_12MHZ:
PDMClk = 12000000;
break;
case AM_HAL_PDM_CLK_6MHZ:
PDMClk = 6000000;
break;
case AM_HAL_PDM_CLK_3MHZ:
PDMClk = 3000000;
break;
case AM_HAL_PDM_CLK_1_5MHZ:
PDMClk = 1500000;
break;
case AM_HAL_PDM_CLK_750KHZ:
PDMClk = 750000;
break;
case AM_HAL_PDM_CLK_375KHZ:
PDMClk = 375000;
break;
case AM_HAL_PDM_CLK_187KHZ:
PDMClk = 187000;
break;

default:
PDMClk = 0;
}

//
Expand All @@ -187,7 +201,7 @@ void printPDMConfig(void)
//
sampleFreq = (PDMClk / (MClkDiv * 2 * myPDM.getDecimationRate()));

frequencyUnits = (float) sampleFreq / (float) pdmDataBufferSize;
frequencyUnits = (float)sampleFreq / (float)pdmDataBufferSize;

Serial.printf("Settings:\n");
Serial.printf("PDM Clock (Hz): %12d\n", PDMClk);
Expand Down
Loading