STM32: zweites compare-register vom timer verwenden

OP #3289698
Lesenswert?

Hallo,

ich verwende die Standardlib von STM. Im unten eingefügten Code läuft 
bereits folgendes:
- der Ausgang toggelt mit dem in TIM_OC1 eingestellten timing
- zusätzlich löst der timer ein event aus und startet den ADC
- nach dem ADC werden die Daten per DMA abgeholt

Soweit läuft das ganz gut. Nun würde ich den ADC aber gerne durch 
TIM_OC2 antriggern lassen (ich hätte beim ADC-Start gerne ein delay zu 
TIM_OC1).

Eigentlich dachte ich, ich bräuchte einfach nur noch die Funktion 
"TIM_OC2Init()" erweitern/hinzufügen (mit anderem timing) und dann den 
ADC vom "ADC_ExternalTrigConv_T1_CC2" triggern lassen. In diesem Fall 
scheint der ADC aber nie zu starten.

Hätte jemand einen Tipp, was ich falsch mache?
1
  /* TIM1 configuration ------------------------------------------------------*/
2
  /* Time Base configuration */
3
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
4
  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
5
  TIM_TimeBaseStructure.TIM_Prescaler = 0x4;
6
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
7
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
8
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
9

10
  /* TIM1 channel1 configuration in PWM mode */
11
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
12
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
13
  TIM_OCInitStructure.TIM_Pulse = 0xFFFF/2;
14
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
15
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
16
//  TIM_OC2Init(TIM1, &TIM_OCInitStructure);  // (sollte für das 2te compare-register sein sollen)
17

18
  /* DMA1 Channel1 Configuration ----------------------------------------------*/
19
  DMA_DeInit(DMA1_Channel1);
20
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
21
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab;
22
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
23
  DMA_InitStructure.DMA_BufferSize = FRAME_ADC_SIZE_OF_BUFFER;
24
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
25
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
26
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
27
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
28
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
29
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
30
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
31
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
32

33
  /* Enable DMA1 channel1 */
34
  DMA_Cmd(DMA1_Channel1, ENABLE);
35

36
  /* ADC1 configuration ------------------------------------------------------*/
37
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
38
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
39
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
40
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
41
//  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC2; // (triggert den ADC jedoch nicht an)
42
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
43
  ADC_InitStructure.ADC_NbrOfChannel = 1;
44
  ADC_Init(ADC1, &ADC_InitStructure);
45

46
  /* ADC1 regular channel1 configuration */
47
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_41Cycles5);
48

49

50
  /* Enable ADC1 DMA */
51
  ADC_DMACmd(ADC1, ENABLE);
52

53
  /* Enable ADC1 external trigger */
54
  ADC_ExternalTrigConvCmd(ADC1, ENABLE);
55

56
  /* Enable ADC1 */
57
  ADC_Cmd(ADC1, ENABLE);
58

59
  /* TIM1 main Output Enable */
60
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
61

62
  /* TIM1 counter enable */
63
  TIM_Cmd(TIM1, ENABLE);
Gast #4743944
Lesenswert?

Hans W. schrieb:
> /* Enable ADC1 external trigger */
>   ADC_ExternalTrigConvCmd(ADC1, ENABLE);

Vielleicht auch nicht das gleiche Problem. Hier wurde offenbar nur 
vergessen, den externen Trigger (= steigende Flanke an CC-Ausgang im PWM 
Modus!) auch für den 2. Kanal einzuschalten...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren