mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM STM32 F103ZE Problemen bei der ADC-Wandlung über DMA


Autor: Roman H. (chumarik)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roman H. (chumarik)
Datum:

Bewertung
0 lesenswert
nicht 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

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.