STM8L之timer2产生PWM

发布者:WhisperingWish最新更新时间:2019-12-18 来源: eefocus关键字:STM8L  timer2  PWM 手机看文章 扫描二维码
随时随地手机看文章

简介

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

[1] [1]
关键字:STM8L  timer2  PWM 引用地址:STM8L之timer2产生PWM

上一篇:STM8L之红外发射(定时器中断产生38K信号)
下一篇:STM8L之内部16M晶振

推荐阅读最新更新时间:2024-11-04 12:42

新型非PWM功率单元在完美无谐波高压变频器中的应用
1 引言   随着变频调速技术的发展,作为大容量传动的高压变频调速技术得到了广泛应用。高压电动机利用高压变频器可以实现无级调速,既可满足生产工艺过程对电动机调速控制的要求,又可节约能源,降低生产成本[1]。自1994年美国罗宾康公司推出第一代完美无谐波高压变频器以来,由于其性能好、可靠性高、维修简单等优点,在欧美、日本、中国等市场一直处于领先地位,完美无谐波高压变频器较之普通高压变频器,无论从变频器控制性能、可靠性保证、制造工艺等方面都提高了很大的一个档次[1]。但是,到目前为止,这种完美高压变频器的功率单元的整流部分采用单向二极管串联,逆变器部分输出采用多电平移相式pwm技术,每个功率单元脉冲控制都是采用pwm控制,逆变器的
[电源管理]
新型非<font color='red'>PWM</font>功率单元在完美无谐波高压变频器中的应用
40W全电压数字式离线PWM LED驱动方案
iW3620 使用 iWatt 的专利 PrimAccurate 一次侧控制技术,由于不再需要传统的光隔离器和外部补偿元件,因此减少了外部元件数量,从而缩小了产品尺寸并降低了成本。该设备通过在准谐振模式下工作来优化高负载时的效率,并使用逐脉冲波形分析来提供优于传统离线解决方案的环路响应特性。iW3620 具有全面的保护功能,并集成了iWatt的EZ-EMI技术,可以帮助实现最终应用中的EMI 管理,从而为最终用户提供了一个易于设计且可靠的固态照明解决方案。 典型应用原理图 特性 PrimAccurate - 隔离型离线交流/直流控制器 可轻松满足电磁干扰国际标准的 EZ-EMI 设计 非常适合于最大功率为4
[电源管理]
40W全电压数字式离线<font color='red'>PWM</font> LED驱动方案
微芯有刷直流电机控制方案
 有刷直流电机通过电刷进行换向。以下是关于有刷直流电机的一些关键点: 典型的转子(也就是电枢)上有绕组,并且在其末端连有换向器 电刷与换向部分连接和断开,从而将能量传递到电枢 永磁直流电机的定子(或外部机筒)将有两个或更多个永磁磁极 通电绕组和定子磁体的相反极性互相作用,从而导致转子旋转直到与定子同相位 一旦转子与定子对齐,电刷与换向器接触并导通下一个绕组 由于速度和转矩与所应用的电压/电流成正比,因而有刷直流电机控制起来相对容易。由于电枢上有绕组,因而转子很重,较大的惯性使其较难启动和停止。转子上的绕组会产生热量,并且较难散热。 有刷直流电机的主要特性 良好的可控性:开/关,成正比 线性转
[嵌入式]
安森美将在APEC展示高集成度控制器
新的PFC和PWM控制器集成的功能和保护特性减少元器件数量并提升安全性。 2014年3月18日 – 推动高能效创新的安森美半导体(ON Semiconductor,美国纳斯达克上市代号:ONNN)于3月16日至20日在美国德州Fort Worth的本年度APEC上展示公司的最新集成控制器。这展会是北美地区首要的应用功率电子展会,为安森美半导体提供极佳的论坛,以展示公司宽广阵容的器件,帮助设计高能效、安全及高性价比的功率电子产品,用于网络、计算机、消费及便携电子产品、白家电及固态照明等多种终端市场。 在NCP1565双模有源钳位脉宽调制(PWM)控制器演示中,一款电信行业100瓦(W)四分之一砖电源被
[其他]
巧用TL494制作PWM多用驱动板
这是一个用TL494做PWM控制的多用途驱动卡,电路是常规的,没有什么技术含量。   电路由二部分组成,图中上面是494/PWM控制部分,为了简单起见,我用494直接来推动TLP250光藕,这样,输出的波形就有保障。现在的频率约28K,输出波形为+15V和-6V,既可以驱动MOS管,也可以驱动IGBT管。下面部分是辅助电源,AC220V输出经整流滤波送到TNY275控制芯片,这是一个单片反激式小功率开关电源,一共输出4路互相隔离的电源:一路为15V,经78L12稳压供给TL494,另三路为21V,分别送TLP250的输出端,为光藕内部的输出电路供电。   这个驱动板,主要是用来驱动大功率全桥硬开关模式的开关电源,当然,也可以
[电源管理]
巧用TL494制作<font color='red'>PWM</font>多用驱动板
ARM 学习笔记七 (PWM试验)
PWM-脉宽调制。我的理解是通过控制一个计数器来实现不同脉宽的输出,从而驱动蜂鸣器发出不同的声音。 本实验用到的寄存器如下: GPBCON -- I/O端口配置寄存器 B 00=Input 01=Output 10=PWM 11=Reserved GPBDAT -- I/O端口数据寄存器 B GPFUP --I/O端口上拉电阻使能寄存器 B 0=Enable 1=Disabled TCFG0 -- 时钟配置寄存器0 (主要是设置预分频) 定时器输入时钟频率=PCLK/{预分频}/{分割值} {预分频}=1~255 {分割值}=2,4,8,16,32 Address
[单片机]
A Novel ZCS PWM Half- bridge Converter
摘要:阐述了零电流开关(ZCS)技术在半桥变换器电路中的应用。从电路原理、各工作模态进行了分析,并给出了实验结果。着重分析了主开关管和辅助开关管零电流开通和关断的过程及实现条件。该电路主要针对存在拖尾电流的IGBT设计,可以提高IGBT的工作频率。 关键词:零电流开关;半桥变换器;谐振网络;IGBT Introduction In order to improve the whole efficiency of the electronic equipment, the search for more efficient soft switching technique has been developed. For sw
[应用]
一种适合教学的开关电源设计及调试
线性稳压电路具有结构简单,调整方便,输出电压脉动小的优点,但缺点是效率低,一般只有20%~40%,并且比较笨重。开关型稳压电路能克服线性稳压电源的缺点,具有效率高,一般能达到65%~90%,并且体积小,重量轻,对电网电压要求不高,因而在实际生活中得到广泛应用。也正因为其应用的广泛性,相应专业的学生就更应该深刻和熟练地掌握它,在此以设计脉冲宽度调制型开关电路(PWM)为基础,详细解说该系统的调试过程。 1 系统设计原理 PWM型的开关电源整体框图如图1所示。变压、整流、滤波模块处理起来比较简单,只要采用相应的变压器、单相全波整流、电容式滤波即可实现,这里不用更多的篇幅介绍。此系统的核心模块是方框图中的闭合(负反馈)模块。如果直接采
[电源管理]
一种适合教学的开关电源设计及调试
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved