【STM8L】STM8L之timer2产生PWM

本篇博文最后修改时间: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

联系方式:[email protected]

香瓜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:            [email protected]       
//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:            [email protected]                
//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:            [email protected]                
//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:            [email protected]                
//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:            [email protected]       
//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

【STM8L】STM8L之timer2产生PWM_第1张图片


4)添加驱动的路径

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

2、添加库的驱动

1)添加库的驱动文件

【STM8L】STM8L之timer2产生PWM_第2张图片


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(网上有些资料显示必须在仿真模式下,香瓜实测不一定要在仿真模式下)

【STM8L】STM8L之timer2产生PWM_第3张图片


2)配置并保存

【STM8L】STM8L之timer2产生PWM_第4张图片


3)形成.obc的配置文件

【STM8L】STM8L之timer2产生PWM_第5张图片


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

【STM8L】STM8L之timer2产生PWM_第6张图片


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







你可能感兴趣的:(STM8L)