6 Mayıs 2014 Salı

Stm32f0 Discovery Board PWM driver

  Bu yazım da Stm32f0 Discovery Board da gene ücretsiz bir yazılım olan CoCoox ide ile  PWM sürmeyi deneyeceğim.Gösterge olarak boarddaki  ledleri kullanacağız.




Main Dosya içeriği :

#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_tim.h"
#include "pwm.h"


int main(void)
{

TIM_Config();
PWM_Init(15625);
PWM_Cmd(ENABLE);
PWM_ConfigChannel(0,5);
PWM_ConfigChannel(1,95);

    while(1)
    {


    }

}


PWM.H  Dosya içeriği :

#ifndef __PWM_H__
#define __PWM_H__
#include "stm32f0xx.h"
#include "stm32f0xx_conf.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_tim.h"

#ifdef __cplusplus
extern "C"
{
#endif

void TIM_Config(void);
void PWM_Init(uint32_t Frecuency);
void PWM_ConfigChannel(uint32_t Channel, uint32_t DutyCycle);
void PWM_Cmd(FunctionalState NewState);

#ifdef __cplusplus
}
#endif

#endif // __PWM_H__

PWM.C Dosya içeriği:

#include "pwm.h"

static uint32_t TimerPeriod;

void TIM_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

   /* GPIOC Clocks enable */
   RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOC, ENABLE);
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOC, &GPIO_InitStructure);
   GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_0);
   GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_0);
}
void PWM_Init(uint32_t Frequency)
{
Frequency/=2;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_Config();
TimerPeriod = (SystemCoreClock / Frequency ) - 1;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
}

void PWM_ConfigChannel(uint32_t Channel, uint32_t DutyCycle)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
uint32_t ChannelPulse = 0;
DutyCycle=100-DutyCycle ;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
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;

ChannelPulse = (uint16_t) ((DutyCycle * 10 *(TimerPeriod - 1)) / 1000);
TIM_OCInitStructure.TIM_Pulse = ChannelPulse;

if(Channel == 0){
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
}else if(Channel == 1){
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
 }
}

void PWM_Cmd(FunctionalState NewState)
{
TIM_Cmd(TIM3, NewState);
}


Hiç yorum yok:

Yorum Gönder