简介
本文介绍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”等文件夹同级的自定义文件
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』