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

STM8L之timer2产生PWM

发布时间: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


实验步骤

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”等文件夹同级的自定义文件


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

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