大家好,我是远方,这一章我们来学习下STC8G1K12的PWM应用。
STC8G 系列单片机内部集成了 3 组可编程计数器阵列(PCA/CCP/PWM)模块,可用于软件定时器、外部脉冲捕获、高速脉冲输出和 PWM 脉宽调制输出。 我们今天主要学习下PWM的输出。
我们开始配置寄存器:
PCA 控制寄存器 CCON ,我们需要启动 PCA 计数 ,所以CR位需要写1。
PCA 模式寄存器 CMOD,空闲模式下 PCA 继续计数 ,该位写0,
CPS[2:0]:PCA 计数脉冲源选择位 选择系统时钟。设置为100。
PCA 计数器寄存器 CL CH,每来一个时钟 16 位计数器自动加 1。
PCA 模块模式控制寄存器 ,我们这次使用的是CCAPM0的PWM0。大家这里要注意,使用PWM输出必须 同时使能 ECOM0 和 PWM0。所以这二位都要写1。
PCA 模块模式捕获值/比较值寄存器 ,在作为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%。
通过示波器查看波形,证明我们的软件测试没问题。
好了这章就讲到这里。希望大家多多关注我的原创文章。谢谢。
閱讀更多 深漂遠方 的文章