宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

大家好,我是远方,这一章我们来学习下STC8G1K12的PWM应用。

STC8G 系列单片机内部集成了 3 组可编程计数器阵列(PCA/CCP/PWM)模块,可用于软件定时器、外部脉冲捕获、高速脉冲输出和 PWM 脉宽调制输出。 我们今天主要学习下PWM的输出。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

我们开始配置寄存器:

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

PCA 控制寄存器 CCON ,我们需要启动 PCA 计数 ,所以CR位需要写1。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

PCA 模式寄存器 CMOD,空闲模式下 PCA 继续计数 ,该位写0,

CPS[2:0]:PCA 计数脉冲源选择位 选择系统时钟。设置为100。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

PCA 计数器寄存器 CL CH,每来一个时钟 16 位计数器自动加 1。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

PCA 模块模式控制寄存器 ,我们这次使用的是CCAPM0的PWM0。大家这里要注意,使用PWM输出必须 同时使能 ECOM0 和 PWM0。所以这二位都要写1。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

PCA 模块模式捕获值/比较值寄存器 ,在作为PWM输出时,大家只需知道这里的寄存器是用来调占空比的。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

PCA 模块 PWM 模式控制寄存器 PCA_PWM0 ,这里主要设置PWM的位数。如果需要分辨率高一点,就把位数设置大点。

今天我们以PWM0,时钟源选择系统时钟11.0592MHz,6 位PWM模式 最大值40H,输出50%的占空比 来测试一下。

大家可能会问,那频率是多少?大家记住下面这个公式。

频率=PWM时钟除以(2的(PWM位数)次方)

也就是6位PWM,就是除以2的6次方。

我们开始写代码。

全部工程代码如下:

#include "STC8.H"

sbit LED = P1^1;

void main(void)

{

//使用内部时钟 烧录软件会帮我们配置好 如不懂 参考前面第3章系统设置学习。

// 烧录软件设置11.0592MHz为系统时钟。以后我们的学习都是这个时钟频率。

P_SW2 |= (1<<7);

CKSEL = 0x00; //选择内部 IRC ( 默认 )

P_SW2 &= ~(1<<7);

//配置端口 对于控制我们系统板的LED,配置准双向口和推挽输出都可以。

//只要是做为输出,我建议全部设置为推挽输出。

/*

PnM1.x PnM0.x Pn.x 口工作模式

0 0 准双向口

0 1 推挽输出

1 0 高阻输入

1 1 开漏输出

*/

P1M1 &= ~(1<<1); P1M0 |= (1<<1); //设置为推挽输出

P_SW2 |= (1<<7);

P1PU = 0x00;//禁止P1端口内部的 3.7K 上拉电阻

P1NCS = 0xFF; //禁止P1端口的施密特触发功能。

P_SW2 &= ~(1<<7);

P_SW1 &= ~(1 << 5);P_SW1 &= ~(1 << 4);//默认引脚功能 P1.1 P1.0 P3.7

CCON = 0x00; //停止PCA计数

CMOD = 0x08; //PCA时钟为系统时钟 11.0592MHz 频率=PWM时钟/2的(PWM位数)次方

CL = 0x00;

CH = 0x00;//PCA 计数器清零

CCAPM0 = 0x42; //PCA 模块 0 为 PWM 工作模式

PCA_PWM0 = 0x80; //PCA 模块 0 输出 6 位 PWM

CCAP0L = 0x20; //PWM 占空比为 50%[(40H-20H)/40H]

CCAP0H = 0x20;

CCON |= (1 << 6); //启动PCA计时器

while (1);

}

我们把程序编译好,烧录到板子里面。连接示波器查看。

我们的PWM频率是 11.0592MHZ除以64等于172.8K。硬件接口是P1.1.

。占空比位50%。

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

宏晶科技 STC8G1K系列单片机教程「十四」PWM应用

通过示波器查看波形,证明我们的软件测试没问题。

好了这章就讲到这里。希望大家多多关注我的原创文章。谢谢。


分享到:


相關文章: