Forum: Mikrocontroller und Digitale Elektronik STM32F3 Comparator Interrupt Problem und wie Multiplexen


von Steffen H. (stef_fen)


Lesenswert?

Hallo Zusammen,

hat jemand schonmal den Comparator des STM32F303VCT6 vom STM32F3 
Discovery Board genutzt? Ich habe testweise ein Poti an PA1 
angeschlossen um das auslösen des Comparators zu testen. PA1 ist dabei 
der nicht invertierte Eingang (VREFINT versorgt den invertierten 
Eingang).
Der Ausgang des Comparators geht direkt auf einen Ausgang PF4 an dem 
eine LED angeschlossen ist. Dies funktioniert auch Problemlos. Die LED 
die durch den Systick getoggelt wird soll mir nur zeigen das der 
Controller noch lebt.

Nun zu meinem Problem:
Der Interrupt des Comparators funktioniert nicht so wie ich mir das 
vorstelle. Wenn die LED an PF4 leuchtet hat der Comparator ja ausgelöst. 
Dann müsste ja auch der Interrupt ausgelöst werden oder? Aber die LED 
die vom Interrupt des Comparators getoggelt werden soll verhält sich 
ganz anders.

Des Weiteren gibt es ja bei der Atmega Reihe meisst einen Multiplexer 
für den Comparator mit den man auf einen andere Quelleingang umschalten 
kann aber den gleichen Comperator nutzt. Wie könnte man das mit dem ST 
Controller realisieren?

1
#include "stm32f30x.h"
2
#include "stm32f3_discovery.h"
3
#include "main.h"
4
5
void comp_init(void);
6
void EXTI1_IRQHandler(void);
7
void SysTick_Handler(void);
8
9
uint32_t Timing = 0;
10
11
int main(void)
12
{
13
  // Quarz Einstellungen aktivieren
14
  SystemInit();
15
  SysTick_Config(SystemCoreClock/1000);
16
17
  STM_EVAL_LEDInit(LED3);
18
  STM_EVAL_LEDInit(LED4);
19
  STM_EVAL_LEDInit(LED5);
20
  STM_EVAL_LEDInit(LED9);
21
  STM_EVAL_LEDInit(LED10);
22
  STM_EVAL_LEDOn(LED3);
23
  STM_EVAL_LEDOn(LED4);
24
  STM_EVAL_LEDOn(LED5);
25
26
  comp_init();
27
28
    while(1)
29
    {
30
      //blank
31
    }
32
}
33
34
void comp_init(void)
35
{
36
  GPIO_InitTypeDef GPIO_InitStructure;
37
  COMP_InitTypeDef COMP_InitStructure;
38
  EXTI_InitTypeDef EXTI_InitStructure;
39
  NVIC_InitTypeDef NVIC_InitStructure;
40
41
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
42
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
43
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
44
45
  //Konfiguration des GPIO => PA1 als Input des Comparators
46
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
47
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
48
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
49
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
50
  GPIO_Init(GPIOA, &GPIO_InitStructure);
51
52
  //Konfiguration des GPIO => PF4 als Output des Comparators
53
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
54
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
55
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
56
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
57
  GPIO_Init(GPIOF, &GPIO_InitStructure);
58
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_2);
59
60
  //Konfiguration des Comp1
61
  COMP_InitStructure.COMP_InvertingInput = COMP_InvertingInput_VREFINT;
62
  COMP_InitStructure.COMP_NonInvertingInput = COMP_NonInvertingInput_IO1;
63
  COMP_InitStructure.COMP_Output = COMP_Output_None;
64
  COMP_InitStructure.COMP_BlankingSrce = COMP_BlankingSrce_None;
65
  COMP_InitStructure.COMP_OutputPol = COMP_OutputPol_NonInverted;
66
  COMP_InitStructure.COMP_Hysteresis = COMP_Hysteresis_No;
67
  COMP_InitStructure.COMP_Mode = COMP_Mode_HighSpeed;
68
  COMP_Init(COMP_Selection_COMP1, &COMP_InitStructure); // Enable COMP1 parameters
69
  COMP_Cmd(COMP_Selection_COMP1, ENABLE); // Enable COMP1
70
71
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1); //Connected EXTI Line to PA1 pin
72
73
  //Konfiguration des EXTI
74
  EXTI_InitStructure.EXTI_Line = EXTI_Line21; //Connected to the Comparator 1 event
75
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
76
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
77
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
78
  EXTI_Init(&EXTI_InitStructure);
79
80
  //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
81
82
  //Konfiguration des NVIC
83
  NVIC_InitStructure.NVIC_IRQChannel = COMP1_2_3_IRQn;
84
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
85
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
86
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
87
  NVIC_Init(&NVIC_InitStructure);
88
}
89
90
void COMP1_2_3_IRQHandler(void)
91
{
92
  EXTI_ClearITPendingBit(EXTI_Line21);
93
  STM_EVAL_LEDToggle(LED10);
94
}
95
96
97
void SysTick_Handler(void)
98
{
99
  Timing++;
100
  if(Timing == 500)
101
  {
102
    STM_EVAL_LEDToggle(LED9);
103
    Timing = 0;
104
  }
105
}

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.