/*
PWM.h - PWM API header file.
includes:
PWM_Output_Init, PWM_Enable, PWM_Disable, PWM_SetFreq, PWM_SetDC, PWM_SetDT
Copyright (C) 2011 Houtouridis Christos (http://houtouridis.blogspot.com/)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Author: Houtouridis Christos
Date: 11/2011
Version: 0.1
*/
#ifndef __PWM_h__
#define __PWM_h__
#include
#include
#include
#include
/* ================ User Defines ======================*/
#define PWM_DATA_SIZE (4)
#define PWM_MINIMUM_STEPS (100)
#define PWM_STD_DC (40)
#define PWM_STD_FREQ (10000)
#define PWM_DEBUG_MODE (1)
/* ========= General Defines ========*/
#define PWM_MAXIMUM_STEPS (0xFFFF)
#define PWM_DT_A_MAX (0x7F)
#define PWM_DT_B_MAX (0xFE)
#define PWM_DT_C_MAX (0x1F8)
#define PWM_DT_D_MAX (0x3F0)
#define PWM_DTG_A_MASK (0)
#define PWM_DTG_B_MASK (0x80)
#define PWM_DTG_C_MASK (0xC0)
#define PWM_DTG_D_MASK (0xE0)
#define PWM_TIM_CCMR1_1_MODE1 ((uint16_t)0x0060)
#define PWM_TIM_CCMR1_1_MODE2 ((uint16_t)0x0070)
#define PWM_TIM_CCMR1_2_MODE1 ((uint16_t)0x6000)
#define PWM_TIM_CCMR1_2_MODE2 ((uint16_t)0x7000)
#define PWM_TIM_CCMR2_3_MODE1 ((uint16_t)0x0060)
#define PWM_TIM_CCMR2_3_MODE2 ((uint16_t)0x0060)
#define PWM_TIM_CCMR2_4_MODE1 ((uint16_t)0x6000)
#define PWM_TIM_CCMR2_4_MODE2 ((uint16_t)0x7000)
/*================ General Data Types ======================*/
typedef enum
{
TIM_CH1, TIM_CH1N, TIM_CH1CMP,
TIM_CH2, TIM_CH2N, TIM_CH2CMP,
TIM_CH3, TIM_CH3N, TIM_CH3CMP,
TIM_CH4
}PWM_Channel_t;
/*
See User manual page 257 and 227
*/
typedef enum
{
PWM_MODE_1_UP, PWM_MODE_1_DOWN,
PWM_MODE_2_UP, PWM_MODE_2_DOWN
}PWM_Mode_t;
typedef uint16_t PWM_PSC_t;
// Timer typedefs
typedef TIM_TypeDef PWM_Timer_t;
typedef uint32_t PWM_Timer_Freq_t;
// PWM typedefs
typedef float PWM_Freq_t;
typedef float PWM_DC_t;
typedef float PWM_DT_t;
typedef uint8_t PWM_DTG_t;
typedef volatile struct
{
PWM_Timer_t *tim;
PWM_Timer_Freq_t tim_freq;
PWM_Channel_t ch;
PWM_Mode_t mode;
PWM_Freq_t freq;
PWM_DC_t dc;
PWM_DT_t dt;
}PWM_t;
typedef enum
{
PWM_EXIT_OK, PWM_EXIT_ERROR
}PWM_EXIT_t;
/*================ Static Functions ======================*/
#define PWM_DTG_A(__dt, __tfreq) ( (PWM_DTG_t)(__dt * __tfreq) )
#define PWM_DTG_B(__dt, __tfreq) ( (PWM_DTG_t)(((__dt * __tfreq) / 2 ) - 64 ) )
#define PWM_DTG_C(__dt, __tfreq) ( (PWM_DTG_t)(((__dt * __tfreq) / 8 ) - 32 ) )
#define PWM_DTG_D(__dt, __tfreq) ( (PWM_DTG_t)(((__dt * __tfreq) / 16) - 32 ) )
/*================ Exported Functions ======================*/
PWM_EXIT_t PWM_Output_Init (PWM_t *pwm);
PWM_EXIT_t PWM_Enable (PWM_t *pwm);
PWM_EXIT_t PWM_Disable (PWM_t *pwm);
PWM_EXIT_t PWM_SetFreq (PWM_t *pwm, PWM_Freq_t f);
PWM_EXIT_t PWM_SetDC (PWM_t *pwm, PWM_DC_t dc);
PWM_EXIT_t PWM_SetDT (PWM_t *pwm, PWM_DT_t dt);
#endif //#ifndef __PWM_h__