微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > STM8 PWM的实现

STM8 PWM的实现

时间:10-02 整理:3721RD 点击:
****************************************************************************************/
#include "pwm.h"
#define ARR ((uint8_t)499)
static void Delay(u16 nCount);
/**************************************************************************
* 函数名:PWM_Init
* 描述  :PWM初始化
* 输入  :无
*
* 输出  :无
* 返回  :无
* 调用  :外部调用
*************************************************************************/
void PWM_Init(void)
{
    TIM3_PSCR =0x04;
    /* Set the Autoreload value */
    TIM3_ARRH = (uint8_t)(ARR >> 8);
    TIM3_ARRL = (uint8_t)(ARR);
    /*TIM2 Frequency=16M/16/(499+1)=2K*/
    /* PWM1 Mode configuration: Channel1
    TIM2 Channel1 duty cycle = [TIM2_CCR1/(TIM2_ARR + 1)] * 100 = 50%*/
  #if TIM3_Channel==TIM3_Channel1
    /*TIM2 Frequency = TIM2 counter clock/(ARR + 1) */
    TIM3_OC1Init(TIM3_OCMODE_PWM1, TIM3_OUTPUTSTATE_ENABLE,250, TIM3_OCPOLARITY_HIGH);

  #elif TIM3_Channel==TIM3_Channel2
    TIM3_OC2Init(TIM3_OCMODE_PWM2, TIM3_OUTPUTSTATE_ENABLE,500, TIM3_OCPOLARITY_HIGH);
  #endif
  TIM3_CR1 |= (uint8_t)MASK_TIM3_CR1_CEN;
}
/**************************************************************************
* 函数名:TIM3_OC1Init
* 描述  :TIM3 第一通道PWM初始化
* 输入  :TIM3_OCMode   常用参数TIM3_OCMODE_PWM1:0x60 ,TIM3_OCMODE_PWM2:0x70
           TIM3_OutputState  TIM3_OUTPUTSTATE_ENABLE:0x11
           TIM3_Pulse     占空比
           TIM3_OCPolarity  TIM3_OCPOLARITY_HIGH:0x00 ,TIM3_OCPOLARITY_LOW:0x22
*
* 输出  :无
* 返回  :无
* 调用  :外部调用
*************************************************************************/
void TIM3_OC1Init(uint8_t TIM3_OCMode,uint8_t TIM3_OutputState,uint16_t TIM3_Pulse,uint8_t TIM3_OCPolarity )
{
      /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */
    TIM3_CCER1 &= (uint8_t)(~( MASK_TIM3_CCER1_CC1E | MASK_TIM3_CCER1_CC1P));
    /* Set the Output State &  Set the Output Polarity  */
    TIM3_CCER1 |= (uint8_t)((uint8_t)(TIM3_OutputState & MASK_TIM3_CCER1_CC1E ) |
                             (uint8_t)(TIM3_OCPolarity & MASK_TIM3_CCER1_CC1P));
    /* Reset the Output Compare Bits  & Set the Ouput Compare Mode */
    TIM3_CCMR1 = (uint8_t)((uint8_t)(TIM3_CCMR1 & (uint8_t)(~(uint8_t)MASK_TIM3_CCMR1_OC1M)) |
                            (uint8_t)TIM3_OCMode);
    /* Set the Pulse value */
    TIM3_CCR1H = (uint8_t)(TIM3_Pulse >> 8);
    TIM3_CCR1L = (uint8_t)(TIM3_Pulse);
    TIM3_CCMR1 |= (uint8_t)MASK_TIM3_CCMR1_OC1PE;
}
/**************************************************************************
* 函数名:TIM3_OC2Init
* 描述  :TIM3 第二通道PWM初始化
* 输入  :TIM3_OCMode   常用参数TIM3_OCMODE_PWM1:0x60 ,TIM3_OCMODE_PWM2:0x70
           TIM3_OutputState  TIM3_OUTPUTSTATE_ENABLE:0x11
           TIM3_Pulse     占空比
           TIM3_OCPolarity  TIM3_OCPOLARITY_HIGH:0x00 ,TIM3_OCPOLARITY_LOW:0x22
*
* 输出  :无
* 返回  :无
* 调用  :外部调用
*************************************************************************/
void TIM3_OC2Init(uint8_t TIM3_OCMode,uint8_t TIM3_OutputState,uint16_t TIM3_Pulse,uint8_t TIM3_OCPolarity )
{
      /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */
    TIM3_CCER1 &= (uint8_t)(~(MASK_TIM3_CCER1_CC2E | MASK_TIM3_CCER1_CC2P));
    /* Set the Output State &  Set the Output Polarity  */
    TIM3_CCER1 |= (uint8_t)((uint8_t)(TIM3_OutputState & MASK_TIM3_CCER1_CC2E ) |
                             (uint8_t)(TIM3_OCPolarity & MASK_TIM3_CCER1_CC2P));
    /* Reset the Output Compare Bits  & Set the Ouput Compare Mode */
    TIM3_CCMR2 = (uint8_t)((uint8_t)(TIM3_CCMR1 & (uint8_t)(~(uint8_t)MASK_TIM3_CCMR2_OC2M )) |
                            (uint8_t)TIM3_OCMode);
    /* Set the Pulse value */
    TIM3_CCR2H = (uint8_t)(TIM3_Pulse >> 8);
    TIM3_CCR2L = (uint8_t)(TIM3_Pulse);
    TIM3_CCMR2 |= (uint8_t)MASK_TIM3_CCMR2_OC2PE;
}

void SetTIM3_PWM_Frequency(uint16_t TIM3_Period)
{
      /* Set the Autoreload value */
    TIM3_ARRH = (uint8_t)(TIM3_Period >> 8);
    TIM3_ARRL = (uint8_t)(TIM3_Period);
}
void SetTIM3_PWM_DutyCycle( uint16_t TIM3_Pulse)
{

  #if TIM3_Channel==TIM3_Channel1
    /* Set the Pulse value */
    TIM3_CCR1H = (uint8_t)(TIM3_Pulse >> 8);
    TIM3_CCR1L = (uint8_t)(TIM3_Pulse);
  #elif TIM3_Channel==TIM3_Channel2
    TIM3_CCR2H = (uint8_t)(TIM3_Pulse >> 8);
    TIM3_CCR2L = (uint8_t)(TIM3_Pulse);  
  #endif
}
void TestPWM_LED(void)
{
  u16 Duty_Val;
  for(Duty_Val=0;Duty_Val<499;Duty_Val++)
  {
    SetTIM3_PWM_DutyCycle(Duty_Val);
    Delay(0x3fff);
  }
}

static void Delay(u16 nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

学习一下,谢谢分享!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top