登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] STC12单片机[内部PWM]使用方法解析

[复制链接]
发表于 2019-2-7 17:36:38 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机内部Pwm原理及使用方法
学习安排: 先看PWM这一章的技术手册,同时查阅资料,学会使用内部PWM
开始时间: 2019-02-05
结束时间: 2019-02-07
STC12内部PWM使用方法解析首先说一下PWM是一个什么样的东西,PWM的中文名字叫做“脉宽调制”,也就是说呢,我们的电路有两种状态,通或者不通,我们用单片机控制输出高电平低电平从而控制电路的通断来达到我们想要的某种模拟电路特有的效果的一种技术。我们举个例子,比如说我们的直流电机直接接在五伏的电源上,要么全速运转,要么不转。那我们怎样实现调速呢?我们可以通过单片机来控制这个电路,让电机电路通一段时间断一段时间。比如说通一秒断一秒,那么电机的速度就会比全速运转时候低,不断改变这个通断之间的间隔时间,我们就可以达到一种调速的效果。下面呢,我们就切入正题。
STC12C5A60S2这款单片机(下面说成12系列单片机),与89系列的单片机相比,它的内部增加了独立的PCA(计数器阵列,说简单点就是几个计数器)或者说PWM模块,通过配置相关的特殊功能寄存器,我们可以实现一些额外的功能,比如说计时器,高脉冲输出,PWM输出等,如果我们用这种方法来实现PWM功能,要比用定时器加中断组合那种方法简单很多。大家可能都看过那个技术文档,但是不得不说它的技术文档写的真是让人不敢恭维。经过查阅资料,还有逛论坛,我大致了解了PCA模块它到底是什么样一个东西,应当怎样用等。下面我把相关的内容分享给大家,与大家交流一下。如果有什么不对的地方,大家可以评论里边指出来,一定虚心思考。
我们看官方对PCA模块的介绍:

对于图片里边提到的定时器的概念,大家已经非常熟悉了,而“捕获/比较器”,这个东西对我们来说可能比较生疏,其实通俗的说呢,在PWM功能里边,模块0与模块1里边的捕获比较器,就是一个比较大小的硬件装置。假如有一个固定的值装在模块0的特殊功能寄存器里边,有一个外部来的外来值与它里边装的那个值不停的进行比较大小这种操作,如果外来的值比较小,那么这个比较大小的装置就会输出0,反之输出1(至于捕获模式,我们暂时用不到,他们其实是一个可以检测到相应引脚高低电平变化的硬件装置,我们知道,引脚拉高拉低并不是一下子就完成的,无论拉高或拉低,都有一定的上升或下降沿,捕获其实捕获的就是这种上升下降沿,一旦捕获到,可以触发相应的中断,这些都由软件决定。)那么此时根据这些硬件的特性,再结合PWM的特点,我们就可以形成如下的产生PWM的思路:对于比较器模块,我们先给其装载一个值,在它的外部还存在一个值,这个值可以根据一定的时钟自加,当外来值小于内部装载的值的时候,输出0,反而输出101呢,又能转化为电平。我们接下来看官方给的介绍图:


底部绿框里边是一个特殊功能寄存器,可以看出,当这个寄存器的第7位和第1位都置位(或者说都赋1时),将使能九位比较器。蓝色框里边的CCPAnL(令n=0,是第一路PWM)也是一个特殊功能寄存器,他装载就是我们前面所理解的“内部”的值。而CL也是一个特殊功能寄存器,它里边的值会依据一定的时钟源自加。同时呢,这个九位比较器就这样不断的进行CCPAnLCL的比较,根据两者的大小关系来输出0/1。在这里声明一下:我们看,这个比较器是九位比较器,因而它比较的必须是九位数,而我们一个特殊功能寄存器只有八位数,所以剩下那一位是凑出来的,我们让那个第9个数等于0就行了。(EPCnL就是某个特殊功能寄存器的某一位)。比较器输出的01,最终转化为单片机引脚上的高低电平。CL都是从0自加到256之后溢出,再从0开始增加。由图,我们可以看出每次CL的溢出都会诱发CCAPnH的值重新装载到CCAPnL中,那么CL自加的速率决定了最终PWM的频率,而CCAPnLCCAPnH的值应与CCAPnL相同)的值决定了占空比。我们举一个例子,令CCAPnL=128,那么CL0加到128这段时间,单片机的引脚会输出为0,当CL大于128的这段时间,单片机的引脚输出1128等于256的一半,所以高低各占一半,也就是说占空比为50% 。下面写一个实际的例子,相关的特殊功能寄存器大家需要看手册,学着配置一下,很容易。
#include <STC12C5A60S2.H> //头文件不能再使用reg52.h,因为它里边没有新增的与pwm相关的特殊功能寄存器的定义。
void main ()
{
CMOD = 0x00;//根据手册的说明,配置你想要的工作模式。这里写了这一句话的意思是:在空闲模式下,PC A计数器继续工作,并且没有中断,时钟频率是系统时钟的1/12
CCON = 0x00;//根据手册的说明,配置想要的控制方式,这句话的意思是不使用PCA计数溢出标志,不开启计数功能(因为在写这句话的时候,你的相关寄存器的值还没有装进去),中断标志禁用。
    CL = 0;   CH = 0;//0开始自加,就行。PCA_PWM0 = 0;//根据技术手册的说明来配制比较器控制寄存器。这句话的意思是说EPC0L0,也就是说拿去凑那九位数那一位为零。
CCAP0H = 0x80;//这个值每次当CL溢出的时候都会被装载到CCAP0L中。
CCAP0L = 0x80;//给模块0的寄存器里边装一个值,也就是我们之前说的那个“内部”用来与外部的数作比较的值。
CCAPM0 = 0x42;//根据技术手册的说明,我们来配置比较器控制寄存器。这句话的意思是:允许比较器功能,不允许上升沿捕获,不允许下降沿捕获。不允许……,允许P1.3引脚脉冲调制输出。
CR = 1;//这时候已经配置完毕,可以打开PC计数器。
while (1) ;
}
到此处一路PWM输出就配置好了,是不是比用定时器加中断要简易的多?把这个程序下载到我们的板子上,发现蜂鸣器会发出很小的声音,因为这个频率太高了,基本上是10k赫兹还要多,频率太高了,那么他的声音就比较小,其实我们的蜂鸣器支持的是2k4k赫兹的脉冲,在这个频率段效果最好。

PWM模式图.png
PCA结构图1.png
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表