47-MP45DT02-Library (STM32F4)

Mit dieser Library kann das MEMS-Micro (MP45DT02) vom Discovery-Board benutzt werden um Sound aufzunehmen und als WAV-File auf einer SD-Karte zu speichern.

Die Samplerate ist auf 16kHz und 16bit eingestellt. Wobei die Abtastrate vom Micro bei 64kHz liegt, die Werte aber noch gefiltert werden.

Der benutzte Software Filter ist von STM und liegt nur als compilierte Library vor. Dieses File muss aus dem Grund in der CoIDE im Linker hinzugefügt werden.

Hinweis : Der I2S-Clock und der notwendige PLL muss nicht im “system_stm32f4xx.c-File” eingestellt werden, das wird von der Library erledigt.

Bei meinen Test war die Aufnahmequalität sehr schlecht, ich hatte aber keine Lust da noch viel Zeit zu investieren.

Theoretisch können die Daten auch im RAM oder auf USB gespeichert, wer das will.

Wegen dem speichern auf SD-Karte wird die FATFS-Lib benutzt.

Benutzte Pins :

1
2
PB10 = Clock
PC3  = Data

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : SPI, MISC
Benutzte Librarys : STM32_UB_FATFS

Enumerationen :

1
2
3
4
5
typedef enum {
  MP45DT02_REC_OK = 0,
  MP45DT02_INIT_ERR,
  MP45DT02_FILE_ERR
}MP45DT02_ERR_t;

Funktionen :

1
2
3
4
ErrorStatus UB_MP45DT02_Init(void);                        // zum initialisieren vom MP45DT02
MP45DT02_ERR_t UB_MP45DT02_RecordStart(const char* name);  // zum starten der Aufnahme
void UB_MP45DT02_RecordLoop(void);                         // muss zyklisch aufgerufen werden
void UB_MP45DT02_RecordStop(void);                         // zum beenden der Aufnahme

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//--------------------------------------------------------------
// File     : main.c
// Datum    : 15.06.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der MP45DT02-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_mp45dt02.h"
#include "stm32_ub_led.h"
 
int main(void)
{
  uint32_t n,m;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  UB_Led_Init(); // Init der LEDs
  UB_MP45DT02_Init();  // Init vom MP45DT02
  UB_Fatfs_Init(); // Init vom FATFS-System
 
  // Test ob SD-Karte eingelegt
  if(UB_Fatfs_CheckMedia(MMC_0)==FATFS_OK) {
    // Karte mounten
    if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
      UB_Led_On(LED_GREEN);
 
      // File anlegen und Aufnahme starten
      UB_MP45DT02_RecordStart("test16k.wav");
 
      // ein paar Sekunden aufnehmen
      for(n=0;n<10;n++) {
        UB_Led_Toggle(LED_BLUE);
        for(m=0;m<500000;m++) {
          // Loop-Funktion aufrufen !! WICHTIG !!
          UB_MP45DT02_RecordLoop();
        }
      }
 
      // Aufnahme beenden
      UB_MP45DT02_RecordStop();
 
      // Karte unmounten
      UB_Fatfs_UnMount(MMC_0);
 
      UB_Led_Off(LED_GREEN);
 
    }
    else UB_Led_On(LED_RED);
  }
  else UB_Led_On(LED_RED);
 
  while(1)
  {
 
  }
}

Hier die Library zum Download :

ub_stm32f4_mp45dt02_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_47_MP45DT02

3 Antworten auf 47-MP45DT02-Library (STM32F4)

  1. thomas sagt:

    Hi Uwe,

    Um stereo von zwei MP45DT02 aufzunehmen, wie wird dann SPI2 configuriert? I2S_InitStructure.I2S_CPOL kann nur I2S_CPOL_High oder I2S_CPOL_Low annehmen. Wenn ich das MP45DT02 Datenblatt richtig lese muss man aber einen interrupt f”ur die aufsteigende UND abfallende Flanke des Taktes erzeugen, wenn man zwei MP45DT02 in Stereo mode an einer Datenleitung hat. Wie wird das erreicht?

    Im voraus Danke f”ur Deine Antwort, und vielen Dank f”ur all die n”utzlichen Beispiele. Gruss, thomas

    • Tobi sagt:

      Hallo,

      auch wenn das alles scho etwas her ist:
      Wenn ich das richtig verstehe, geht das gar nicht. Bei meinem Testaufbau bekomme ich die Daten per DMA, aber immer nur vom rechten Kanal, egal wie ich I2S_CPOL einstelle. Der linke Kanal liefert bei mir nie Daten.

      Ich verstehe CPOL auch so, das hier nur eingestellt wird, wo die Leitung hängen soll, wenn nichts übertragen wird (idle) und egal wie CPOL eingestellt ist, immer mit der steigenden Flanke von CLK übertragen wird.

      Eigentlich würde ich auch gerne wissen, ob es nicht doch geht in Stereo mit der I2S Schnittstelle une zwei PDM Micros aufzunehmen.

      Weiß da jemand was dazu?

  2. Tom sagt:

    Hallo,
    die Qualität des Audiosignals ließ sich bei mir durch deaktivieren der Tiefpassfilterfrequenz (###.LP = 0) erheblich verbessern, dann wird jedoch hochfrequentes Rauschen hörbar. Vorher knackte bei mir das Signal in zeitlich konstanten Intervallen. Ich hab die Tonsignale direkt über UDP an meinen Rechner geschickt und “live” mitgehört. – funktionierte toll – Falls wer Probleme mit der vorkompilierten Datei hat (HW-FPU – #### uses VFP register arguments, lib… does not) kann man einfach die .s und .h-Datei von “https://github.com/piratfm/codec2_m4f/tree/master/lib/PDM_filter” einbinden (einfach einfügen).


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert