众拳刘洋【剑齿虎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) { } } #endif 39.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次变化
|