打印
[STM8]

STM8L之timer2产生PWM

[复制链接]
382|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2020-10-12 11:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

实验步骤


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口置低,否则红外射线会一直发出会导致功耗高。


使用特权

评论回复
沙发
tpgf|  楼主 | 2020-10-12 11:57 | 只看该作者

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”等文件夹同级的自定义文件,用于存放香瓜写的代码。

使用特权

评论回复
板凳
tpgf|  楼主 | 2020-10-12 11:57 | 只看该作者

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);




使用特权

评论回复
地板
zhuotuzi| | 2020-10-12 11:57 | 只看该作者
感谢分享啊。

使用特权

评论回复
5
tpgf|  楼主 | 2020-10-12 11:58 | 只看该作者
4、复用IO口为timer2

stm8的复用功能比较特殊,需要手动修改,香瓜在此入坑了两天。

1)点开工程的ST-LINK下的Option Bytes(网上有些资料显示必须在仿真模式下,香瓜实测不一定要在仿真模式下)



2)配置并保存



3)形成.obc的配置文件



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



5)rebuild all。


使用特权

评论回复
6
tpgf|  楼主 | 2020-10-12 11:58 | 只看该作者

实验结果

用逻辑分析仪连接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%)。



因此,实验成功。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15901

帖子

13

粉丝