PWM实验2:带有相位延迟的PWM波
实验要求:
1.PWM波形发生器的时钟为系统时钟四分频
2.波形由通道6输出
3.周期为20个PWM时钟
4.占空比为2/3
5.有4个PWM时钟的相位延迟
生成的波形应当如下图所示:
由于要产生4个PWM时钟的相位延迟,所以,PWM4初始电平设置为低,
PWM周期为20,则PWMC=19;
低电平延迟4个PWM计数周期,所以第一次翻转门限设置为3,
占空比为2/3,所以第二次翻转门限为20*2/3=13,13+3=16。
程序代码:
//时钟频率12MHz
#include "STC15W4K.H"
#define uchar unsigned char
#define CYCLE 884 //定义PWM周期(最大值为32767)
#define WIDE 450 //定义高电平时间
sbit P1_6=P1^6; //PWM6第一输出
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void port_mode() // 端口模式 将所有端口设置为准双向弱上拉
{
P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
}
void main()
{
unsigned char i;
//系统上电后,所有与PWM有关的端口都是高阻态模式,
//所以在使用PWM前,要将端口设置为准双向弱上拉模式
//根据实际需要,设置为强推挽也可以输出PWM波,只是一定要串上电阻1K—10K的电阻
port_mode();//将所有端口初始化为准双向弱上拉
//LED灯闪烁3次,表明系统上电工作
for(i=0; i<3; i++)
{
P1_6=0;
Delay500ms();
P1_6=1;
Delay500ms();
}
//将P_SW2寄存器的最高位置1,
//也就是使能访问外部扩展特殊功能寄存器XSFR,而不是访问外部数据寄存器XRAM
P_SW2|=0x80;
//设置PWM配置寄存器
//其他各位都为1,只有C6INI=0,也就是设置PWM6的初始输出电平为低电平
PWMCFG&=0xEF;
//设置PWM计数器的时钟源为 系统时钟分频,而不是定时器T2溢出,设置为系统时钟的3+1=4分频
PWMCKS=0x03;
//PWM计数器设置计数值,也就是设置PWM周期
PWMC=19;
//第一次翻转的计数值,也就是高电平所占时间
PWM6T1=3;
//第二次翻转的计数值
PWM6T2=16;
//注意这个寄存器与PWMCR不同
//PWM6第一引脚输出,即P1.6输出
//关闭PWM6中断
//关闭T1匹配翻转中断
//关闭T2匹配翻转中断
PWM6CR=0;
//由于前面已经设置完XSFR,这里设置为禁止访问XSFR
//也就是设置为对外部数据存储器XRAM的访问
P_SW2&=0x0F;
//开启总PWM 波形发生器功能,开启PWM6输出,或者说是使能也可以
PWMCR|=0x90;
while(1);
}