Skip to content

STC8G 定时器 PWM 输出

说明:

STC8G 里面有一个CCP模块,可以实现PWM输出。 CCP模块的工作原理是:

  • 定时器0的计数器值与CCP模块的比较寄存器值进行比较。
  • 如果定时器0的计数器值小于CCP模块的比较寄存器值,则CCP模块的输出引脚为低电平。
  • 如果定时器0的计数器值大于CCP模块的比较寄存器值,则CCP模块的输出引脚为高电平。

PWM 输出的配置

PCA_CMOD模式

在这个寄存器,可以指定PWM使用的时钟源,以及PWM的输出模式。

PCA_PWM配置

这里有一个重载值寄存器,可以指定PWM的重载值。是重载的比较值.用于指定占空比的。 主要的作用是,实时的修改PWM的占空比.并不是为了修改PWM的周期。

所以 PWM的输出,最主要的应用还是为了控制电机的转速。或是LED的亮度.并不能用于产生一个特定频率的PWM信号.

PWM的输出引脚:

PWM0 和 PWM1 的输出引脚是固定的,分别是 P3.2 和 P3.3。

PCA_PWM输出引脚

PWM 输出的工作过程.

PCA_PWM工作过程

从这个过程中,我们发现,计时器一直是从 0x3F 变为0x00 , 这个数据是不变的,也就是说, PWM输出的周期是固定的。无法根据需要,通过修改寄存器的值来改变PWM的周期。

PWM 输出的代码实现

c
void pwm_init()
{
    // 添加PWM1初始化
    // 引脚配置:P3.2为PWM输出
    P3M1 &= ~0x04;  // P3.2推挽输出
    P3M0 |= 0x04;

    // PCA模块配置
    CMOD = 0x80 | (0x05 << 1 );    // 时钟源=系统时钟,不分频
    CCON = 0x00;    // 清零计数器

    // 16位PWM模式
    CCAPM0 = 0x42;  // 使能PWM模式

    // 设置周期和占空比
	   PCA_PWM0 = 0x40;
    //PCA_PWM0 = 0x80 |  (((PWM_PERIOD >> 4) & 0x30) |  ((PWM_PERIOD >> 9) & 0x02)) |(((PWM_HIGH >> 6) & 0x0C) |  ((PWM_HIGH >> 10) & 0x01));
    CCAP0H = PWM_PERIOD & 0xFF;
	  //CCAP0L = PWM_HIGH & 0xFF;
    // 启动PCA计数器
    CR = 1;
    //
}