Forum: Mikrocontroller und Digitale Elektronik STM32 ADC und Timer Problem


von Klaus (Gast)


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)


Lesenswert?

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

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

von Klaus (Gast)


Lesenswert?

STM Apprentice schrieb:
> Für welchen STM32F103? Es gibt viele ....

STM32F103RCT6

GPIOs wurden alle initialisiert.

von STM Apprentice (Gast)


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)


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

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.