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
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); }
An den Teil wirds wohl auch nicht liegen... Wo holst Du denn die ADC-Werte ab?
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); }
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.