Forum: Mikrocontroller und Digitale Elektronik STM32F4 - Transistor schalten


von OneDay (Gast)


Lesenswert?

Hallo zusammen,

habe folgende Frage/Problem:

Ich schließe einen Ausgang des STM32F4 über einen Widerstand an die 
Basis eines Standard NPN-Transistors. Am Kollektor liegen 12V an, an 
Emmitter ist ebenfalls ein Widerstand und danach eine LED angeschlossen.

Ich dachte nun folgendes. Ich setze den Ausgang des Controllers auf 
High, der Transistor schaltet durch, die LED leuchtet.

Hier die Initialisierung des Pins:

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OTypePP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

Die LED leuchtet dann auch, aber ich kann sie nie wieder ausschalten. 
Ich setze den Pin zurück, die LED leuchtet weiter. Sie geht nie aus.
Woran könnte das liegen?

Über Hilfe würde ich mich sehr freuen :)
Viele Grüße

von Hubert G. (hubertg)


Lesenswert?

Hast du schon mal gemessen ob der Pin wirklich auf low geht?
Die LED und Widerstand gehören auch an den Kollektor.

von Lukas H. (1uk3)


Lesenswert?

> GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

Liefert der aktivierte Pull Up genug Strom um den Transistor zu 
schalten?

von st (Gast)


Lesenswert?

bitte den ganzen code zeigen

von Trtrtrtr (Gast)


Lesenswert?

Die clock für die gpios sind nicht an!!

von OneDay (Gast)


Lesenswert?

Hier der komplette Code:

void initApplication()
{
  SysTick_Config(SystemCoreClock/100);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_StructInit (&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void delayLoop() {
  volatile uint32_t delayCount = 1000000;
  while (delayCount > 0) {
    delayCount--;
  }
}


int main(void)
{
  SystemInit();
  initApplication();

        while(1){

      GPIO_SetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
      GPIO_ResetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
        }

  return 0;
}

void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t 
Size){
  return;
}

uint16_t EVAL_AUDIO_GetSampleCallBack(void){
  return -1;
}

von st (Gast)


Lesenswert?

> delayCount = 1000000;

Dein stm32F4 kann mit 168 MHz getaktet werden. Wenn der so schnell 
läuft, ist die Delay-Loop viel viel viel zu kurz. Für das Auge wird es 
so aussehen, als wäre die LED dauerhaft an.

Mach die Delay Loop mal länger.

von OneDay (Gast)


Lesenswert?

Okay, ich denke ich habe hier ein grundsätzliches Software-Problem. Ich 
kann die I/Os überhaupt nicht steuern, die machen was sie wollen. Hier 
mein komplettes Programm (STM32F4 Discovery Board), ich möchte einfach 
nur den Pin1 (PE2) auf High oder Low setzen.

void initApplication()
{
  SysTick_Config(SystemCoreClock/100);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_StructInit (&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void delayLoop() {
  volatile uint32_t delayCount = 10000000;
  while (delayCount > 0) {
    delayCount--;
  }
}


int main(void)
{
  SystemInit();
  initApplication();

        while(1){

      GPIO_SetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
      GPIO_ResetBits(GPIOD,GPIO_Pin_1);
      delayLoop();
        }

  return 0;
}

void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t
Size){
  return;
}

uint16_t EVAL_AUDIO_GetSampleCallBack(void){
  return -1;
}


Leider tut sich da gar nichts, genau wie an anderen Ausgängen.
Hat jemand eine Idee woran es liegen könnte?

von st (Gast)


Lesenswert?

wie passt das hier:

> ich möchte einfach
> nur den Pin1 (PE2) auf High oder Low setzen.

du setzt aber die ganze Zeit PD1. Welchen Pin willst du denn jetzt 
setzen? Hast du schon mal mit dem Debugger durchgegangen?

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Ist schwierig zu sagen, wenn Du nicht alle Files postet, die verwendet 
werden. Oder zumindest sagst, welchen Compiler (Umgebung) Du verwendest.

Bei meiner GCC Umgebung gibt es da noch:
- startup_stm32f4xx.S
- system_stm32f4xx.c/.h
- stm32f4xx_it.c/.h
- Linkerscript
- ...

Eventuell hast Du ja dadrin noch ein ganz anderes Problem.

Habe Dir mal ein minimales Beispiel mit allen benötigten Files 
angehängt.

OS: Linux (für Windows müsstest Du die Pfade anpassen)
ARM-GCC: gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-69)

Im Beispiel wir der Pin 13 von GPIOC im Sekundentakt ein- und wieder 
ausgeschaltet.

Daniel

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.