简介
STC8G系列有1个PCA控制器,它带有3个通道(3 channel),或者说3个子模块,他们都共用一个16位的定时器:PCA Base Timer。这个定时器为3个子模块提供时基。每个子模块对应一个PCA通道,且可以独立配置为4种不同的功能,使得不同的通道可以发挥不同的作用,这些功能包括:
- PWM发生器(对外输出PWM波)
- 软件定时器(定时到期产生中断)
- 脉冲输出(输出可编程的方波信号)
- 捕获模式(对外部输入到引脚的电平信号进行采样)
PCA模块相关寄存器
PCA基准定时器(PCA Base Timer)
PCA 的3个子模块的功能都依赖于PCA Base Timer。PCA Base Timer本质上就是一个对特定信号进行加法计数的16位自动重装定时器,所以它具有常规定时器的下面这种控制和功能:
- 计数时钟源:PCA Base Timer计数时钟频率由CMOD[3:1]配置,可以选择Sysclk、Sysclk的分频、T0的溢出脉冲信号以及从单片机的ECI引脚输入的脉冲信号
- 计数启停开关:由CCON.CR控制,CR=1开启计数,CR=0停止计数。同时也受CMOD.CIDL位控制:即当单片机进入到空闲(IDLE)模式时,是否停止计数?CMOD.CIDL=0:计数只受CR控制,不受单片机IDLE模式影响;CMOD.CIDL=1:单片机进入空闲模式时,PCA Base Timer停止计数
- 计数存储寄存器:计数值存储在CH和CL这2个寄存器中。工作在16位自动重装模式。
- 计数溢出中断和标志:PCA Base Timer计数溢出时会产生中断。中断使能位CMOD.ECF;中断标志位CCON.CF(CF溢出标志只能由软件清0)
【示例代码】
PCA模块的中断
整个PCA模块的中断包含:
- PCA Base Timer溢出中断,中断标志为CF,中断使能控制位为ECF
- PCA子模块0的中断,中断标志为CCF0,中断使能控制位为ECCF0
- PCA子模块1的中断,中断标志为CCF1,中断使能控制位为ECCF1
- PCA子模块2的中断,中断标志为CCF2,中断使能控制位为ECCF2
这4个中断事件共用同一个中断向量,使用同一个中断服务函数,所以在进入到中断函数中时,要先读中断标志,查看中断发生的原因,再去具体处理中断,也正是由于这个原因,PCA模块的4个中断标志都必须由软件清0。
PCA Base Timer的中断由其溢出事件触发,而子模块的中断则根据子模块配置的功能不同触发原因也不同。例如在软件定时器模式下,到定时到期时则触发中断;在输入捕获模式下,当子模块引脚检测到一个目标电平边沿时触发。
PCA模块的中断优先级由IPH.bit7和PPCA两个位共同配置,可设置4极优先级。
PCA模块的引脚重映射选择
PCA模块的3个子模块的4种功能中,除了软件定时器外,其他3种功能都需要通过单片机引脚接收信号或者输出信号。子模块所使用的引脚组可以通过P_SW1[5:4]位段进行选择,使得PCB布线更加灵活。例如对于STC8G1K08-20Pin系列有2种选择:
P_SW1[5:4] | PCA通道0 | PCA通道1 | PCA通道2 | ECI输入引脚 | |
第一组管脚 | 00 | CCP0/P1.1 | CCP1/P1.0 | CCP2/P3.7 | P1.2 |
第二组管脚 | 01 | CCP0_2//P3.5 | CCP1_2/P3.6 | CCP2_2/P3.7 | P3.4 |
注:ECI引脚的作用,Base Timer在选择计数信号源时,可以选择从外部ECI引脚输入时钟源。
PCA模块的功能选择
每一路子模块的工作模式选择通过它的配置寄存器CCAPMn(n=0,1,2)实现。CCAPMn(n=0,1,2)的最低位是子模块的中断使能,与工作模式配置无关。3路子模块的配置和工作原理完全相同,在学习时只需弄懂一路子模块的功能即可。
下图说明了PCA子模块不同功能的选择与配置寄存器CCAPMn(n=0,1,2)的关系。子模块的四种不同功能就是由配置寄存器CCAPMn(n=0,1,2)中的不同位对应功能的组合形成的。
- ECOMn:compare,比较。即用PCA Base Timer 的 [CH,CL]和子模块的[CCAPnH,CCAPnL]进行比较大小
- CAPPn:子模块对应的引脚的输入或输出的电平正向跳变时触发中断
- CAPNn:子模块对应的引脚的输入或输出的电平负向跳变时触发中断
- MATn:match,匹配。即用PCA Base Timer 的 [CH,CL]和子模块的[CCAPnH,CCAPnL]进行匹配看是否相等
- TOGn:toggle,翻转子模块对应的引脚输出的电平,用于高速脉冲输出模式
- PWMn:PWM输出功能
软件定时器模式
前面说了这么多,现在开始讲解PCA模块的四种模式中最简单的一个,软件定时器模式。
工作原理:由于PCA Base Timer的运行,导致(CH,CL)会递增变化,每次(CH,CL)发生变化时,都会使得(CH,CL)与子模块的捕获比较寄存器(CCAPnH,CCAPnL)做一次比较。当二者相等时,子模块的中断标志位CCFn硬件置1。如果使能了子模块的中断,则还会触发中断。例如,PCA Base Timer的计数时钟设置为1MHz,这样(CH,CL)就每隔1us计数值增加一次。我们想使用软件定时器模式定时100us,则可以将初始化时(CH,CL)=0,子模块的(CCAPnH,CCAPnL)=100,当PCA Base Timer计数100次后触发子模块的中断,这样就代表100us定时到期。如果想持续这个过程,则需要在中断中将子模块的(CCAPnH,CCAPnL)值增加100到200,等下一个100us到来会再次出发中断。但要注意(CH,CL)和(CCAPnH,CCAPnL)的溢出问题。
模式配置:软件定时器模式必须将ECONn和MATn位置1。
引脚配置:软件定时器不需要引脚即可工作。
注意事项:软件定时器模式下,在给CCAPnH寄存器和CCAPnL寄存器赋值时,应先写CCAPnL,再写CCAPnH。因为每次对CCAPnL写入数据会导致ECOMn硬件置0,而每次对CCAPnH写入数据会导致ECOMn硬件置1,而软件定时器模式正常工作必须将ECOMn置1。之所以这样设计,是因为在每次给CCAPnH和CCAPnL赋值时,是无法用一个指令瞬间完成的,例如先赋值CCAPnL,而在给CCAPnH赋值之前他还是上一次的值,这个时候子模块的16位比较值实际上是错乱的,为了防止此时产生非预期的定时到期中断,因此是不能使能比较机制的。只有当新的CCAPnH的值赋值完成后才能开启比较机制。
PCA模块的软件定时器有一个不好用的点,如果要产生连续固定周期的定时中断,必须每次在产生软件定时器中断后,要再重新给(CCAPnH,CCAPnL)赋值,这样才能起到每次中断间隔时间都一致的效果。否则除了第一次中断,后面的中断都是在PCA Base Timer计数65536次后产生定时器到期中断。比如你想每5次计数中断一次,则(CCAPnH,CCAPnL)新值 = {(CCAPnH,CCAPnL)旧值+5 } %65536。最好的情况是,你恰好需要的中断间隔时间为PCA Base Timer计数65536次中断一次,这样就无需在每次中断时给(CCAPnH,CCAPnL)赋新的值。因此软件定时器模式最好用的情况是单次定时,连续的周期性定时需要在中断中软件重新给(CCAPnH,CCAPnL)赋值,这也是为什么叫软件定时器的原因。
【示例代码】
脉冲输出模式
高速脉冲模式就是在软件定时器模式的基础上多了一个引脚电平自动翻转的功能。使用软件定时器模式,并手动在中断中翻转GPIO电平也可以达到同样的效果,只不过相比硬件翻转有一定延迟。
工作原理:由于PCA Base Timer的运行,导致(CH,CL)会递增变化,每次(CH,CL)变化时,都会使得(CH,CL)与 (CCAPnH,CCAPnL)做一次比较。当二者相等时,子模块对应的引脚电平会自动翻转,且中断标志位CCFn硬件置1;如果使能了对于子模块的中断,则还会触发中断。
模式配置:脉冲输出模式必须将ECONn,MATn和TOGn位都置1。
引脚配置:软件定时器对应的引脚要配置为推挽输出。
注意事项:同软件定时器模式。
【示例代码】
8位PWM输出模式
STC8G的PCA支持6、7、8和10位PWM模式,这里以最常用的8位PWM模式讲解。
工作原理:
由于PCA Base Timer的运行,导致CL会递增变化,每次CL增加时,都会使得(0,CL)与 (EPCnL,CCAPnL)做一次比较:
- 如果 (0,CL) < (EPCnL,CCAPnL),则PWM引脚输出低电平;
- 如果 (0,CL) >=(EPCnL,CCAPnL),则PWM引脚输出高电平。
- 如果想输出占空比为0,即绝对低电平,则应该让 (EPCnH,CCAPnH) = (1,0xFF)
- 如果想输出占空比为100%,即绝对高电平,则应该让 (EPCnH,CCAPnH) = (0,0x00)
- 当CL溢出时, (EPCnH,CCAPnH)的值会自动装载到 (EPCnL,CCAPnL),这样就实现了软件无干扰的更新PWM占空比
模式配置:PWM模式必须将CCAPMn寄存器中的ECONn和PWMn位置1,而CCAPn和CCANn这2个位则用于设置PWM输出的电平在怎样的变化情况下发生中断。一般情况下不需要PWM带中断。
8位PWM分辨率配置:每个子模块都有一个PWM配置寄存器:PCA_PWMn(n=0,1,2)。PWM的分辨率由PCA_PWMn(n=0,1,2)的 [EBS1,EBS0] 位段配置,当 [EBS1,EBS0] =00时,为8位PWM。最低2位 [EPCnH,EPCnL] 位段分别是重装载值的最高位和比较值的最高位。其余位在8位PWM模式下不使用。
引脚配置:PWM输出模式对应的引脚要配置为推挽输出。
8位PWM的频率:PWM频率=PCA Base Timer的计数时钟频率/256。
8位PWM的占空比:比较值(EPCnL,CCAPnL)直接影响占空比。每次修改占空比时,可同时修改重装值 (EPCnH,CCAPnH) 和 比较值(EPCnL,CCAPnL),如果只修改重装值 (EPCnH,CCAPnH),则新的占空比会在下一次PCA Base Timer的CL溢出时才生效。
注意事项:无。
【示例代码】
10位PWM输出模式
相比STC15F系列的PCA,STC8G系列的PCA模块赠加了10位PWM模式的支持。PWM的分辨率越高,输出的占空比就可以控制的更加精细。
工作原理:10位PWM模式的工作原理与8位PWM是相似的。只不过是使用PCA Base Timer的(CH[1:0],CL)与子模块的(EPCnL,XCCAPnL,CCAPnL)进行比较。
- 如果 (0,CH[1:0],CL) < (EPCnL,XCCAPnL[1:0],CCAPnL),则PWM引脚输出低电平;
- 如果 (0,CH[1:0],CL) >=(EPCnL,XCCAPnL[1:0],CCAPnL),则PWM引脚输出高电平。
- 如果想输出占空比为0,即绝对低电平,则应该让 (EPCnH,XCCAPnH[1:0],CCAPnH) = (1,3,0xFF)。
- 如果想输出占空比为100%,即绝对高电平,则应该让(EPCnH,XCCAPnH[1:0],CCAPnH) = (0,0,0x00)。
- 当(CH[1:0],CL)溢出时,重装载值(EPCnH,XCCAPnH,CCAPnH)的值送入到(EPCnL,XCCAPnL,CCAPnL),实现无干扰的PWM占空比更新。
模式配置:同8位PWM。PWM模式必须将CCAPMn寄存器中的ECONn和PWMn位置1,而CCAPn和CCANn这2个位则用于设置PWM输出的电平在怎样的变化情况下发生中断。一般情况下不需要PWM带中断。
10位PWM分辨率配置:PWM的分辨率由PCA_PWMn(n=0,1,2)的 [EBS1,EBS0] 位段配置,当 [EBS1,EBS0] =11时,为10位PWM。
引脚配置:PWM输出模式对应的引脚要配置为推挽输出。
10位PWM的频率:PWM频率=PCA Base Timer的计数时钟频率/1024。
10位PWM的占空比:比较值(EPCnL,XCCAPnL,CCAPnL)直接影响占空比。每次修改占空比时,可同时修改重装值 (EPCnH,XCCAPnH,CCAPnH) 和 比较值(EPCnL,XCCAPnL,CCAPnL),如果只修改重装值 (EPCnH,XCCAPnH,CCAPnH),则新的占空比会在下一次PCA Base Timer的(CH[1:0],CL)溢出时才生效。
注意事项:无。
【示例代码】
输入捕获模式
所谓捕获模式,就是用于测量和还原外部输入的方波信号,主要包括信号的上升下降沿以及他们之间的时间间隔。这样可以得到输入方波信号的周期、占空比等信息。由于PCA捕获模式可以在检测到上升下降沿时触发中断,因此这个模式也可以实现外部中断检测。
工作原理:当工作在捕获模式时,子模块对输入引脚的方波信号进行采样,一旦捕获到一个目标边沿(可选择上升、下降或者上升下降沿)跳变,则PCA Base Timer的CH和CL会装载到CCAPnH和CCAPnL,同时子模块的中断标志硬件置1,如果使能了子模块的中断,则还会触发CPU中断。每次发生捕获中断后,可以提取CCAPnH和CCAPnL的值,用于计算两个目标沿之间的时间差,可以用于测量输入的信号的周期,占空比等信息。例如,为了测量输入信号的连续的2个下降沿之间的间隔,则在第一个下降沿到来时,触发输入捕获中断,软件保存此时(CCAPnH,CCAPnL)的值,假设为5,下一次下降沿到来时再次输入捕获中断,软件读取此时(CCAPnH,CCAPnL)的值假设为105,则差值为100,代表两个下降沿期间PCA Base Timer计数了100次(假设这个期间PCA Base Timer没有溢出),如果PCA Base Timer计数时钟为1MHz,那么代表两个下降沿的时间间隔为100us。
模式配置:输入捕获模式需要将CCAPMn寄存器的CAPPn位或者CAPNn位中的至少一位置1,其他位无关均置0。
- CAPPn,CAPNn = 1,0:捕获上升沿
- CAPPn,CAPNn = 0,1:捕获下降沿
- CAPPn,CAPNn = 1,1:即捕获上升沿又捕获下降沿
引脚配置:输入捕获模式对应的引脚要配置为高阻输入模式。
注意事项:在输入捕获中断中提取CCAPnH,CCAPnL进行计算分析时,需要考虑PCA Base Timer溢出问题。
【示例代码】