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


von Tom0526 (Gast)


Angehängte Dateien:

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

von Tom0526 (Gast)


Lesenswert?

hat jmd eine Ahunug

von Jens A. (nepi)


Lesenswert?

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

von Tom0526 (Gast)


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);

}

von Matthias K. (matthiask)


Lesenswert?

An den Teil wirds wohl auch nicht liegen...

Wo holst Du denn die ADC-Werte ab?

von Tom0526 (Gast)


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);
}

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Angehängte Dateien:

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

von Tom0526 (Gast)


Angehängte Dateien:

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.

von Paul (Gast)


Lesenswert?

Hat der Sinus eine konstante Steigung?
...NEIN!!!

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.