分享

STM8S系列单片机TIM1的PWM配置与TIM2的区别

 goodwangLib 2020-06-13

为什么STM8的PWM用TIM1不能输出,TIM2可以,下面针对TIM1的PWM输出做了下列程序代码的编写。

STM8S系列单片机

PC1管脚来控制PWM的输出,即TIM1_CH1通道

PC2管脚来控制PWM的输出,即TIM1_CH2通道

PC3管脚来控制PWM的输出,即TIM1_CH3通道

 

//PWM初始化
void Driver_PWMON(u8 ch,u8 Num)

    //开TIM1时钟
    CLK->PCKENR1 |= CLK_PCKENR1_TIM1;
    
    //设置PWM频率,Fpwm=Fmaster/TIM2_ARR 
    //这里Fpwm = 2000000/100 = 20K
    TIM1->ARRH = 0;
    TIM1->ARRL = 100;
                    
    //启动计数,开始PWM输出
    TIM1->BKR |= TIM1_BKR_MOE;
    
    switch(ch)
    {
        case 1:
            
            TIM1->CCMR1 |= 0x70;//设置TIM1_CH1为PWM模式2 有效电平为高电平
            
            pwm_ch_on(1);//开启TIM1_CH1 通道输出
                        
            TIM1->CCR1H = 0;//初始化PWM通道占空比 1:1   
            TIM1->CCR1L = Num;
            break;
        case 2:
            TIM1->CCMR2 |= 0x70;//设置TIM1_CH2为PWM模式2 有效电平为高电平
            
            pwm_ch_on(2);//开启TIM1_CH1 通道输出
                        
            TIM1->CCR2H = 0;//初始化PWM通道占空比 1:1   
            TIM1->CCR2L = Num;
            break;
        case 3:
            TIM1->CCMR3 |= 0x70;//设置TIM1_CH3为PWM模式2 有效电平为高电平
            
            pwm_ch_on(3);//开启TIM1_CH1 通道输出
                        
            TIM1->CCR3H = 0;//初始化PWM通道占空比 1:1   
            TIM1->CCR3L = Num;
            break;
        case 4:
            TIM1->CCMR4 |= 0x70;//设置TIM1_CH4为PWM模式2 有效电平为高电平
            
            pwm_ch_on(4);//开启TIM1_CH1 通道输出
                        
            TIM1->CCR4H = 0;//初始化PWM通道占空比 1:1   
            TIM1->CCR4L = Num;
            break;
    }
    TIM1->CR1 |= TIM1_CR1_CEN;
}

//PWM占空比调节 0-100
void Driver_PWMSet(u8 ch,u8 Num)
{
    if(Num > 100)
          return;
    switch(ch)
    {
        case 1:
             TIM1->CCR1L = Num;
            break;
        case 2:
            TIM1->CCR2L = Num;
            break;
        case 3:
            TIM1->CCR3L = Num;
            break;
        case 4:
            TIM1->CCR4L = Num;
            break;
    }
}

//打开PWM通道
void pwm_ch_on(u8 ch)
{
    switch(ch)
    {
        case 1:
            TIM1->CCER1 |= 0x01;
            break;
        case 2:
            TIM1->CCER1 |= 0x10;
            break;
        case 3:
            TIM1->CCER2 |= 0x01;
            break;
        case 4:
            TIM1->CCER2 |= 0x10;
            break;
    }
}

//关闭PWM通道
void pwm_ch_close(u8 ch)
{
    switch(ch)
    {
        case 1:
            TIM1->CCER1  &= ~0x01;
            break;
        case 2:
            TIM1->CCER1  &= ~0x10;
            break;
        case 3:
            TIM1->CCER2  &= ~0x01;
            break;
        case 4:
            TIM1->CCER2  &= ~0x10;
            break;
    }
}

//运行主函数

int main(void)

  Driver_PWMON(1,0);
  Driver_PWMON(2,0);
  Driver_PWMON(3,0);
  while(1)
  { 
     u8 a= 0,b=0;
    for(b=1 ;b<4; b++)
    {
      for(a=1;a<99;a++)
      {
        Driver_PWMSet(b,a);
        delay_ms(5);
      }
      for(a=99;a>0;a--)
      {
        Driver_PWMSet(b,a);
        delay_ms(5);
      }
    }
  }
}

 

TIM2的跟TIM1的区别是:TIM1->BKR |= TIM1_BKR_MOE;

TIM2不需要配置这个寄存器。

OCi的输出使能通过(TIM1_CCERi和TIM1_BKR寄存器中)CCiE、MOE、OISi和
OSSR位和OSSI位的组合来控制。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多