?? pwm.c
字號(hào):
/**
* \addtogroup Pwm
* @{
*/
/*****************************************************************************/
/**
* \file Pwm.c
* Pulse width modulation code for the T89C51AC2 and Keil C51.
* \author Copyright (c) 2005, Murray R. Van Luyn. <vanluynm@iinet.net.au>
* \version 0.0
* \date 07-10-05
*/
/*****************************************************************************/
/*****************************************************************************
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#include "Pwm.h"
/*****************************************************************************
*
* Structures
*
*****************************************************************************/
/*****************************************************************************
*
* Global Variables Definitions
*
*****************************************************************************/
/*****************************************************************************
*
* Private Function Prototypes
*
*****************************************************************************/
/*****************************************************************************
*
* Public Function Implementation
*
*****************************************************************************/
/*****************************************************************************
*
* pwm_init()
*
*****************************************************************************/
void pwm_init(void)
{
// Set PCA counter to mode 1. Increment at XTAL / 12 in X1 mode
// i.e. 256kHz with 18.432MHz Xtal in X1 mode
CMOD = 0x00;
// Reset PCA low and high counter registers.
CL = 0x00;
CH = 0x00;
#ifdef PWM_CHANNEL_0_ENABLE
// Set PCA counter 0 to auto reloading 8-bit PWM mode.
// i.e. ECOM0 = 1, PWM0 = 1.
CCAPM0 = 0x42;
// Reset PCA counter compare register.
CCAP0L = 0x00;
// Start with 0% duty cycle in reload registers.
CCAP0H = 0x00;
#endif
#ifdef PWM_CHANNEL_1_ENABLE
// Set PCA counter 1 to auto reloading 8-bit PWM mode.
// i.e. ECOM1 = 1, PWM1 = 1.
CCAPM1 = 0x42;
// Reset PCA counter compare register.
CCAP1L = 0x00;
// Start with 0% duty cycle in reload registers.
CCAP1H = 0x00;
#endif
#ifdef PWM_CHANNEL_2_ENABLE
// Set PCA counter 2 to auto reloading 8-bit PWM mode.
// i.e. ECOM2 = 1, PWM2 = 1.
CCAPM2 = 0x42;
// Reset PCA counter compare register.
CCAP2L = 0x00;
// Start with 0% duty cycle in reload registers.
CCAP2H = 0x00;
#endif
#ifdef PWM_CHANNEL_3_ENABLE
// Set PCA counter 3 to auto reloading 8-bit PWM mode.
// i.e. ECOM3 = 1, PWM3 = 1.
CCAPM3 = 0x42;
// Reset PCA counter compare register.
CCAP3L = 0x00;
// Start with 0% duty cycle in reload registers.
CCAP3H = 0x00;
#endif
#ifdef PWM_CHANNEL_4_ENABLE
// Set PCA counter 4 to auto reloading 8-bit PWM mode.
// i.e. ECOM4 = 1, PWM4 = 1.
CCAPM4 = 0x42;
// Reset PCA counter compare register.
CCAP4L = 0x00;
// Start with 0% duty cycle in reload registers.
CCAP4H = 0x00;
#endif
// Set PCA counter running
CR = 1;
return;
}
/*****************************************************************************
*
* pwm_set_channel()
*
*****************************************************************************/
void pwm_set_channel(unsigned char channel, unsigned char duty_cycle)
{
// Load new duty cycle into CCAPnH
switch(channel)
{
#ifdef PWM_CHANNEL_0_ENABLE
case PWM_CHANNEL_0:
{
CCAP0H = duty_cycle;
}
#endif
#ifdef PWM_CHANNEL_1_ENABLE
case PWM_CHANNEL_1:
{
CCAP1H = duty_cycle;
}
#endif
#ifdef PWM_CHANNEL_2_ENABLE
case PWM_CHANNEL_2:
{
CCAP2H = duty_cycle;
}
#endif
#ifdef PWM_CHANNEL_3_ENABLE
case PWM_CHANNEL_3:
{
CCAP3H = duty_cycle;
}
#endif
#ifdef PWM_CHANNEL_4_ENABLE
case PWM_CHANNEL_4:
{
CCAP4H = duty_cycle;
}
#endif
}
return;
}
/*****************************************************************************
*
* Private Function Implementation
*
*****************************************************************************/
/** @} */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -