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 [2014/04/08 12:07]
huwaldt
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]]