pwm.c

来自「摩托罗拉MMC2107在ucosII的移植代码」· C语言 代码 · 共 112 行

C
112
字号
#include "pwm.h"

/*********************************************************************
   Macro Definitions                                               
/*********************************************************************/

/*********************************************************************
   Variable Definitions                                               
/*********************************************************************/
UINT32 MaxPulseWidth[ TIM_A_CHANNELS ];

/*
*********************************************************************************************************
*                                           INIT PWM
* Description: This function is called to initialize Pulse-Width Modulation mechanism.
*              The mechanism includes 4 Output Compare Channels.
*
* Arguments  : none
*********************************************************************************************************
*/
PWM_ReturnCode_t PWM_Init( void )
{
    TIM_A_ReturnCode_t status;
    
    /***********************************************************
    Enable Timer 1 with 1:1 prescaler based on System Clock
    ************************************************************/
    status = TIM_A_Init( (pTIM_A_t)__MMC2107_TIM1,
                    TIM_A_FUNCTION_ENABLED,
                    TIM_A_FAST_CLEAR_DISABLED,
                    TIM_A_INTERRUPT_DISABLED,
                    TIM_A_PULLUP_INPUT_DISABLED,
                    TIM_A_DRV_REDUCED_OUTPUT_DISABLED,
                    TIM_A_RESET_COMPARE_3_DISABLED,
                    TIM1_PRE
    );
    
    HANDLE_ERROR( status );
    
    return PWM_ERR_NONE;
}

PWM_ReturnCode_t PWM_ConfigChannel(  TIM_A_Channel_t           Ch,
                                     TIM_A_OutputAction_t      OutputAction,
                                     UINT32                    MaxWidth )
{
    TIM_A_ReturnCode_t status;
    
    MaxPulseWidth[ Ch ] = MaxWidth;
    /***********************************************************
    Set requested channel of timer 1 so that:
    1) its output will toggle on timer overflow (0xFFFF).
    2) it will be cleared upon reaching its compare value.
    !!! Initial compare value should be 0x1 (see function
    "PWM_SetPulseWidth" for the explanation).
    ************************************************************/
    status = TIM_A_ConfigChannelOuputCompare_f( (pTIM_A_t)__MMC2107_TIM1,
                    Ch,
                    TIM_A_OUTPUT_COMPARE_3_MASK_DISABLED,
                    TIM_A_TOGGLE_ON_OVERFLOW_ENABLED,
                    TIM_A_OUTPUT_ACTION_CLEAR,
                    TIM_A_INTERRUPT_DISABLED,
                    0x0001 /* initial compare value */
    );
    
    HANDLE_ERROR( status );
    
    return PWM_ERR_NONE;
}

PWM_ReturnCode_t PWM_SetPulseWidth(  TIM_A_Channel_t           Ch,
                                     UINT32                    Width )
{
    TIM_A_ReturnCode_t status;
    
    if( Width > MaxPulseWidth[ Ch ] )
        return PWM_ERR_WIDTH_OVERFLOW;
    
    /***********************************************************
    Convert pulse width from user-defined units to compare value
    of requested Channel in Timer 1 dedicated to PWM.
    ************************************************************/
    Width *= TIM_A_MAX_COMPARE_VALUE;
    Width /= MaxPulseWidth[ Ch ];
    
    /***********************************************************
    Be aware! Compare value 0x0000 has no effect when channel is set
    to be toggled on timer overflow. The reason for this is that
    both of them happen when counter rolls over from 0xFFFF to
    0x0000. As a result, two events create a collision, trying
    to change a signal in opposite directions. Timer overflow takes
    over Output Compare.
    Constant toggling on timer overflow will create the dynamic
    in which half of timer periods will be full-scaled (remember,
    initially 0 was written into Compare Value).
    To prevent this, we set compare value to 1 so Output Compare
    could be executed. From user point of view, the difference
    between 0 and 1 on 65535 scale is practically unnoticeable.
    ************************************************************/
    if( Width == 0x0000 ) Width = 0x0001;
    
    status = TIM_A_SetCompareValue_f( (pTIM_A_t)__MMC2107_TIM1,
                        Ch,
                        Width
    );
    
    HANDLE_ERROR( status );
    
    return (PWM_ERR_NONE);
}

⌨️ 快捷键说明

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