ARM STM32 F103ZE Problemen bei der ADC-Wandlung über DMA

OP #1940732
Lesenswert?
• ▲
▼
Hallo!
Ich habe ein Problem mit ADC mit Hilfe DMA Kontroller, damit ganzen 
Ablauf zugiger geht.
Ich weiß nicht wie ich mehrere Kanäle abfragen soll. Wenn ich die 
folgenden Operationen durchführe, dann habe ich nur einen falschen Wert 
in ADC1ConvertedValue[0].
Ich gehe davon aus, dass die Funktion ADC_Configuration(void) falsch 
definiert.
Hier ist mein Quellcode:

#define ADC1_DR_Address    ((uint32_t)0x4001244C)
__IO uint16_t ADC1ConvertedValue[20];

void DMA_Configuration(void)
{
  /* DMA1 channel1 configuration 
----------------------------------------------*/
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
    DMA_InitStructure.DMA_MemoryBaseAddr = 
(uint32_t)&ADC1ConvertedValue;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 20;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
    DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel1, ENABLE);
}

void ADC_Configuration(void){

  /* ADC1 configuration 
------------------------------------------------------*/
  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 = 10;
  ADC_Init(ADC1, &ADC_InitStructure);
//  /* ADC1 regular channels configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 4, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 5, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 6, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 7, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 8, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 9, 
ADC_SampleTime_28Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 10, 
ADC_SampleTime_28Cycles5);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibaration register */
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

   /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

  analog.timestamp=values.timestamp;
  analog.TempSens1=ADC1ConvertedValue[0];
  analog.TempSens2=ADC1ConvertedValue[1];
  analog.Batt_Spg1=ADC1ConvertedValue[2];
  analog.Batt_Spg2=ADC1ConvertedValue[3];
  analog.Druck_Sensor=ADC1ConvertedValue[4];
  analog.Druck_Sensor_Kalt1=ADC1ConvertedValue[5];
  analog.Druck_Sensor_Kalt2=ADC1ConvertedValue[6];
  analog.Strom_Mess1=ADC1ConvertedValue[7];
  analog.Strom_Mess2=ADC1ConvertedValue[8];
  analog.Temp=ADC1ConvertedValue[9];

Die Konfiguration von GPIO und RCC sind richtig eingestellt.
Ich werde sehr dankbar, wenn jemand mir etwas schreibt. Am Ende stelle 
ich hier fuktionierende Funktionen, falls es jemand noch braucht.
MfG, Roman
OP #1943514
Lesenswert?
• ▲
▼
Lösung des Problems:
Ändern Initialisierung von ADC

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //Scan 
(multichannels - ENABLE) or Single (one channel - DISABLE) mode.
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 10;
  ADC_Init(ADC1, &ADC_InitStructure);

Und bei DMA soll Zähler bei jedem Schritt inkrementiert:
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;


Das war's.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.