PCA模块生成PWM方波

PWM

什么是PWM

首先什么是PWM方波?这里直接摘抄百度百科的知识了。

PWM全称Pulse width modulation,中文名脉冲宽度调制技术,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。

占空比

那什么又是占空比呢?

正占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,那么当然负占空比也就是低电平时间占据整个周期的百分比了。

方波的占空比就是50%。
在这里插入图片描述
当然方波的占空比不一定就是50%。这就涉及到另一个知识点了:通过调节方波的占空比,达到调节电机转速的目的。

怎样产生PWM方波

有两种方式,一种是利用单片机本身的定时器和中断函数来产生PWM方波。主要操作是利用定时器的定时,在一段时间内产生高电平,当计时到达后,产生定时器中断,然后将该管脚的高低电平翻转。这样很容易就可以产生一个占空比为50%的方波了,但是这种操作只适合用来在学习PWM方波的时候应用,毕竟一个单片机的定时器是有限的,如果工程量和程序代码过多的话,可能需要多次用到定时器,就有点浪费资源,在一个原因就是这样产生PWM方波的效率很低。

因此我们选用第二种方式,利用单片机内部硬件的PCA模块(可编程计数器阵列)来产生PWM方波。关于PCA模块的功能寄存器,每个芯片的配置方法可能不一样,我是想通过使用PCA模块来输出固定频率的PWM方波。这里以STC8系列为例。

PCA模块

PCA模式寄存器(CMOD)

在这里插入图片描述CIDL:设置PCA在CPU空闲模式下的模式
CIDL=0:PCA在CPU空闲模式下继续工作
CIDL=1:PCA在CPU空闲模式下停止工作

CPS:PCA计数脉冲源选择位
在这里插入图片描述
ECF:PCA定时器/计数器溢出中断使能标志
ECF=0:PCA定时器/计数器溢出时不产生中断
ECF=1:PCA定时器/计数器溢出标志位CF置1时产生中断

PCA控制寄存器(CCON)

在这里插入图片描述CF:PCA计数器溢出中断标志。当PCA的16位计数器计数发生溢出时,硬件自动将此位置1,并向CPU提出中断请求。此标志位需要软件清零。

CR:PCA计数器允许控制位(使能PCA计数器)。
CR=0:停止PCA计数
CR=1:启动PCA计数

CCFn(n=0,1,2,3):PCA模块中断标志。当PCA模块发生匹配或者捕获时,硬件自动将此位置1,并向CPU提出中断请求。此标志位需要软件清零。

PCA计数器寄存器(CL,CH)

在这里插入图片描述
由CL和CH两个字节组合成一个16位计数器,CL为低8位,CH为高8位。
每个PCA时钟16位计数器自动加1。

PCA模块模式捕获值/比较值寄存器(CCAPnL,CCAPnH)

在这里插入图片描述当捕获功能使能时,用于保存发生捕获时PCA的计数值;当比较模块使能时,PCA控制器会将当前CL和CH中的计数值与保存在CCAPnL和CCAPnH的值作比较,并给出比较结果。当PCA模块匹配功能使能时,会将CL和CH中的计数值与保存值作比较,看是否匹配(相等),并给出匹配结果。

PCA模块PWM模式控制寄存器(PCA_PWMn)

在这里插入图片描述
EBSn[1:0]:PCA模块n的PWM位数控制。
在这里插入图片描述在这里插入图片描述
基本的需要配置的寄存器都在这里了,接下来就是PCA如何在PWM模式下工作。

PWM工作模式

要想使能PCA模块的PWM功能,模块寄存器(CCAPMn)的PWMn和ECOMn必须置1。也就是
CCAPMn = 0x42。然后需要设置PWM的占空比,通过设置寄存器{EPCnL,CCAPnL[7:0]}来设置。

当{0,CL[7:0]} < {EPCnL,CCAPnL[7:0]},输出低电平。
当{0,CL[7:0]} >= {EPCnL,CCAPnL[7:0]},输出高电平。

当CL溢出时,{EPCnH,CCAPnH[7:0]}会重新装载到{EPCnL,CCAPnL[7:0]}中用于作比较。
在这里插入图片描述大概过程就是CL在不停的计数,并与EPCnL寄存器作比较,当CL大于或等于EPCnL时会输出高电平,反之则输出低电平。当计数值记满溢出时,EPCnH的值会重载进EPCnL中去,继续进行比较产生新的PWM波形。

PWM频率的计算公式
在这里插入图片描述

代码实现

首先配置寄存器:

void PCA_Init()
{
	CCON = 0x00;
    CMOD = 0x00;                                //PCA时钟为系统时钟/12,禁止溢出中断
    CL = 0x00;									//初始化计数器的值,低八位
    CH = 0x00;									//高八位
    CCAPM0 = 0x42;                              //PCA模块0,使能比较功能,PWM工作模式
    CR = 1;                                     //启动PCA计时器
}

然后需要设置PWM方波占空比

void PWM_duty(u16 _duty)
{
    u8 EPCnH = 0, EPCnL = 0;
    u8 CCAPnH = 0; 
    if(_duty > 0xFF)
    {    
        EPCnH = 1; 
        EPCnL = 1;
        CCAPnH = _duty & 0x00FF;
    }
    else
    {   
        EPCnH = 0; 
        EPCnL = 0;
        CCAPnH = _duty;
    }
    PCA_PWM0 = EBS0 | (EPCnH << 1) | EPCnL;     //PWM位数,00为8位,11为10位。
    CCAP0H = CCAPnH;                            
    CCAP0L = CCAPnH;   
}

在设置占空比的函数中,不仅仅设置了占空比,还是设置了PWM的位数。如果为8位PWM,那么周期最高为256个脉冲周期,所以输入的参数大于256时,就需要10位的PWM来输出波形。当小于256时就是8位的PWM波。如果PCA_PWM0=0x00,就是8位,如果PCA_PWM0=0x11,就是10位。

占空比的计算公式如下:
正占空比=(1−CCAPnH/2PWM位数)∗100 正占空比 = (1 - CCAPnH / 2^{PWM位数 })*100 =1CCAPnH/2PWM100
本次使用的基本上都是8位的PWM,所以正占空比=(1 - CCAPnH / 2^8 )*100%

如果想要输出固定占空比的波形,也可以通过逆推得出CCAPnH的值:

CCAPnH=(1−占空比)∗2PWM位数 CCAPnH = (1 - 占空比)* 2^{PWM位数} CCAPnH=12PWM

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值