mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik an STM32F103-benutzer, ADC


Autor: Tom0526 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem:
ich habe der AD-Wandler des Microkontrollers STM32F103 wie folgendes 
programmiert.

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC3, &ADC_InitStructure);


Das SimpleTime beträgt 6µs (maximale SimpleTime was ich einstellen kann, 
ist 18µs).
    ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 1, 
ADC_SampleTime_71Cycles5);

wenn ich jetzt als Eingangsignal eine Sinusfunktion (100 Hz) einspeise, 
werden in dem Speicher mehrere gleiche
Werte nacheinnander kommen.(Foto am Anhang)

woran kann das liegen? ich habe auch mit abtastzeit 18µs probiert kommt 
aber das Problem raus...

Danke für eure Hilfe

Autor: Tom0526 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat jmd eine Ahunug

Autor: Jens A. (nepi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde tippen, dass es nicht an diesem Teil des Quellcodes liegt.

Autor: Tom0526 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ick komme nicht mehr weiter. mehr als 3 Wochen suche ich den Fehler :( 
Könnte an RCC-Einstellung sein?
mein RCC-Code ist folgendes:
Danke für Eure Hilfe!

/**
  * @brief  Configures the different system clocks.
  */
void RCC_Configuration(void)
{
    /* RCC system reset(for debug purpose) */
  RCC_DeInit();
   /* Setup the microcontroller system. Initialize the Embedded Flash 
Interface,
     initialize the PLL and update the SystemFrequency variable. */
  SystemInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* ADCCLK = PCLK2/4 */
    RCC_ADCCLKConfig(RCC_PCLK2_Div4);

#ifndef STM32F10X_CL
    /* PLLCLK = 8MHz * 7 = 56 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);

#else
    /* Configure PLLs *********/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
    RCC_PLL2Config(RCC_PLL2Mul_8);

    /* Enable PLL2 */
    RCC_PLL2Cmd(ENABLE);

    /* Wait till PLL2 is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
    {}

    /* PLL configuration: PLLCLK = (PLL2 / 5) * 7 = 56 MHz */
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_7);
#endif

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

/* Enable peripheral clocks -----------------*/
  /* Enable DMA1 and DMA2 clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, 
ENABLE);
  /* Enable ADC1 and GPIOC clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3 | RCC_APB2Periph_GPIOC | 
RCC_APB2Periph_GPIOD, ENABLE);
  /* Enable DMA1 or/and DMA2 clock */
  RCC_AHBPeriphClockCmd(SPI_MASTER_DMA_CLK | SPI_SLAVE_DMA_CLK, ENABLE);
  /* Enable CRC clock */ //für CRC_CalcBlockCRC
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
   /* Resets the CRC Data register */ //für CRC_CalcBlockCRC
    CRC_ResetDR();

/* KHM__SPI --------------------------*/
#ifdef USE_STM3210C_EVAL
  /* Enable GPIO clock for SPI_MASTER and SPI_SLAVE */
  RCC_APB2PeriphClockCmd(SPI_MASTER_GPIO_CLK | SPI_SLAVE_GPIO_CLK |
  RCC_APB2Periph_AFIO, ENABLE);


  /* Enable SPI_MASTER Periph clock */
  RCC_APB1PeriphClockCmd(SPI_MASTER_CLK, ENABLE);

#else
  /* Enable SPI_MASTER clock and GPIO clock for SPI_MASTER and SPI_SLAVE 
*/
  RCC_APB2PeriphClockCmd(SPI_MASTER_GPIO_CLK | SPI_SLAVE_GPIO_CLK |
                       SPI_MASTER_CLK, ENABLE);

#endif
  /* Enable SPI_SLAVE Periph clock */
  RCC_APB1PeriphClockCmd(SPI_SLAVE_CLK, ENABLE);

}

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An den Teil wirds wohl auch nicht liegen...

Wo holst Du denn die ADC-Werte ab?

Autor: Tom0526 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ADC-Werte wurden im Speicher mittels DMA-Modus Kontiniuerlich 
abgelegt.

void DMA2_Configuration(void)
{
  /* DMA2 channel5 configuration------------*/
  DMA_DeInit(DMA2_Channel5);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Speicher1;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //Read from 
peripheral ADC3
  DMA_InitStructure.DMA_BufferSize = Buffer1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //to transfer 
continuously converted data from ADC3 to memory.
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
  DMA_Init(DMA2_Channel5, &DMA_InitStructure);
}

Autor: Gebhard R. (geb)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das für ADC1 mit 12 Kanälen gemacht,funktioniert einwandfrei.
Ich stell mal den Code hier rein, dann kannst du sinngemäß vergleichen.

Grüße

Autor: Tom0526 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke an Gebhard Raich, & an euch alle für die Unterstützung!

blöde Fehler.
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; (es muss DMA_M2M_Disable 
sein)

Problme irgendwie gelöst, ich bekomme nicht mehr die gleiche digitale 
Werte nacheinnander raus. aber, soll es nicht sein, dass die Diferenz 
zweier Werte gleich sein soll? 889-861=...=886-881=943-925=...also das 
gleiche Abstand?
bild vom Speiche ist am Anhang

Mein Eingangssignal ist ein Sinusfunktion.

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat der Sinus eine konstante Steigung?
...NEIN!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.