STC8G 定时器 PWM 输出
说明:
STC8G 里面有一个CCP模块,可以实现PWM输出。 CCP模块的工作原理是:
- 定时器0的计数器值与CCP模块的比较寄存器值进行比较。
- 如果定时器0的计数器值小于CCP模块的比较寄存器值,则CCP模块的输出引脚为低电平。
- 如果定时器0的计数器值大于CCP模块的比较寄存器值,则CCP模块的输出引脚为高电平。
PWM 输出的配置
在这个寄存器,可以指定PWM使用的时钟源,以及PWM的输出模式。
这里有一个重载值寄存器,可以指定PWM的重载值。是重载的比较值.用于指定占空比的。 主要的作用是,实时的修改PWM的占空比.并不是为了修改PWM的周期。
所以 PWM的输出,最主要的应用还是为了控制电机的转速。或是LED的亮度.并不能用于产生一个特定频率的PWM信号.
PWM的输出引脚:
PWM0 和 PWM1 的输出引脚是固定的,分别是 P3.2 和 P3.3。
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;
//
}