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

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