Forum: Mikrocontroller und Digitale Elektronik STM32 ADC und Timer Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo und guten Abend zusammen,

ich habe mir ein Programm für den STM32F103 geschrieben. Letztendlich 
einen PWM-Timer welchen ich anfangs mit 300 auf CCR1 initialisiere. Der 
ADC misst über einen Shunt den Strom der Phasen.

Im Endeffekt hab ich 2 Interrupts. Timer 2 der mit 2Hz eine LED blinken 
lässt und den ADC3. Die PWM Erzeugung wird mit Timer 8 vorgenommen und 
wie oben beschrieben bei Start der MCU mit 300 initialisiert. Wenn der 
Interrupt für ADC3 disabled wird blinkt die LED schön im 2 HZ Takt. Wird 
die IST enabled, bleibt sie konstant auf HIGH. Das Problem tritt auf 
sowohl bei angeschalteter PWM als auch Abgeschaltener.

Bei eingeschaltener könnte ich mir das noch einigermaßen erklären, da 
ein Motor angeschlossen ist und somit ein Strom gemessen wird, aber bei 
abgeschaltener PWM?

Ich füge mal die Initialisierung an und die jeweiligen Interrupts und 
NVIC. Würde mich freuen wenn mir da jemand einen Rat geben könnte woran 
das liegt. Danke, Klaus.
1
void System_Clock_Setup(void) {
2
  RCC_DeInit();
3
  RCC_HSICmd(ENABLE);    
4
  while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
5
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
6
  FLASH_SetLatency(FLASH_Latency_2);    
7
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
8
  RCC_PCLK2Config(RCC_HCLK_Div1);
9
  RCC_PCLK1Config(RCC_HCLK_Div2);
10
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
11
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
12
  RCC_PLLCmd(ENABLE);
13
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
14
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
15
  while (RCC_GetSYSCLKSource() != 0x08);
16
17
/* GPIOA GPIOB and GPIOC clock enable */
18
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
19
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
20
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
21
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
22
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
23
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
24
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
25
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
26
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
27
}
28
29
void ADC_Cal(void) {
30
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
31
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
32
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
33
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
34
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
35
  ADC_InitStructure.ADC_NbrOfChannel = 3;
36
  ADC_Init(ADC3, &ADC_InitStructure);
37
  ADC_InjectedSequencerLengthConfig(ADC3, 3);
38
  ADC_InjectedChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5);
39
  ADC_InjectedChannelConfig(ADC3, ADC_Channel_13, 2, ADC_SampleTime_7Cycles5);
40
  ADC_InjectedChannelConfig(ADC3, ADC_Channel_0, 3, ADC_SampleTime_7Cycles5);
41
42
  ADC_ExternalTrigInjectedConvConfig(ADC3, ADC_ExternalTrigInjecConv_T8_CC4);
43
  ADC_ExternalTrigInjectedConvCmd(ADC3, ENABLE);
44
  ADC_ITConfig(ADC3, ADC_IT_JEOC, ENABLE);
45
  ADC_Cmd(ADC3, ENABLE);
46
  ADC_ResetCalibration(ADC3);
47
  while (ADC_GetResetCalibrationStatus(ADC3)) {}
48
49
  ADC_StartCalibration(ADC3);
50
  while (ADC_GetCalibrationStatus(ADC3)) {}
51
}
52
53
void Timer_Cal(void){
54
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
55
  TIM_OCInitTypeDef TIM_OCInitStructure;
56
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
57
  TIM_OCStructInit(&TIM_OCInitStructure);
58
59
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
60
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
61
  TIM_TimeBaseStructure.TIM_Prescaler = 640 - 1; 
62
  TIM_TimeBaseStructure.TIM_Period = 50000 - 1;
63
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
64
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
65
  TIM_Cmd(TIM2, ENABLE);
66
67
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
68
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
69
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
70
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
71
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
72
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
73
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
74
  TIM_OCInitStructure.TIM_Pulse = 0;
75
  TIM_OC1Init(TIM8, &TIM_OCInitStructure);
76
  TIM_OCInitStructure.TIM_Pulse = 0;
77
  TIM_OC2Init(TIM8, &TIM_OCInitStructure);
78
  TIM_OCInitStructure.TIM_Pulse = 0;
79
  TIM_OC3Init(TIM8, &TIM_OCInitStructure);
80
  TIM_OCInitStructure.TIM_Pulse = 1;
81
  TIM_OC4Init(TIM8, &TIM_OCInitStructure);
82
  TIM_Cmd(TIM8, ENABLE);
83
}
84
85
void NVIC(void){
86
  NVIC_InitTypeDef NVIC_InitStructure;
87
88
  NVIC_InitStructure.NVIC_IRQChannel = ADC3_IRQn;
89
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
90
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
91
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
92
  NVIC_Init(&NVIC_InitStructure);
93
94
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
95
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
96
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
97
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
98
  NVIC_Init(&NVIC_InitStructure);
99
}
100
101
void TIM2_IRQHandler(void) {
102
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
103
        GPIOB->ODR ^= LED;
104
}
105
106
void ADC3_IRQHandler(void) {
107
  ADC_ClearITPendingBit(ADC3, ADC_IT_JEOC);
108
}

von STM Apprentice (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> ich habe mir ein Programm für den STM32F103 geschrieben.

Für welchen STM32F103? Es gibt viele ....

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
STM Apprentice schrieb:
> Für welchen STM32F103? Es gibt viele ....

STM32F103RCT6

GPIOs wurden alle initialisiert.

von STM Apprentice (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> void NVIC(void){
-------^^^^^----------

NVIC ist ein Define in core_cm3.h und darf eigentlich nicht
verwendet werden bzw der Compiler beschwert sich bei mir
darüber dass das Macro nicht richtig ausgeführt wird.

Das muss eigentlich zu Konflikten führen .... geht das bei
dir fehlerfrei und ohne Warnings?

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nee hab da auch NVIC_Cal hab nur das _Cal vergessen :-)

Ich find einfach den Fehler nicht... Sobald ADC3 NVIC mit in der 
NVIC_Cal steht blockiert er meinen Timer2 ISR! PWM läuft allerdings 
weiter

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]
  • [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.