STM32 ADC und Timer Problem

Gast #5238780
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
}
Gast #5238809
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?
Gast #5238810
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.