STC15系列单片机硬件PWM模式配置教程

一,关于PWM模式介绍

该一个模块有四个模式,这里我们只需要了解可调脉冲输出模式,即PWM模式。

二,定时器的时钟源

PWM时钟由CMOD寄存器来配置。

1,CMOD寄存器

计算公式:

例如:配置CPS2、CPS1、CPS0=000,输入时钟为系统时钟,12分频,然后再除于256(8位)

PWM(clk)=\frac{SYSclk/12}{256}

如果需要自定义时钟频率,可以使用定时器0溢出率作为时钟源,但是会占用定时器的部分资源

这里一般配置为,0x00

三,控制寄存器配置

2,CCON寄存器

不需要中断的话,这里一般配置为,0x40

3,CCAPMn(n=0,1,2)寄存器

设置为PWM模式,所以这里,一般配置,0x02

4,PCA_PWMn(n=0,1,2)寄存器

EPCOH和EPCOL作为一个比较位,没有特殊情况,配置为0即可

所以,这里我们配置为,0x00

5,P_SW1辅助寄存器

如果不需要切换引脚的话,可以不用配置该寄存器,默认为第一组引脚

例如:如果需要切换到第二组引脚的话,为了不影响其他的位,我们需要进行部分操作

  P_SW1 &=0xCF; //切换为CCPn_2组引脚
  P_SW1 |=0x10; //CCP1_2=P36, CCP2_2=P37

6,PCA计数寄存器

这里配置为0即可。

7,CCAPnL、CCAPnH比较寄存器(n=0,1,2)

这里需要注意的是,如果是8位PWM模式,我们的CCAPnH是我们的预装载寄存器,我们需要修改占空比的时候,只需要修改CCAPnH即可,此时范围为0-255

四,PWM工作原理

简单说就是,CL和CCAPnL比较,CL大于或等于CCAPnL时候,输出1,否则输出0,

需要修改CCAPnL时,只需要写入CCAPnH寄存器即可,硬件会自动填充到CCAPnL。

五,编程实战

pwm.c

#include "pwm.h"

void PWM_Init(void)
{
  P_SW1 &=0xCF; //切换为CCPn_2组引脚
  P_SW1 |=0x10; //CCP0_2=P35,CCP1_2=P36, CCP2_2=P37
  
  CMOD=0x0E;    //PWM时钟0.375Mhz,1.46khz,关闭计数溢出中断
  CCAPM0=0x02;  //PCA0,设置PWM模式
  CCAPM1=0x02;  //PCA1,设置PWM模式
  CCAPM2=0x02;  //PCA2,设置PWM模式
  PCA_PWM0=0x00;//8位PWM模式,EPCOH=EPCOL=0
  PCA_PWM1=0x00;//8位PWM模式,EPCOH=EPCOL=0
  PCA_PWM2=0x00;//8位PWM模式,EPCOH=EPCOL=0
  
  CL=CH=0;      //PCA计数值清零
  
  CCAP0H=CCAP0L=128-1; //初始化占空比为50%
  CCAP1H=CCAP1L=128-1; //初始化占空比为50%
  CCAP2H=CCAP2L=128-1; //初始化占空比为50%
  
  CCON=0x40;    //开始PCA阵列,中断标志位清零 
}

void Set_Pwm(uint8_t mode,uint8_t pwm)    //设置PWM占空比
{
  if(mode==0)
  {
    CCAP0H=pwm;
  }
  else if(mode==1)
  {
    CCAP1H=pwm;
  }
  else if(mode==2)
  {
    CCAP2H=pwm;
  }
  
}

pwm.h

#ifndef _PWM_H_
#define _PWM_H_

#define uint8_t unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long
#define int8_t char
#define int16_t int
#define int32_t long


#include <STC15F2K60S2.H>


void PWM_Init(void);
void Set_Pwm(uint8_t mode,uint8_t pwm);


#endif

物联沃分享整理
物联沃-IOTWORD物联网 » STC15系列单片机硬件PWM模式配置教程

发表评论