×
嵌入式 > 技术百科 > 详情

STM8L之timer2产生PWM - CSDN博客

发布时间:2020-06-17 发布时间:
|

一、简介


本文介绍STM8L系列如何使用timer2产生38K频率的PWM。


其中,本文使用的是timer2的第1通道(PB0)。




二、实验平台


编译软件:IAR for STM8 1.42.2


硬件平台:stm8l101f3p6开发板


仿真器:ST-LINK


库函数版本:STM8L_STMTouch_Lib_V1.1.0




三、版权声明


原文地址:http://blog.csdn.NET/feilusia



四、实验步骤


1、工程中添加自己写的定时器2的驱动


1)写一个驱动GUA_Timer2_PWM.c (存放在工程的USER文件夹中)


//******************************************************************************                          

//name:             GUA_Timer2_PWM.c             

//introduce:        定时器2的PWM驱动      

//author:           甜甜的大香瓜                   

//email:            897503845@qq.com       

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.12.01    

//******************************************************************************  

#include "stm8l10x.h"

#include "GUA_Timer2_PWM.h"

 

/*********************宏定义************************/

#ifndef U8  

typedef unsigned char U8;  

#endif  

 

#ifndef U16  

typedef unsigned short U16;  

#endif  

 

#ifndef U32  

typedef unsigned long U32;  

#endif  

 

//红外引脚宏

#define GUA_TIMER2_PWM_PORT             GPIOB

#define GUA_TIMER2_PWM_PIN              GPIO_Pin_0

#define GUA_TIMER2_PWM_MODE             GPIO_Mode_Out_PP_High_Fast

 

//红外开关宏

#define GUA_TIMER2_PWM_ON               SET     //高电平开

#define GUA_TIMER2_PWM_OFF              RESET   //低电平关

//******************************************************************************        

//name:             GUA_Timer2_PWM_Status        

//introduce:        定时器2的PWM开关    

//parameter:        nGUA_Timer2_PWM_Status: GUA_TIMER2_PWM_STATUS_ON or GUA_TIMER2_PWM_STATUS_OFF      

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com                

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.12.01                      

//******************************************************************************  

void GUA_Timer2_PWM_Status(U8 nGUA_Timer2_PWM_Status)

{

  //打开PWM

  if(nGUA_Timer2_PWM_Status == GUA_TIMER2_PWM_STATUS_ON)

  {

    TIM2_CtrlPWMOutputs(ENABLE);

    //GPIO_WriteBit(GUA_TIMER2_PWM_OFF, GUA_TIMER2_PWM_PIN, GUA_TIMER2_PWM_ON);       

  }

  //关闭PWM

  else

  {

    TIM2_CtrlPWMOutputs(DISABLE); 

    GPIO_WriteBit(GUA_TIMER2_PWM_PORT, GUA_TIMER2_PWM_PIN, GUA_TIMER2_PWM_OFF);    

  }

}

 

//******************************************************************************        

//name:             GUA_Timer2_PWM_SetDutyCycle        

//introduce:        定时器2的PWM设置占空比    

//parameter:        nGUA_Timer2_PWM_DutyCycle: 0~100为0%~100%      

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com                

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.12.01                        

//******************************************************************************  

void GUA_Timer2_PWM_SetDutyCycle(U8 nGUA_Timer2_PWM_DutyCycle)

{

  TIM2_SetCompare1(GUA_TIMER2_PWM_FREQUENCY_VALUE*nGUA_Timer2_PWM_DutyCycle/100); 

}

 

//******************************************************************************        

//name:             GUA_Timer2_PWM_Init        

//introduce:        定时器2的PWM初始化     

//parameter:        none       

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com                

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.12.01                       

//******************************************************************************  

void GUA_Timer2_PWM_Init(void)

{

  //PB0通道IO配置为输出

  GPIO_Init(GUA_TIMER2_PWM_PORT, GUA_TIMER2_PWM_PIN, GUA_TIMER2_PWM_MODE); 

  

  //时钟配置

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);  

 

  //配置

  TIM2_DeInit();                                                                                                //复位

  TIM2_TimeBaseInit(TIM2_Prescaler_1, TIM2_CounterMode_Up, GUA_TIMER2_PWM_FREQUENCY_VALUE);                     //每26us定时重新计数一次,38K      

  TIM2_OC1Init(TIM2_OCMode_PWM2, TIM2_OutputState_Enable, 0, TIM2_OCPolarity_High, TIM2_OCIdleState_Reset);     //先空闲后运行的模式、输出使能、占空比初始化为0、运行时为高、死区时为低

  TIM2_Cmd(ENABLE);                                                                                             //使能定时器2

 

  //关闭PWM

  GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_OFF);

}

这里总计数值为26us,占空比暂时初始化为0%。

注意,关闭PWM时需要把IO口置低,否则红外射线会一直发出会导致功耗高。




2)写一个驱动头文件GUA_Timer2_PWM.h(存放在工程的USER文件夹中)


//******************************************************************************                          

//name:             GUA_Timer2_PWM.h          

//introduce:        定时器2的PWM驱动的头文件      

//author:           甜甜的大香瓜                   

//email:            897503845@qq.com       

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.12.01   

//****************************************************************************** 

#ifndef _GUA_TIMER2_PWM_H_

#define _GUA_TIMER2_PWM_H_

 

/*********************宏定义************************/  

//PWM的开关宏

#define GUA_TIMER2_PWM_STATUS_ON                0       //PWM打开

#define GUA_TIMER2_PWM_STATUS_OFF               1       //PWM关闭

 

//PWM的频率值

#define GUA_TIMER2_PWM_FREQUENCY_VALUE          16*26   //26us为一个周期

/*********************外部函数声明************************/ 

void GUA_Timer2_PWM_Status(unsigned char nGUA_Timer2_PWM_Status);

void GUA_Timer2_PWM_SetDutyCycle(unsigned char nGUA_Timer2_PWM_DutyCycle);

void GUA_Timer2_PWM_Init(void);

 

#endif

3)工程中添加GUA_Timer2_PWM.c


4)添加驱动的路径


$PROJ_DIR$\..\USER   

注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。


2、添加库的驱动

1)添加库的驱动文件

3、应用层中调用


1)添加头文件(main.c中)


#include "GUA_Timer2_PWM.h"


2)初始化(main.c的main函数中)

  //定时器2的PWM初始化

  GUA_Timer2_PWM_Init();  


3)测试代码(可以自行放置在不同按键处理代码中)


①开启50%占空比的PWM



  GUA_Timer2_PWM_SetDutyCycle(50);

  GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_ON);


②关闭PWM


  GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_OFF);


③开启60%占空比的PWM


  GUA_Timer2_PWM_SetDutyCycle(60);

  GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_ON);


4、复用IO口为timer2

stm8的复用功能比较特殊,需要手动修改,香瓜在此入坑了两天。

1)点开工程的ST-LINK下的Option Bytes(网上有些资料显示必须在仿真模式下,香瓜实测不一定要在仿真模式下)



2)配置并保存



3)形成.obc的配置文件



4)使工程能够自动加载保存的配置文件



5)rebuild all。


五、实验结果

用逻辑分析仪连接PB0,分别抓取三个测试代码的波形,实验结果如下:

1、开启50%占空比的PWM

可见PB0产生了38.647K的方波,占空比为13/25.875(约为50.2%)。


2、关闭PWM

无产生波形


3、开启60%占空比的PWM


可见PB0产生了38.647K的方波,占空比为15.5/25.875(约为59.9%)。



因此,实验成功。


注:香瓜实测仿真多次,不用重复配置复用功能的步骤。网上大多数是使用STVD产生复用配置,再用其他方式进行下载程序。在量产时本文的步骤能否依然有效,仍有待后续实测。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机