简介
本文介绍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”等文件夹同级的自定义文件,用于存放香瓜写的代码。
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产生复用配置,再用其他方式进行下载程序。在量产时本文的步骤能否依然有效,仍有待后续实测。
上一篇:STM8L之红外发射(定时器中断产生38K信号)
下一篇:STM8L之内部16M晶振
推荐阅读最新更新时间:2024-11-04 12:42