【STM8L】STM8L之timer2产生PWM

来源:互联网 发布:mac网络图 编辑:程序博客网 时间:2024/05/21 17:16

本篇博文最后修改时间:2016年12月13日,06:20。


一、简介

本文介绍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

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i


四、实验步骤

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产生复用配置,再用其他方式进行下载程序。在量产时本文的步骤能否依然有效,仍有待后续实测。







1 0
原创粉丝点击