Forum: Mikrocontroller und Digitale Elektronik 13-Bit ADC MCP3302 mit STM32F429


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte gerne den MCP3302 ADC mittels SPI mit meinem STM32F429 
Discovery Board auslesen.
Anbei habe ich den geforderten Ablauf aus dem Datenblatt angehängt

Leider habe ich noch nichts mit SPI gemacht wo auch empfangen wird und
möchte wissen ob die Überlegung grundsätzlich richtig ist.

Für mein Programm verwende ich die SPI Library von hier:
http://mikrocontroller.bplaced.net/wordpress/?page_id=2751

Ich würde das Diagramm jz mal mit diesem "Pseudocode" interpretieren:
(Die Library sendet ein Bit und empfängt auch wieder eines)


uint8_t spi_send()
{
  uint8_t ret_wert1;
  uint8_t ret_wert2;
  uint8_t ret_wert3;
  uint8_t ret_wert;

  **ChipSelect-Pin auf LO legen**

ret_wert1=UB_SPI5_SendByte(0b00001100); //Single Ended CH0

ret_wert2=UB_SPI5_SendByte(0b00000000); //D0

ret_wert3=UB_SPI5_SendByte(0b00000000); //Alles Don't Cares

ret_wert =   ret_wert2 + ret_wert3;

  **ChipSelect-Pin auf HI legen**

  return(ret_wert);
}



int main(void)
{

  uint8_t adc_wert;

  SystemInit();
  UB_SPI5_Init(SPI_MODE_0_MSB);

  while(1)
  {
  adc_wert=spi_send();
  }

}


Wäre nett wenn jemand der so etwas schon gemacht hat schnell 
drüberschaut!

Bin mir leider echt nicht über das vorgehen bei sowas im klaren.

lg.

von public (Gast)


Lesenswert?

Hallo Thomas,

schaut erstmal recht vernüftig aus. Stell einfach sicher, das du genau 
das machst was dir das Bild sagt.

1. Chipselect auf LOW
2. Takt an
3. 2 Bytes senden (so wie du es machen willst)
4. kein 3. Byte senden (der ADC kümmert sich nicht mehr um den Eingang 
"dont care")
5. nach dem senden des 2. Bytes Lauschangriff starten ;)
hier genau wie beim Senden 2 Bytes empfangen!

fertig!

Wieso benutzt du nicht den ADC des STM32? Willst du einen einzelnen Wert 
samplen?

beste grüße
public

von Thomas (Gast)


Lesenswert?

Vielen Dank!

Dann werde ich mal versuchen das ganze zum Laufen zu bekommen =)

Grund ist, dass damit ein EKG Signal aufgezeichnet werden soll und ich 
die Daten isoliert zum uC-Board übertragen will mit einem SPI-Isolator.

Wollte zuerst die analogen Signale isoliert Übertragen aber dieser Weg 
scheint mir flexibler und vor allem günstiger.

Außerdem soll auch ein Lerneffekt dabei rausschauen =)

lg.

von Thomas (Gast)


Lesenswert?

Hallo,

Hab es jz laufen und glaube,dass es sogar halbwegs funktioniert!

Leider klappt das Zusammenfügen der 2 8-bit Ergebnisse zur 13-Bit Zahl 
nicht.

Meine Überlegung war die MSBs in einem 16-bit int zu speichern und diese 
dann um 8 hochzushiften, anschließend noch die 8-bits LBSs dazuaddieren.

Wenn ich den Poti drehe kommt aber leider immer nur innerhalb von einer 
Drehung ca. 0-255-0-255-..
heraus. Also gehe ich davon aus dass das zusammenfügen nicht klappt!

ret_wert1 und ret_wert2 verhalten sich ca. einzeln genauso!

Hat jemand eine Ahnung was ich falch gemacht habe?

Vielen Dank und liebe Grüße!


Anbei der Code:

***********************************************************************

#include "main.h"
#include "stm32_ub_lcd_ili9341.h"
#include "stm32_ub_font.h"
#include "stm32_ub_spi5.h"
#include "stm32_ub_dig_out.h"
#include <stdio.h>




uint8_t spi_send()
{

UB_DigOut_Lo(DOUT_PE2);

uint8_t ret_wert1=0;
uint16_t ret_wert2=0;
int i = 0;


UB_SPI5_SendByte(0b00001100);       //Single Ended
for(i=0;i<100;i++);
ret_wert1 = UB_SPI5_SendByte(0x00);   //D0
for(i=0;i<100;i++);
ret_wert2 = UB_SPI5_SendByte(0x00);   //Alles Don't Cares

UB_DigOut_Hi(DOUT_PE2);

uint16_t wert = (ret_wert2<<8)+ret_wert1;

return(wert);
}



int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
  UB_DigOut_Init();
    UB_DigOut_Hi(DOUT_PE2);

   char Text[16];
   uint16_t x = 0;
   int i = 0;
   uint16_t y= 0;
   UB_SPI5_Init(SPI_MODE_0_MSB);

  // Init vom LCD
  UB_LCD_Init();
  // Init der Layer
  UB_LCD_LayerInit_Fullscreen();
  // auf Hintergrund schalten
  UB_LCD_SetLayer_1();
  // Hintergrund komplett mit einer Farbe füllen
  UB_LCD_FillLayer(RGB_COL_WHITE);
  // auf Vordergrund schalten
  UB_LCD_SetLayer_2();
  // Vordergrund komplett mit einer Farbe füllen
  UB_LCD_FillLayer(RGB_COL_GREEN);


  UB_Font_DrawString32(10,10,"ADC-Wert:",&Arial_18x27,RGB_COL_BLACK,RGB_CO 
L_WHITE);

  while(1==1)
  {
  for(i=0;i<10;i++)
  {
    x=spi_send();
    y=y+x;
  }
    y= y/10;

  sprintf(Text, "%d", y);
  UB_Font_DrawString(10,100,Text,&Arial_10x15,RGB_COL_BLACK,RGB_COL_WHITE) 
;
  for(i=0;i<10000000;i++);
  UB_LCD_FillLayer(RGB_COL_WHITE);
  }
}
***********************************************************************

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.