Skip to content

Commit 4a4d739

Browse files
author
Owen
authored
PDM add example and fix a few library issues (#91)
PDM add example and fix a few library issues
2 parents 40e8e7c + 1402f85 commit 4a4d739

File tree

11 files changed

+640
-139
lines changed

11 files changed

+640
-139
lines changed

libraries/PDM/examples/Example1_MicrophoneOutput/Example1_MicrophoneOutput.ino

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

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

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

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

2626
//Math library needed for FFT
2727
#define ARM_MATH_CM4
2828
#include <arm_math.h>
2929

3030
void setup()
3131
{
32-
Serial.begin(9600);
32+
Serial.begin(115200);
3333
Serial.println("SparkFun PDM Example");
3434

35-
if (myPDM.begin() == false) // Turn on PDM with default settings
35+
if (myPDM.begin() == false) // Turn on PDM with default settings, start interrupts
3636
{
3737
Serial.println("PDM Init failed. Are you sure these pins are PDM capable?");
38-
while (1);
38+
while (1)
39+
;
3940
}
4041
Serial.println("PDM Initialized");
4142

4243
printPDMConfig();
43-
44-
myPDM.getData(pdmDataBuffer, pdmDataBufferSize); //This clears the current PDM FIFO and starts DMA
4544
}
4645

4746
void loop()
4847
{
49-
noInterrupts();
50-
5148
if (myPDM.available())
5249
{
53-
printLoudest();
54-
55-
while (PRINT_PDM_DATA || PRINT_FFT_DATA);
56-
57-
// Start converting the next set of PCM samples.
5850
myPDM.getData(pdmDataBuffer, pdmDataBufferSize);
51+
52+
printLoudest();
5953
}
6054

6155
// Go to Deep Sleep until the PDM ISR or other ISR wakes us.
6256
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
63-
64-
interrupts();
6557
}
6658

6759
//*****************************************************************************
@@ -73,7 +65,7 @@ void printLoudest(void)
7365
{
7466
float fMaxValue;
7567
uint32_t ui32MaxIndex;
76-
int16_t *pi16PDMData = (int16_t *) pdmDataBuffer;
68+
int16_t *pi16PDMData = (int16_t *)pdmDataBuffer;
7769
uint32_t ui32LoudestFrequency;
7870

7971
//
@@ -146,27 +138,49 @@ void printPDMConfig(void)
146138
//
147139
switch (myPDM.getClockDivider())
148140
{
149-
case AM_HAL_PDM_MCLKDIV_4: MClkDiv = 4; break;
150-
case AM_HAL_PDM_MCLKDIV_3: MClkDiv = 3; break;
151-
case AM_HAL_PDM_MCLKDIV_2: MClkDiv = 2; break;
152-
case AM_HAL_PDM_MCLKDIV_1: MClkDiv = 1; break;
153-
154-
default:
155-
MClkDiv = 0;
141+
case AM_HAL_PDM_MCLKDIV_4:
142+
MClkDiv = 4;
143+
break;
144+
case AM_HAL_PDM_MCLKDIV_3:
145+
MClkDiv = 3;
146+
break;
147+
case AM_HAL_PDM_MCLKDIV_2:
148+
MClkDiv = 2;
149+
break;
150+
case AM_HAL_PDM_MCLKDIV_1:
151+
MClkDiv = 1;
152+
break;
153+
154+
default:
155+
MClkDiv = 0;
156156
}
157157

158158
switch (myPDM.getClockSpeed())
159159
{
160-
case AM_HAL_PDM_CLK_12MHZ: PDMClk = 12000000; break;
161-
case AM_HAL_PDM_CLK_6MHZ: PDMClk = 6000000; break;
162-
case AM_HAL_PDM_CLK_3MHZ: PDMClk = 3000000; break;
163-
case AM_HAL_PDM_CLK_1_5MHZ: PDMClk = 1500000; break;
164-
case AM_HAL_PDM_CLK_750KHZ: PDMClk = 750000; break;
165-
case AM_HAL_PDM_CLK_375KHZ: PDMClk = 375000; break;
166-
case AM_HAL_PDM_CLK_187KHZ: PDMClk = 187000; break;
167-
168-
default:
169-
PDMClk = 0;
160+
case AM_HAL_PDM_CLK_12MHZ:
161+
PDMClk = 12000000;
162+
break;
163+
case AM_HAL_PDM_CLK_6MHZ:
164+
PDMClk = 6000000;
165+
break;
166+
case AM_HAL_PDM_CLK_3MHZ:
167+
PDMClk = 3000000;
168+
break;
169+
case AM_HAL_PDM_CLK_1_5MHZ:
170+
PDMClk = 1500000;
171+
break;
172+
case AM_HAL_PDM_CLK_750KHZ:
173+
PDMClk = 750000;
174+
break;
175+
case AM_HAL_PDM_CLK_375KHZ:
176+
PDMClk = 375000;
177+
break;
178+
case AM_HAL_PDM_CLK_187KHZ:
179+
PDMClk = 187000;
180+
break;
181+
182+
default:
183+
PDMClk = 0;
170184
}
171185

172186
//
@@ -175,7 +189,7 @@ void printPDMConfig(void)
175189
//
176190
sampleFreq = (PDMClk / (MClkDiv * 2 * myPDM.getDecimationRate()));
177191

178-
frequencyUnits = (float) sampleFreq / (float) pdmDataBufferSize;
192+
frequencyUnits = (float)sampleFreq / (float)pdmDataBufferSize;
179193

180194
Serial.printf("Settings:\n");
181195
Serial.printf("PDM Clock (Hz): %12d\n", PDMClk);

libraries/PDM/examples/Example2_ConfigureMic/Example2_ConfigureMic.ino

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

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

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

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

2525
//Math library needed for FFT
2626
#define ARM_MATH_CM4
2727
#include <arm_math.h>
2828

2929
void setup()
3030
{
31-
Serial.begin(9600);
31+
Serial.begin(115200);
3232
Serial.println("SparkFun PDM Example");
3333

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

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

5455
printPDMConfig();
55-
56-
myPDM.getData(pdmDataBuffer, pdmDataBufferSize); //This clears the current PDM FIFO and starts DMA
5756
}
5857

5958
void loop()
6059
{
61-
noInterrupts();
62-
6360
if (myPDM.available())
6461
{
65-
printLoudest();
66-
67-
while (PRINT_PDM_DATA || PRINT_FFT_DATA);
68-
69-
// Start converting the next set of PCM samples.
7062
myPDM.getData(pdmDataBuffer, pdmDataBufferSize);
63+
64+
printLoudest();
7165
}
7266

7367
// Go to Deep Sleep until the PDM ISR or other ISR wakes us.
7468
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
75-
76-
interrupts();
7769
}
7870

7971
//*****************************************************************************
@@ -85,7 +77,7 @@ void printLoudest(void)
8577
{
8678
float fMaxValue;
8779
uint32_t ui32MaxIndex;
88-
int16_t *pi16PDMData = (int16_t *) pdmDataBuffer;
80+
int16_t *pi16PDMData = (int16_t *)pdmDataBuffer;
8981
uint32_t ui32LoudestFrequency;
9082

9183
//
@@ -158,27 +150,49 @@ void printPDMConfig(void)
158150
//
159151
switch (myPDM.getClockDivider())
160152
{
161-
case AM_HAL_PDM_MCLKDIV_4: MClkDiv = 4; break;
162-
case AM_HAL_PDM_MCLKDIV_3: MClkDiv = 3; break;
163-
case AM_HAL_PDM_MCLKDIV_2: MClkDiv = 2; break;
164-
case AM_HAL_PDM_MCLKDIV_1: MClkDiv = 1; break;
165-
166-
default:
167-
MClkDiv = 0;
153+
case AM_HAL_PDM_MCLKDIV_4:
154+
MClkDiv = 4;
155+
break;
156+
case AM_HAL_PDM_MCLKDIV_3:
157+
MClkDiv = 3;
158+
break;
159+
case AM_HAL_PDM_MCLKDIV_2:
160+
MClkDiv = 2;
161+
break;
162+
case AM_HAL_PDM_MCLKDIV_1:
163+
MClkDiv = 1;
164+
break;
165+
166+
default:
167+
MClkDiv = 0;
168168
}
169169

170170
switch (myPDM.getClockSpeed())
171171
{
172-
case AM_HAL_PDM_CLK_12MHZ: PDMClk = 12000000; break;
173-
case AM_HAL_PDM_CLK_6MHZ: PDMClk = 6000000; break;
174-
case AM_HAL_PDM_CLK_3MHZ: PDMClk = 3000000; break;
175-
case AM_HAL_PDM_CLK_1_5MHZ: PDMClk = 1500000; break;
176-
case AM_HAL_PDM_CLK_750KHZ: PDMClk = 750000; break;
177-
case AM_HAL_PDM_CLK_375KHZ: PDMClk = 375000; break;
178-
case AM_HAL_PDM_CLK_187KHZ: PDMClk = 187000; break;
179-
180-
default:
181-
PDMClk = 0;
172+
case AM_HAL_PDM_CLK_12MHZ:
173+
PDMClk = 12000000;
174+
break;
175+
case AM_HAL_PDM_CLK_6MHZ:
176+
PDMClk = 6000000;
177+
break;
178+
case AM_HAL_PDM_CLK_3MHZ:
179+
PDMClk = 3000000;
180+
break;
181+
case AM_HAL_PDM_CLK_1_5MHZ:
182+
PDMClk = 1500000;
183+
break;
184+
case AM_HAL_PDM_CLK_750KHZ:
185+
PDMClk = 750000;
186+
break;
187+
case AM_HAL_PDM_CLK_375KHZ:
188+
PDMClk = 375000;
189+
break;
190+
case AM_HAL_PDM_CLK_187KHZ:
191+
PDMClk = 187000;
192+
break;
193+
194+
default:
195+
PDMClk = 0;
182196
}
183197

184198
//
@@ -187,7 +201,7 @@ void printPDMConfig(void)
187201
//
188202
sampleFreq = (PDMClk / (MClkDiv * 2 * myPDM.getDecimationRate()));
189203

190-
frequencyUnits = (float) sampleFreq / (float) pdmDataBufferSize;
204+
frequencyUnits = (float)sampleFreq / (float)pdmDataBufferSize;
191205

192206
Serial.printf("Settings:\n");
193207
Serial.printf("PDM Clock (Hz): %12d\n", PDMClk);

0 commit comments

Comments
 (0)