STM32 ADC und Timer Problem

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

Antwort schreiben

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.

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.