Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
ein_pwm-signal_genereieren_in_c [2014/02/12 09:29]
huwaldt angelegt
ein_pwm-signal_genereieren_in_c [2019/02/04 14:10] (aktuell)
Zeile 1: Zeile 1:
 ====== PWM ====== ====== PWM ======
 ... ...
 +
 +<code cpp>
 +//----------------------------------------------------------------------
 +// Titel     : einfaches PWM Beispiel für das STM32F4 Discovery
 +//----------------------------------------------------------------------
 +// Funktion  : dimmt die orange LED
 +// Schaltung : orange LED an PD13
 +//----------------------------------------------------------------------
 +// Hardware  : STM32F4 Discovery
 +// MCU       : STM32F407VGT6
 +// Takt      : 168 MHz
 +// Sprache   : ARM C
 +// Datum     : 21.01.2013
 +// Version   : 1
 +// Autor     : Alexander Huwaldt
 +//----------------------------------------------------------------------
 +#include <stddef.h>
 +#include <stdlib.h>
 +#include "hardware.h"
 + 
 +GPIO_InitTypeDef GPIO_InitStructure;
 +#define LED_ORANGE (1<<13)
 +TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 +TIM_OCInitTypeDef  TIM_OCInitStructure;
 +#define F_PWM 5000
 +volatile uint16_t timerPeriod = 0;
 +volatile uint16_t pwmLevel = 0; // 0-F_PWM
 + 
 + 
 +void initApplication()
 +{
 + SysTick_Config(SystemCoreClock/100);
 + // weitere Initialisierungen durchführen
 +
 + /* red LED Periph clock enable */
 + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
 +
 + /* Configure PD3 = red LED in output pushpull mode */
 + GPIO_InitStructure.GPIO_Pin = LED_ORANGE;
 + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 + GPIO_Init(GPIOD, &GPIO_InitStructure);
 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
 +
 + /* PWM frequency at 15 Khz */
 + timerPeriod = ((SystemCoreClock/10) / F_PWM ) - 1;
 +
 +
 + /* TIM4 clock enable */
 + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
 + 
 + /* Timer 1 Base configuration */
 + TIM_TimeBaseStructure.TIM_Prescaler = 4;
 + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 + TIM_TimeBaseStructure.TIM_Period = timerPeriod;
 + TIM_TimeBaseStructure.TIM_ClockDivision = 0;
 + TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
 + TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
 +
 + /* 50% for PWM channel 1 */
 + pwmLevel = F_PWM/2;
 +  
 + /* PWM Channel 2 Coinfiguration */
 + TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
 + TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
 + TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
 + TIM_OCInitStructure.TIM_Pulse = pwmLevel;
 + TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
 + TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
 + TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
 + TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
 + TIM_OC2Init(TIM4, &TIM_OCInitStructure);
 +
 + /* TIM4 counter enable */
 + TIM_Cmd(TIM4, ENABLE);
 +
 + /* TIM4 Main Output Enable */
 + TIM_CtrlPWMOutputs(TIM4, ENABLE);
 +
 +
 +}
 +
 +
 +int main(void)
 +{
 + SystemInit();
 + initApplication();
 + bool dimUp=true;
 + do{
 +
 + if (dimUp)
 + {
 + // nur bis 50% aufdimmen
 + if(pwmLevel<(F_PWM/2))
 + pwmLevel++;
 + else
 + dimUp=false;
 + }
 + else
 + {
 + if(pwmLevel>0)
 + pwmLevel--;
 + else
 + dimUp=true;
 + }
 +
 + TIM_OCInitStructure.TIM_Pulse = pwmLevel;
 + TIM_OC2Init(TIM4, &TIM_OCInitStructure);
 + waitMs(1);
 +
 + } while (true);
 + return 0;
 +}
 +
 +// Application SysTick
 +extern "C" void SysTick_Handler(void)
 +{
 +
 +}
 +</code>
  
 [[weiterführende Programmierung des STM32 in C|zurück zur Übersicht]] [[weiterführende Programmierung des STM32 in C|zurück zur Übersicht]]