Forum: Mikrocontroller und Digitale Elektronik STM32: zweites compare-register vom timer verwenden


von Hans W. (hans_wurst)


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

von Hans W. (hans_wurst)


Lesenswert?

Hat keiner eine Idee? Habe leider wirklich keine Ahnung mehr, was ich 
noch versuchen könnte.

von Hans W. (hans_wurst)


Lesenswert?

Da es mir wichtig ist, möchte ich das Thema nochmal nach oben bringen.

von Info (Gast)


Lesenswert?

Gleiches Problem hier; bislang noch keine Lösung: 
Beitrag "STM32F103 ADC per Timer triggern (SPL)"

von Info (Gast)


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...

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.