⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 PID motor control with 8051
💻 C
字号:
/**
 * \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
 *
 *****************************************************************************/


/** @} */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -