下面是一个STC15单片机的硬件输出PWM程序其硬件PWM的计数脉冲我设置的是使用定时器2的中断溢出脉冲作为计数脉冲
自己琢磨了好久目前功能是实现了但是计算来计算去都搞清楚 最终的PWM频率是怎么来的目前输出频率是20HZ逻辑分析
仪测试出来的想问问论坛有经验的老铁帮忙解答一下?
#define CYCLE 0x1f4L //定义PWM周期(最大值为32767)
#define DUTY 50L //定义占空比为50%
/*---------------------------------------------------------------------*/
/*STC15Fxx 系列 单片机硬件PWM利用定时器2溢出脉冲作为计数器计数脉冲实例 */
/*--------工作频率为12MHz-----------------------------*/
void Timer2Init(void) //100微秒@12.000MHz"中断周期为200us"
{
AUXR&=0xFB; //定时器时钟12T模式
T2L = 0x9C; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR|=0x10; //定时器2开始计时
IE2&=0xFB; //允许定时器2申请中断
IE2|=0x04; //允许定时器2申请中断
EA=1; //允许所有的中断源申请中断
}
void PWM_INIT()//STC15Fxx 系列 输出任意周期和任意占空比的PWM初始化函数
{
P_SW2|=0x80;//置1"EAXSFR"允许访问RAM随机存储器区的特殊功能寄存器
PWMCFG=0x00;//(置0"CBTADC位不使能ADC转换")(置0"C2INI使能PWM2端口初始化电平为0")
PWMCR=0x01;//置0"ENPWM"(先关闭不启动计时总控位) "置1"ENC20"(使能PWM2通道口为PWM输出受波形发生器控制)"
PWMC=CYCLE;//设置PWM周期
PWMCKS|=0x10;//(置"1" "SELT2")时钟来源定时器T2的溢出脉冲 其他位保持不变
//占空比为(PWM2T2-PWM2T1)/PWMC
PWM2T1=0x0000;//设置PWM2第1次反转的PWM计数
PWM2T2=CYCLE*DUTY/100;//设置PWM2第2次反转的PWM计数
PWM2CR&=0xF7;//选择PWM2输出到P2.7,其他功能不使能
PWM2CR|=0x08;//选择PWM2输出到P2.7,其他功能不使能
PWMCR|=0x80;//最后使能"ENPWM"总控位使内部计数器开始计数(必须全部特殊功能寄存器设置完毕后才可以使能此位)
P_SW2&=~0x80;//置0"EAXSFR"禁止访问RAM随机存储器区的特殊功能寄存器
}
void Timer2_Interrupt_Service(void) interrupt 12
{
P30=~P30;
}
|