|
|
/*------------------------------------------------------------------------------
|
|
|
-- This file is a part of the libuc, microcontroler library
|
|
|
-- Copyright (C) 2014, Kaveh Mohamadabadi
|
|
|
--
|
|
|
-- 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, write to the Free Software
|
|
|
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
-------------------------------------------------------------------------------
|
|
|
-- Author : Kaveh Mohamadabadi
|
|
|
-- Mail : kaveh.mohamadabadi@gmail.com
|
|
|
-------------------------------------------------------------------------------*/
|
|
|
/// \defgroup PWM
|
|
|
/*! \file pwm.h
|
|
|
\brief PWM api.
|
|
|
|
|
|
The pwm api gives you a standard way to drive any pwm pin on any processor.
|
|
|
With this api you will be able to open and configure your PWM module, define the
|
|
|
associated pins when applicable and set the duty cycle and frequency. Note that depending
|
|
|
on the target architecture you can have soft or hard PWM.
|
|
|
|
|
|
A simple example to configure and use PWM4_CH4 on STM32 discovery for example.
|
|
|
\code
|
|
|
// lets open PWM4_CH4
|
|
|
//config :
|
|
|
// -TIMER = TIMER4 (PWM4=TIMER4)
|
|
|
// -PWM channel = 4
|
|
|
// -PWM output = PD15
|
|
|
// -PWM frequency = 1kHz
|
|
|
// -PWM duty cycle = 40.5%
|
|
|
pwmopen(PWM4_CH4,PD15);
|
|
|
int error = pwmsetconfig(PWM4_CH4,1000,40.5);
|
|
|
//check that everything is ok
|
|
|
if(error!=-1) //=> no error
|
|
|
{
|
|
|
//to change duty cycle to 15% for example:
|
|
|
pwmsetdutycycle(PWM4_CH4,15.0);
|
|
|
//you can also change the frequency:
|
|
|
pwmsetfrequency(PWM4_CH4,455000);
|
|
|
}
|
|
|
|
|
|
\endcode
|
|
|
\ingroup PWM
|
|
|
|
|
|
*/
|
|
|
#ifndef PWM_H
|
|
|
#define PWM_H
|
|
|
|
|
|
#include <stdint.h>
|
|
|
#ifdef __cplusplus
|
|
|
extern "C" {
|
|
|
#endif
|
|
|
/**
|
|
|
* @brief PWM open function
|
|
|
*
|
|
|
* This function opens the given PWM, it should turn it ON iff needed and enable it.
|
|
|
* @param PWM The PWM module and channel PWM1_CH6 for example
|
|
|
* @return The 0 on success or -1 if it fails.
|
|
|
* @ingroup PWM
|
|
|
*/
|
|
|
extern int pwmopen(int PWM,uint32_t pin);
|
|
|
extern int pwmsetconfig(int PWM,uint32_t freq,float dutyCycle);
|
|
|
extern int pwmsetdutycycle(int PWM,float dutyCycle);
|
|
|
extern int pwmsetfrequency(int PWM,uint32_t freq);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
|
|
#define UARTPARITYMASK 0x3
|
|
|
#define UARTBITSMASK 0xC
|
|
|
#define UARTSTOPBITSMASK 0x70
|
|
|
|
|
|
typedef enum
|
|
|
{
|
|
|
channel1 = 0,
|
|
|
channel2 = 1,
|
|
|
channel3 = 2,
|
|
|
channel4 = 3,
|
|
|
}channelx;
|
|
|
|
|
|
#define PWM1_CH1 ((0 << 8) + 0 )
|
|
|
#define PWM1_CH2 ((0 << 8) + 1 )
|
|
|
#define PWM1_CH3 ((0 << 8) + 2 )
|
|
|
#define PWM1_CH4 ((0 << 8) + 3 )
|
|
|
#define PWM1_CH5 ((0 << 8) + 4 )
|
|
|
#define PWM1_CH6 ((0 << 8) + 5 )
|
|
|
#define PWM1_CH7 ((0 << 8) + 6 )
|
|
|
#define PWM1_CH8 ((0 << 8) + 7 )
|
|
|
#define PWM1_CH9 ((0 << 8) + 8 )
|
|
|
#define PWM1_CH10 ((0 << 8) + 9 )
|
|
|
#define PWM1_CH11 ((0 << 8) + 10 )
|
|
|
#define PWM1_CH12 ((0 << 8) + 11 )
|
|
|
#define PWM1_CH13 ((0 << 8) + 12 )
|
|
|
#define PWM1_CH14 ((0 << 8) + 13 )
|
|
|
#define PWM1_CH15 ((0 << 8) + 14 )
|
|
|
#define PWM1_CH16 ((0 << 8) + 15 )
|
|
|
#define PWM2_CH1 ((1 << 8) + 0 )
|
|
|
#define PWM2_CH2 ((1 << 8) + 1 )
|
|
|
#define PWM2_CH3 ((1 << 8) + 2 )
|
|
|
#define PWM2_CH4 ((1 << 8) + 3 )
|
|
|
#define PWM2_CH5 ((1 << 8) + 4 )
|
|
|
#define PWM2_CH6 ((1 << 8) + 5 )
|
|
|
#define PWM2_CH7 ((1 << 8) + 6 )
|
|
|
#define PWM2_CH8 ((1 << 8) + 7 )
|
|
|
#define PWM2_CH9 ((1 << 8) + 8 )
|
|
|
#define PWM2_CH10 ((1 << 8) + 9 )
|
|
|
#define PWM2_CH11 ((1 << 8) + 10 )
|
|
|
#define PWM2_CH12 ((1 << 8) + 11 )
|
|
|
#define PWM2_CH13 ((1 << 8) + 12 )
|
|
|
#define PWM2_CH14 ((1 << 8) + 13 )
|
|
|
#define PWM2_CH15 ((1 << 8) + 14 )
|
|
|
#define PWM2_CH16 ((1 << 8) + 15 )
|
|
|
#define PWM3_CH1 ((2 << 8) + 0 )
|
|
|
#define PWM3_CH2 ((2 << 8) + 1 )
|
|
|
#define PWM3_CH3 ((2 << 8) + 2 )
|
|
|
#define PWM3_CH4 ((2 << 8) + 3 )
|
|
|
#define PWM3_CH5 ((2 << 8) + 4 )
|
|
|
#define PWM3_CH6 ((2 << 8) + 5 )
|
|
|
#define PWM3_CH7 ((2 << 8) + 6 )
|
|
|
#define PWM3_CH8 ((2 << 8) + 7 )
|
|
|
#define PWM3_CH9 ((2 << 8) + 8 )
|
|
|
#define PWM3_CH10 ((2 << 8) + 9 )
|
|
|
#define PWM3_CH11 ((2 << 8) + 10 )
|
|
|
#define PWM3_CH12 ((2 << 8) + 11 )
|
|
|
#define PWM3_CH13 ((2 << 8) + 12 )
|
|
|
#define PWM3_CH14 ((2 << 8) + 13 )
|
|
|
#define PWM3_CH15 ((2 << 8) + 14 )
|
|
|
#define PWM3_CH16 ((2 << 8) + 15 )
|
|
|
#define PWM4_CH1 ((3 << 8) + 0 )
|
|
|
#define PWM4_CH2 ((3 << 8) + 1 )
|
|
|
#define PWM4_CH3 ((3 << 8) + 2 )
|
|
|
#define PWM4_CH4 ((3 << 8) + 3 )
|
|
|
#define PWM4_CH5 ((3 << 8) + 4 )
|
|
|
#define PWM4_CH6 ((3 << 8) + 5 )
|
|
|
#define PWM4_CH7 ((3 << 8) + 6 )
|
|
|
#define PWM4_CH8 ((3 << 8) + 7 )
|
|
|
#define PWM4_CH9 ((3 << 8) + 8 )
|
|
|
#define PWM4_CH10 ((3 << 8) + 9 )
|
|
|
#define PWM4_CH11 ((3 << 8) + 10 )
|
|
|
#define PWM4_CH12 ((3 << 8) + 11 )
|
|
|
#define PWM4_CH13 ((3 << 8) + 12 )
|
|
|
#define PWM4_CH14 ((3 << 8) + 13 )
|
|
|
#define PWM4_CH15 ((3 << 8) + 14 )
|
|
|
#define PWM4_CH16 ((3 << 8) + 15 )
|
|
|
#define PWM5_CH1 ((4 << 8) + 0 )
|
|
|
#define PWM5_CH2 ((4 << 8) + 1 )
|
|
|
#define PWM5_CH3 ((4 << 8) + 2 )
|
|
|
#define PWM5_CH4 ((4 << 8) + 3 )
|
|
|
#define PWM5_CH5 ((4 << 8) + 4 )
|
|
|
#define PWM5_CH6 ((4 << 8) + 5 )
|
|
|
#define PWM5_CH7 ((4 << 8) + 6 )
|
|
|
#define PWM5_CH8 ((4 << 8) + 7 )
|
|
|
#define PWM5_CH9 ((4 << 8) + 8 )
|
|
|
#define PWM5_CH10 ((4 << 8) + 9 )
|
|
|
#define PWM5_CH11 ((4 << 8) + 10 )
|
|
|
#define PWM5_CH12 ((4 << 8) + 11 )
|
|
|
#define PWM5_CH13 ((4 << 8) + 12 )
|
|
|
#define PWM5_CH14 ((4 << 8) + 13 )
|
|
|
#define PWM5_CH15 ((4 << 8) + 14 )
|
|
|
#define PWM5_CH16 ((4 << 8) + 15 )
|
|
|
#define PWM6_CH1 ((5 << 8) + 0 )
|
|
|
#define PWM6_CH2 ((5 << 8) + 1 )
|
|
|
#define PWM6_CH3 ((5 << 8) + 2 )
|
|
|
#define PWM6_CH4 ((5 << 8) + 3 )
|
|
|
#define PWM6_CH5 ((5 << 8) + 4 )
|
|
|
#define PWM6_CH6 ((5 << 8) + 5 )
|
|
|
#define PWM6_CH7 ((5 << 8) + 6 )
|
|
|
#define PWM6_CH8 ((5 << 8) + 7 )
|
|
|
#define PWM6_CH9 ((5 << 8) + 8 )
|
|
|
#define PWM6_CH10 ((5 << 8) + 9 )
|
|
|
#define PWM6_CH11 ((5 << 8) + 10 )
|
|
|
#define PWM6_CH12 ((5 << 8) + 11 )
|
|
|
#define PWM6_CH13 ((5 << 8) + 12 )
|
|
|
#define PWM6_CH14 ((5 << 8) + 13 )
|
|
|
#define PWM6_CH15 ((5 << 8) + 14 )
|
|
|
#define PWM6_CH16 ((5 << 8) + 15 )
|
|
|
#define PWM7_CH1 ((6 << 8) + 0 )
|
|
|
#define PWM7_CH2 ((6 << 8) + 1 )
|
|
|
#define PWM7_CH3 ((6 << 8) + 2 )
|
|
|
#define PWM7_CH4 ((6 << 8) + 3 )
|
|
|
#define PWM7_CH5 ((6 << 8) + 4 )
|
|
|
#define PWM7_CH6 ((6 << 8) + 5 )
|
|
|
#define PWM7_CH7 ((6 << 8) + 6 )
|
|
|
#define PWM7_CH8 ((6 << 8) + 7 )
|
|
|
#define PWM7_CH9 ((6 << 8) + 8 )
|
|
|
#define PWM7_CH10 ((6 << 8) + 9 )
|
|
|
#define PWM7_CH11 ((6 << 8) + 10 )
|
|
|
#define PWM7_CH12 ((6 << 8) + 11 )
|
|
|
#define PWM7_CH13 ((6 << 8) + 12 )
|
|
|
#define PWM7_CH14 ((6 << 8) + 13 )
|
|
|
#define PWM7_CH15 ((6 << 8) + 14 )
|
|
|
#define PWM7_CH16 ((6 << 8) + 15 )
|
|
|
#define PWM8_CH1 ((7 << 8) + 0 )
|
|
|
#define PWM8_CH2 ((7 << 8) + 1 )
|
|
|
#define PWM8_CH3 ((7 << 8) + 2 )
|
|
|
#define PWM8_CH4 ((7 << 8) + 3 )
|
|
|
#define PWM8_CH5 ((7 << 8) + 4 )
|
|
|
#define PWM8_CH6 ((7 << 8) + 5 )
|
|
|
#define PWM8_CH7 ((7 << 8) + 6 )
|
|
|
#define PWM8_CH8 ((7 << 8) + 7 )
|
|
|
#define PWM8_CH9 ((7 << 8) + 8 )
|
|
|
#define PWM8_CH10 ((7 << 8) + 9 )
|
|
|
#define PWM8_CH11 ((7 << 8) + 10 )
|
|
|
#define PWM8_CH12 ((7 << 8) + 11 )
|
|
|
#define PWM8_CH13 ((7 << 8) + 12 )
|
|
|
#define PWM8_CH14 ((7 << 8) + 13 )
|
|
|
#define PWM8_CH15 ((7 << 8) + 14 )
|
|
|
#define PWM8_CH16 ((7 << 8) + 15 )
|
|
|
#define PWM9_CH1 ((8 << 8) + 0 )
|
|
|
#define PWM9_CH2 ((8 << 8) + 1 )
|
|
|
#define PWM9_CH3 ((8 << 8) + 2 )
|
|
|
#define PWM9_CH4 ((8 << 8) + 3 )
|
|
|
#define PWM9_CH5 ((8 << 8) + 4 )
|
|
|
#define PWM9_CH6 ((8 << 8) + 5 )
|
|
|
#define PWM9_CH7 ((8 << 8) + 6 )
|
|
|
#define PWM9_CH8 ((8 << 8) + 7 )
|
|
|
#define PWM9_CH9 ((8 << 8) + 8 )
|
|
|
#define PWM9_CH10 ((8 << 8) + 9 )
|
|
|
#define PWM9_CH11 ((8 << 8) + 10 )
|
|
|
#define PWM9_CH12 ((8 << 8) + 11 )
|
|
|
#define PWM9_CH13 ((8 << 8) + 12 )
|
|
|
#define PWM9_CH14 ((8 << 8) + 13 )
|
|
|
#define PWM9_CH15 ((8 << 8) + 14 )
|
|
|
#define PWM9_CH16 ((8 << 8) + 15 )
|
|
|
#define PWM10_CH1 ((9 << 8) + 0 )
|
|
|
#define PWM10_CH2 ((9 << 8) + 1 )
|
|
|
#define PWM10_CH3 ((9 << 8) + 2 )
|
|
|
#define PWM10_CH4 ((9 << 8) + 3 )
|
|
|
#define PWM10_CH5 ((9 << 8) + 4 )
|
|
|
#define PWM10_CH6 ((9 << 8) + 5 )
|
|
|
#define PWM10_CH7 ((9 << 8) + 6 )
|
|
|
#define PWM10_CH8 ((9 << 8) + 7 )
|
|
|
#define PWM10_CH9 ((9 << 8) + 8 )
|
|
|
#define PWM10_CH10 ((9 << 8) + 9 )
|
|
|
#define PWM10_CH11 ((9 << 8) + 10 )
|
|
|
#define PWM10_CH12 ((9 << 8) + 11 )
|
|
|
#define PWM10_CH13 ((9 << 8) + 12 )
|
|
|
#define PWM10_CH14 ((9 << 8) + 13 )
|
|
|
#define PWM10_CH15 ((9 << 8) + 14 )
|
|
|
#define PWM10_CH16 ((9 << 8) + 15 )
|
|
|
#define PWM11_CH1 ((10 << 8) + 0 )
|
|
|
#define PWM11_CH2 ((10 << 8) + 1 )
|
|
|
#define PWM11_CH3 ((10 << 8) + 2 )
|
|
|
#define PWM11_CH4 ((10 << 8) + 3 )
|
|
|
#define PWM11_CH5 ((10 << 8) + 4 )
|
|
|
#define PWM11_CH6 ((10 << 8) + 5 )
|
|
|
#define PWM11_CH7 ((10 << 8) + 6 )
|
|
|
#define PWM11_CH8 ((10 << 8) + 7 )
|
|
|
#define PWM11_CH9 ((10 << 8) + 8 )
|
|
|
#define PWM11_CH10 ((10 << 8) + 9 )
|
|
|
#define PWM11_CH11 ((10 << 8) + 10 )
|
|
|
#define PWM11_CH12 ((10 << 8) + 11 )
|
|
|
#define PWM11_CH13 ((10 << 8) + 12 )
|
|
|
#define PWM11_CH14 ((10 << 8) + 13 )
|
|
|
#define PWM11_CH15 ((10 << 8) + 14 )
|
|
|
#define PWM11_CH16 ((10 << 8) + 15 )
|
|
|
#define PWM12_CH1 ((11 << 8) + 0 )
|
|
|
#define PWM12_CH2 ((11 << 8) + 1 )
|
|
|
#define PWM12_CH3 ((11 << 8) + 2 )
|
|
|
#define PWM12_CH4 ((11 << 8) + 3 )
|
|
|
#define PWM12_CH5 ((11 << 8) + 4 )
|
|
|
#define PWM12_CH6 ((11 << 8) + 5 )
|
|
|
#define PWM12_CH7 ((11 << 8) + 6 )
|
|
|
#define PWM12_CH8 ((11 << 8) + 7 )
|
|
|
#define PWM12_CH9 ((11 << 8) + 8 )
|
|
|
#define PWM12_CH10 ((11 << 8) + 9 )
|
|
|
#define PWM12_CH11 ((11 << 8) + 10 )
|
|
|
#define PWM12_CH12 ((11 << 8) + 11 )
|
|
|
#define PWM12_CH13 ((11 << 8) + 12 )
|
|
|
#define PWM12_CH14 ((11 << 8) + 13 )
|
|
|
#define PWM12_CH15 ((11 << 8) + 14 )
|
|
|
#define PWM12_CH16 ((11 << 8) + 15 )
|
|
|
#define PWM13_CH1 ((12 << 8) + 0 )
|
|
|
#define PWM13_CH2 ((12 << 8) + 1 )
|
|
|
#define PWM13_CH3 ((12 << 8) + 2 )
|
|
|
#define PWM13_CH4 ((12 << 8) + 3 )
|
|
|
#define PWM13_CH5 ((12 << 8) + 4 )
|
|
|
#define PWM13_CH6 ((12 << 8) + 5 )
|
|
|
#define PWM13_CH7 ((12 << 8) + 6 )
|
|
|
#define PWM13_CH8 ((12 << 8) + 7 )
|
|
|
#define PWM13_CH9 ((12 << 8) + 8 )
|
|
|
#define PWM13_CH10 ((12 << 8) + 9 )
|
|
|
#define PWM13_CH11 ((12 << 8) + 10 )
|
|
|
#define PWM13_CH12 ((12 << 8) + 11 )
|
|
|
#define PWM13_CH13 ((12 << 8) + 12 )
|
|
|
#define PWM13_CH14 ((12 << 8) + 13 )
|
|
|
#define PWM13_CH15 ((12 << 8) + 14 )
|
|
|
#define PWM13_CH16 ((12 << 8) + 15 )
|
|
|
#define PWM14_CH1 ((13 << 8) + 0 )
|
|
|
#define PWM14_CH2 ((13 << 8) + 1 )
|
|
|
#define PWM14_CH3 ((13 << 8) + 2 )
|
|
|
#define PWM14_CH4 ((13 << 8) + 3 )
|
|
|
#define PWM14_CH5 ((13 << 8) + 4 )
|
|
|
#define PWM14_CH6 ((13 << 8) + 5 )
|
|
|
#define PWM14_CH7 ((13 << 8) + 6 )
|
|
|
#define PWM14_CH8 ((13 << 8) + 7 )
|
|
|
#define PWM14_CH9 ((13 << 8) + 8 )
|
|
|
#define PWM14_CH10 ((13 << 8) + 9 )
|
|
|
#define PWM14_CH11 ((13 << 8) + 10 )
|
|
|
#define PWM14_CH12 ((13 << 8) + 11 )
|
|
|
#define PWM14_CH13 ((13 << 8) + 12 )
|
|
|
#define PWM14_CH14 ((13 << 8) + 13 )
|
|
|
#define PWM14_CH15 ((13 << 8) + 14 )
|
|
|
#define PWM14_CH16 ((13 << 8) + 15 )
|
|
|
#define PWM15_CH1 ((14 << 8) + 0 )
|
|
|
#define PWM15_CH2 ((14 << 8) + 1 )
|
|
|
#define PWM15_CH3 ((14 << 8) + 2 )
|
|
|
#define PWM15_CH4 ((14 << 8) + 3 )
|
|
|
#define PWM15_CH5 ((14 << 8) + 4 )
|
|
|
#define PWM15_CH6 ((14 << 8) + 5 )
|
|
|
#define PWM15_CH7 ((14 << 8) + 6 )
|
|
|
#define PWM15_CH8 ((14 << 8) + 7 )
|
|
|
#define PWM15_CH9 ((14 << 8) + 8 )
|
|
|
#define PWM15_CH10 ((14 << 8) + 9 )
|
|
|
#define PWM15_CH11 ((14 << 8) + 10 )
|
|
|
#define PWM15_CH12 ((14 << 8) + 11 )
|
|
|
#define PWM15_CH13 ((14 << 8) + 12 )
|
|
|
#define PWM15_CH14 ((14 << 8) + 13 )
|
|
|
#define PWM15_CH15 ((14 << 8) + 14 )
|
|
|
#define PWM15_CH16 ((14 << 8) + 15 )
|
|
|
#define PWM16_CH1 ((15 << 8) + 0 )
|
|
|
#define PWM16_CH2 ((15 << 8) + 1 )
|
|
|
#define PWM16_CH3 ((15 << 8) + 2 )
|
|
|
#define PWM16_CH4 ((15 << 8) + 3 )
|
|
|
#define PWM16_CH5 ((15 << 8) + 4 )
|
|
|
#define PWM16_CH6 ((15 << 8) + 5 )
|
|
|
#define PWM16_CH7 ((15 << 8) + 6 )
|
|
|
#define PWM16_CH8 ((15 << 8) + 7 )
|
|
|
#define PWM16_CH9 ((15 << 8) + 8 )
|
|
|
#define PWM16_CH10 ((15 << 8) + 9 )
|
|
|
#define PWM16_CH11 ((15 << 8) + 10 )
|
|
|
#define PWM16_CH12 ((15 << 8) + 11 )
|
|
|
#define PWM16_CH13 ((15 << 8) + 12 )
|
|
|
#define PWM16_CH14 ((15 << 8) + 13 )
|
|
|
#define PWM16_CH15 ((15 << 8) + 14 )
|
|
|
#define PWM16_CH16 ((15 << 8) + 15 )
|
|
|
#endif
|
|
|
#endif // PWM_H
|
|
|
|