第十三章 PWM原理和应用_第1页
第十三章 PWM原理和应用_第2页
第十三章 PWM原理和应用_第3页
第十三章 PWM原理和应用_第4页
第十三章 PWM原理和应用_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十三章PWM原理和应用何宾2023.09设计实例一:呼吸灯的设计与实现在该设计中,将高级PWM定时器的8个输出通道连接到STC32G系列单片机硬件开发平台上的8个LED灯。当分别改变8个输出通道PWM信号的占空比时,会改变8个LED灯的亮度。由于LED灯由最亮变到最暗,然后由最暗变到最亮,这样循环变化,很像人呼气和吸气的过程,因此把由于PWM控制LED灯的亮度变化称为“呼吸灯”设计实例一:呼吸灯的设计与实现

--添加type.h文件#ifndef__PWM__//如果没有定义__PWM__#define__PWM__//定义__PWM__#include"stc32G.h"//包含stc32G.h头文件,该文件有寄存器定义

typedef unsignedchar u8;//自定义无符号字符型u8typedef unsignedint u16;//自定义无符号整数型u16typedef unsignedlong u32;//自定义无符号长整型u32

#endif//结束设计实例一:呼吸灯的设计与实现

--添加main.c文件#include"type.h"//包含type.h头文件#defineMAIN_Fosc24000000UL//定义IRC的主频率为24MHz/*Timer0中断频率,1000次/秒*/#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))

#definePWM_PERIOD1023//设置PWM信号的周期值bitB_1ms;//定义位变量B_1ms,1ms标志u16PWM1_Duty=0;//定义并初始化PWM通道1的占空值为0u16PWM2_Duty=256;//定义并初始化PWM通道2的占空值为256u16PWM3_Duty=512;//定义并初始化PWM通道3的占空值为512u16PWM4_Duty=1024;//定义并初始化PWM通道4的占空值为1024设计实例一:呼吸灯的设计与实现

--添加main.c文件bitPWM1_Flag=0;//定义并初始化位变量PWM1_Flag为0bitPWM2_Flag=0;//定义并初始化位变量PWM2_Flag为0bitPWM3_Flag=0;//定义并初始化位变量PWM3_Flag为0bitPWM4_Flag=0;//定义并初始化位变量PWM4_Flag为0

voidUpdatePwm(void);//声明函数UpdatePwm()voidmain(void)//定义main()主函数{EAXFR=1;//扩展寄存器(XFR)访问使能

P4M1=0x00;//寄存器P4M1初始化为0P4M0=0x00;//寄存器P4M0初始化为0,P4端口为准双向P6M1=0x00;//寄存器P6M1初始化为0设计实例一:呼吸灯的设计与实现

--添加main.c文件P6M0=0x00;//寄存器P6M0初始化为0,P6端口为准双向

AUXR=0x80;//定时器/计数器0设置为1T,自动重加载TH0=(u8)(Timer0_Reload/256);//初值高8位保存到TH0寄存器

TL0=(u8)(Timer0_Reload%256);//初值低8位保存到TL0寄存器

ET0=1;//使能定时器/计数器0中断TR0=1;//使能定时器/计数器0运行PWMA_CCER1=0x00;//写CCMRx前必须先清零CCxE关闭通道PWMA_CCER2=0x00;//写CCMRx前必须先清零CCxE关闭通道PWMA_CCMR1=0x68;//不受ETRF影响,PWM模式1,使能预加载PWMA_CCMR2=0x68;//与PWMA_CCMR1寄存器配置相同设计实例一:呼吸灯的设计与实现

--添加main.c文件PWMA_CCMR3=0x68;//与PWMA_CCMR1寄存器配置相同PWMA_CCMR4=0x68;//与PWMA_CCMR1寄存器配置相同PWMA_CCER1=0x55;//高电平有效,使能OC1/OC2和对应互补输出PWMA_CCER2=0x55;//高电平有效,使能OC3/OC4和对应互补输出/*********PWM周期值高8位写到PWMA_ARRH寄存器**********/PWMA_ARRH=(u8)(PWM_PERIOD>>8);/*********PWM周期值低8位写到PWMA_ARRL寄存器***********/PWMA_ARRL=(u8)PWM_PERIOD;PWMA_ENO=0xff;//使能所有PWM通道的输出PWMA_PS=0xaa;//PWM通道的输出对应于P6.0~P6.7引脚PWMA_BKR=0x80;//使能主输出PWMA_CR1|=0x81;//使能ARR预装载,开始计时设计实例一:呼吸灯的设计与实现

--添加main.c文件P40=0; //导通驱动LED灯的晶体管EA=1;//使能CPU响应中断while(1);//无限循环}voidtimer0(void)interrupt1//定义定时器0的中断服务程序time0(){if(!PWM1_Flag){//如果PWM通道1标志PWM1_Flag=0PWM1_Duty++;//占空值PWM1_Duty递增if(PWM1_Duty>PWM_PERIOD)//如果PWM通道1占空值超过PWM周期值PWM1_Flag=1;//PWM通道1标志PWM1_Flag=1}设计实例一:呼吸灯的设计与实现

--添加main.c文件

else{//如果PWM通道1标志PWM1_Flag=1PWM1_Duty--;//占空值PWM1_Duty递减if(PWM1_Duty<=0)//如果PWM通道1占空值小于等于0PWM1_Flag=0;//PWM通道1标志PWM1_Flag=0}if(!PWM2_Flag){//如果PWM通道2标志PWM2_Flag=0PWM2_Duty++;//占空值PWM2_Duty递增if(PWM2_Duty>PWM_PERIOD)//如果PWM通道2占空值大于PWM周期值PWM2_Flag=1;//PWM通道2标志PWM2_Flag=1}设计实例一:呼吸灯的设计与实现

--添加main.c文件else{//如果PWM通道2标志PWM2_Flag=1PWM2_Duty--;//占空值PWM2_Duty递减if(PWM2_Duty<=0)//如果PWM通道2占空值小于等于0PWM2_Flag=0;//PWM通道2标志PWM2_Flag=0}if(!PWM3_Flag){//如果PWM通道3标志PWM3_Flag=0PWM3_Duty++;//占空值PWM3_Duty递增if(PWM3_Duty>PWM_PERIOD)//如果PWM通道3占空值大于PWM周期值PWM3_Flag=1;//PWM通道3标志PWM3_Flag=1}设计实例一:呼吸灯的设计与实现

--添加main.c文件else{//如果PWM通道3标志PWM3_Flag=1PWM3_Duty--;//占空值PWM_Duty递减if(PWM3_Duty<=0)//如果PWM通道3占空值小于等于0PWM3_Flag=0;//PWM通道3标志PWM3_Flag=0}

if(!PWM4_Flag){//如果PWM通道4标志PWM4_Flag=0PWM4_Duty++;//占空值PWM4_Duty递增if(PWM4_Duty>PWM_PERIOD)//如果PWM通道4占空值大于PWM周期值PWM4_Flag=1;//PWM通道4标志PWM_Flag=1}设计实例一:呼吸灯的设计与实现

--添加main.c文件else{//如果PWM通道4标志PWM4_Flag=1PWM4_Duty--;//占空值PWM4_Duty递减if(PWM4_Duty<=0)//如果PWM通道4占空值小于等于0PWM4_Flag=0;//PWM通道4标志PWM4_Flag=0}UpdatePwm();//调用函数UpdatePwm()}voidUpdatePwm(void)//定义函数UpdatePwm(),用于修改占空值{/**********PWM通道1占空值高8位加载到PWMA_CCR1H**************/PWMA_CCR1H

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论