| 众拳刘洋【剑齿虎STM8】开发板学习笔记分享 第39讲   PWM输出实验  目 录  39.1 实验目的       熟悉并掌握TIM1、TIM2、TIM3产生PWM输出的方法。39.2 程序文件设计   39.2.1  main.c文件中的程序 主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。要想了解全面详实的程序,请大家参考光盘(网盘)中程序及程序注释。 /*********************************************************************** *   说    明: PWM输出例子 *   开发平台: 剑齿虎STM8开发板         *   关注微信公众平台微信号:"zxkj-ly",免费获取STM8资料。 *   STM8技术交流QQ群【335123291】 *   哈尔滨卓恩科技开发有限公司 * *   作    者: 刘洋 张殿东 *   版    本: V1.0 *   日    期: 2016-05-03    * *   IAR开发环境    版本 V2.20.1 *   ST库函数       版本 V2.2.0 ***********************************************************************/ #include "pbdata.h"//引入自定义公共头文件 void BSP_Configuration(void);//硬件初始化函数声明 /********************************************************************** *   函 数 名: main *   功能说明: c程序入口 *   形    参:无 *   返 回 值: 错误代码(无需处理) ***********************************************************************/ int main(void) {   BSP_Configuration();//硬件驱动初始化函数   while(1)//主程序循环,反复执行循环体里的语句   {     Tim1_PWM_Demo1();//PWM输出函数   } } /*********************************************************************** *   函 数 名: BSP_Configuration *   功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。 *   形    参:无 *   返 回 值: 无 ***********************************************************************/ void BSP_Configuration(void) {     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,   LED_Init();//调用LED初始化函数   Tim1_PWM_Init();//初始化PWM函数   rim();//打开总中断 } /*断言函数:它的作用是在编程的过程中为程序提供参数检查*/ #ifdef USE_FULL_ASSERT void assert_failed(u8* file,u32 line) {   while(1)   {   } } #endif39.2.2  pbdata.c文件中的程序 #include "pbdata.h"   //引入自定义公共头文件 /*************************************************************************** *   函 数 名: delay_us *   功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度) *   形    参:nCount要延时的微秒数,输入nCount=1微妙 *   返 回 值: 无 ***************************************************************************/ void delay_us(u16 nCount)   //16M 晶振时  延时 1个微妙 {     nCount*=3;//等同于 nCount=nCount*3  相当于把nCount变量扩大3倍     while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。 } /*************************************************************************** *   函 数 名: delay_ms *   功能说明: 毫秒延时程序,注意此函数的运行环境为(16M时钟速度) *   形    参:nCount要延时的毫秒数,输入nCount=1毫秒 *   返 回 值: 无 ***************************************************************************/ void delay_ms(u16 nCount)  //16M 晶振时  延时 1个毫秒 {     while(nCount--)//先判断while()循环体里的nCount数值是否大于0,大于0循环,减一执行循环体,等于0退出循环。     {         delay_us(1000);//调用微妙延时函数,输入1000等译演示1毫秒。     } } /*************************************************************************** *   函 数 名: Get_decimal *   功能说明: 获得数值小数部分 *   形    参:dt输入数据 deci小数位数,最多保留4位小数 *   返 回 值: 放大后的小数部分 ***************************************************************************/ u16 Get_decimal(double dt,u8 deci)   //获得数值小数部分 {     long x1=0;     u16 x2=0,x3=0;     if(deci>4) deci=4;     if(deci<1) deci=1;     x3=(u16)pow(10, deci);     x1=(long)(dt*x3);     x2=(u16)(x1%x3);     return x2; }39.2.3  pbdata.h文件中的程序 #ifndef _PBDATA_H//宏定义,定义文件名称 #define _PBDATA_H #include "stm8s.h"//引入STM8的头文件 #include "led.h"  //引用LED头文件 #include "tim1_pwm.h"  //引用定时器头文件 void delay_us(u16 nCount); //微秒延时程序 void delay_ms(u16 nCount); //毫秒延时程序 #endif //定义文件名称结束39.2.4  tim1-pwm.c文件中的程序 #include "pbdata.h" /*************************************************************************** *   函 数 名: Tim1_PWM_Init *   功能说明: 初始化高级定时器1 *   形    参:无 *   返 回 值: 无 ***************************************************************************/ void Tim1_PWM_Init(void) {     TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,2000,0);//初始化定时器1     TIM1_ARRPreloadConfig(ENABLE);//使能自动重装 TIM1_OC1Init(TIM1_OCMODE_PWM2,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,1000,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_LOW,TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_SET);     TIM1_Cmd(ENABLE);//开定时器     TIM1_CtrlPWMOutputs(ENABLE);//使能PWM主输出 } void Tim1_PWM_Demo1(void) {     u8 i=0;     for(i=1;i<20;i++)     {         TIM1_SetCompare1(i*100);//设置占空比         delay_ms(1000);     } }39.2.5  tim1-pwm.h文件中的程序 #ifndef _TIM1_PWM_H//宏定义,定义文件名称 #define _TIM1_PWM_H #include "stm8s.h" void Tim1_PWM_Init(void);//初始化定时器1 void Tim1_PWM_Demo1(void);//PWM输出例子     #endif //定义文件名称结束39.2.6  led.c文件中的程序    ……详细程序请参考程序例程。39.2.7  led.h文件中的程序    ……详细程序请参考程序例程。39.3 实验效果    我们使用示波器监视PWM波形输出,我们可以看到PWM波形每隔1秒钟占空比改变一次,改变量是增大100个裸数据,在程序中我们设计使PWM波形变化20次,反复执行。     图39.1 PWM波形第一次变化   图39.2 PWM波形第三次变化   图39.3 PWM波形第N次变化            
 |