中颖51芯片学习4. 可编程计数器阵列PCA0

news2024/11/26 4:54:51

中颖51芯片学习4. 可编程计数器阵列PCA0

  • 一、PCA介绍
    • 1. PCA简介
    • 2. SH79F9476的PCA0特性
    • 3. PCA0 功能
    • 4. 时钟
    • 5. PCA0原理框图
    • 6. 工作方式
  • 二、PCA0寄存器
    • 1. PCA0标志寄存器
    • 2. PCA使能寄存器
    • 3. PCA0方式寄存器
    • 4. P0CPMn PCA捕捉/比较寄存器
    • 5. P0FORCE强制输出控制寄存器
    • 6. PCA0计数最大值低字节
    • 7. PCA0计数最大值高字节
    • 8. PCA0比较/捕捉模块低字节
    • 9. PCA0比较/捕捉模块高字节
  • 三、中断
  • 四、工作方式详解
    • 1. Mode0 边沿触发的捕捉模式
      • (1)工作方式介绍
      • (2)代码实现
    • 2. Mode1 软件定时器方式
      • (1)工作方式简介
      • (2)代码实现
    • 3. Mode2 频率输出方式
      • (1)工作方式简介
      • (2)代码实现
    • 4. Mode3 PWM模式
      • (1)工作方式简介
        • 功能配置
        • 溢出与自动重载
        • 占空比
        • 工作方式原理框图
      • (2)8位脉宽PWM代码实现
      • (3)16 位脉宽调制器(PWM16 )实现
      • (4) 16位相位修正脉宽XPWM16
      • (5) 16 位相频修正 XPPWM16 方式

一、PCA介绍

1. PCA简介

PCA(Programmable Counter Array)是一种可编程计数器阵列,是常见于一些8位和16位微控制器中的重要外设之一,包括中颖C51单片机。
PCA0的功能包括计时器和捕获/比较功能,它能够执行多种定时和控制任务。

  1. 计时器功能: PCA可以作为一个多功能的定时器,能够产生精确的定时脉冲,用于计时、延时等应用。它可以以不同的时钟源(如系统时钟、外部时钟等)来进行计数,并且支持不同的计数模式(例如定时器、捕获/比较等)。

  2. 捕获/比较功能: PCA还可以用作捕获/比较器,能够捕获外部输入信号的脉冲宽度、频率等信息,并与预设的比较值进行比较,从而实现对输入信号的精确控制。

  3. 多通道功能: PCA通常具有多个计时通道,可以同时管理多个计时任务,这使得它在复杂的控制系统中非常有用。

  4. 中断支持: PCA通常会提供中断功能,当计数或捕获操作完成时,可以触发相应的中断,用于处理特定的事件或执行特定的任务。

  5. PWM输出: PCA通常也可以用来生成PWM(脉冲宽度调制)信号,用于控制电机速度、LED亮度等应用。

2. SH79F9476的PCA0特性

  1. SH79F9476有1个16位定时器PCA0,PCA0具有两路独立比较捕捉模块
  2. 可以实现相位修正,相频修正

与标准的8051计数器/定时器相比,PCA0需要较少的CPU干预 。

3. PCA0 功能

  • 1个专用的16位计数器/定时器
  • 2个16位捕捉/比较模块
    每个捕捉/比较模块有自己的I/O线(P0CEX0,P0CEX1)。

4. 时钟

PCA0的计数器/定时器有一个可编程选择时钟源:系统时钟、系统时钟/4、系统时钟/12、系统时钟/32、定时器4溢出或ECI0 输入引脚上的外部时钟信号、32.768KHz晶振/内建128kHzRC,通过P0CMD寄存器中的P0CPS2-P0CPS0位选择定时器/计数器的时钟源:

P0CPS2P0CPS1P0CPS0时钟源
000系统时钟
001系统时钟的4分频
010系统时钟的12分频
011系统时钟的32分频
100定时器4溢出
101保留
110ECI0下降沿
11132.768Khz/内建128kHzRC

按官方文档说明:

  • 系统时钟频率不得低于计数时钟频率的4倍频(计数时钟为系统时钟时除外)。
  • 当OP_OSC[3:0] = 1010(32.768kHz晶体谐振器作为振荡器1,24MHz内部RC作为振荡器2),外部32.768kHz晶振作为计数源时钟;当OP_OSC[3:0]=0011(内部128KHz RC振荡器作为振荡器1,24MHz内部RC作为振荡器2)时,内建的128kHz作为计数器源时钟。

5. PCA0原理框图

在这里插入图片描述

6. 工作方式

PCA0 可以工作在Mode0、Mode1、Mode2、Mode3等4种方式,其中Mode3可分成以下几种 PWM 方式:

  • 8位PWM(单斜坡)
  • 16位PWM(单斜坡)
  • 16位相位修正PWM(双斜坡)
  • 16位相频修正PWM(双斜坡)

二、PCA0寄存器

1. PCA0标志寄存器

98H,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
P0CFCF0-----P0CCF1P0CCF0
读/写读/写-----读/写读/写
复位值(POR/WDT/LVR/PIN)0-----0-

位编号说明:

位编号位符号说明
7CF0PCA0计数器/定时器溢出标志
1P0CCF1PCA0模块1捕捉/比较标志
0P0CCF0PCA0模块0捕捉/比较标志

2. PCA使能寄存器

D8H,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
PCACON-------PR0
读/写-------读/写
复位值-------0

PR0 位编号说明:
PCA0 计数器/ 定时器运行控制位:

  • 0:禁止PCA0计数器/定时器
  • 1:允许PCA0计数器/定时器

3. PCA0方式寄存器

99H,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
P0CMDECF0P0SDEN---P0CPS2P0CPS1P0CPS0
读/写读/写读/写---读/写读/写读/写
复位值00---000

位编号说明:

位编号位符号说明
7ECF0PCA0计数器/定时器溢出中断允许位
6P0SDEN单/双斜坡选择位
2P0CPS2PCA0计数器/定时器时钟选择
1P0CPS1PCA0计数器/定时器时钟选择
0P0CPS0PCA0计数器/定时器时钟选择

4. P0CPMn PCA捕捉/比较寄存器

9AH-9BH,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
P0CPM0P0SMP0P0SMN0P0FSP0P0FSN0P0ECOM0P0TCP0P0MAT0P0ECCF0
P0CPM1P0SMP1P0SMN1P0FSP1P0FSN1P0ECOM1P0TCP1P0MAT1P0ECCF1
读/写读/写读/写读/写读/写读/写读/写读/写读/写
复位值00000000

位编号说明:

位编号位符号说明
7P0SMPnPCA0模式选择位
6P0SMNnPCA0捕捉方式选择位
5P0FSPnPCA0捕捉方式选择位
4PxECOMn比较/捕捉模块功能使能位
3P0TCPnPCA0捕捉信号边沿指示位/波形输出控制位
2-此位在频率输出方式下无效
1P0MATn匹配标志控制位
0P0ECCFn捕捉/比较标志中断允许位

5. P0FORCE强制输出控制寄存器

DCH ,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
P0FORCE--P0OSC1P0OSC0--P0FCO1P0FCO0
读写--读/写读/写--读/写读/写
复位值--00--00

位说明:

位编号位符号说明
5P0OSC1模块1引脚P0CEX1输出寄存器,该位只有当P0SMPn:P0SMNn=01且P0FSPn:P0FSNn=1x时有效
4P0OSC0模块0引脚P0CEX0输出寄存器,该位只有当P0SMPn:P0SMNn=01且P0FSPn:P0FSNn=1x时有效
1P0FCO1模块1强制匹配控制位(该位只有当P0SMPn:P0SMNn=01时有效)
0P0FCO0模块0强制匹配控制位(该位只有当P0SMPn:P0SMNn=01时有效)

6. PCA0计数最大值低字节

P0TOPL, 9EH ,Bank1。

7. PCA0计数最大值高字节

P0TOPH, 9FH, Ban1。

8. PCA0比较/捕捉模块低字节

  • P0CPL0 (9CH)
  • P0CPL1 (ACH)

9. PCA0比较/捕捉模块高字节

  • P0CPH0(9DH)
  • P0CPH1(ADH)

三、中断

SH79F9476的PCA0中断号是20,

  • 向量地址:00A3H;
  • 允许位:EPCA0
  • 标志位:CF0/P0CCF0/P0CCF1

示例:

void INT_PCA0(void) interrupt 20
{ 
    
}

四、工作方式详解

1. Mode0 边沿触发的捕捉模式

(1)工作方式介绍

在这种模式下,当P0CEXn引脚上的电平发生跳变时,PCA0计数器/定时器的当前计数值将被捕获并存储到对应模块的16位捕捉/比较寄存器(P0CPLn和P0CPHn)中。

要启用这种捕捉方式,需要配置P0SMPn寄存器的P0SMNn位和P0SMNn位为00。

可以通过PCA0CPMn寄存器中的P0FSPn和P0FSNn位选择触发捕捉的电平变化类型,用来选在低电平到高电平变化时触发(P0FSPn:P0FSNn = 00)、在高电平到低电平变化时触发(P0FSPn:P0FSNn = 10),或者在任何电平变化时触发(P0FSPn:P0FSNn = 11)。

当捕捉事件发生时,PCA0CF中的捕捉/比较标志(P0CCFn)会被置为逻辑‘1’,并产生一个中断请求(如果已允许中断)。当CPU进入中断服务程序时,P0CCFn位不会自动清零,需要通过软件来清除。如果P0FSPn和P0FSNn位都设置为逻辑‘1’,可以通过读取P0CPMn寄存器的P0TCPn位来确定本次捕捉是由上升沿触发还是由下降沿触发。

要注意: P0CEXn 输入信号必须在高电平或低电平期间至少保持四个系统时钟周期,以保证能够被硬件识别。

捕获原理框图:
在这里插入图片描述

(2)代码实现

下面代码配置PCA0工作方式0 , 在 P0CEX0(P1.2)输入1kHz信号,配置双边沿触发方式,在P1_0口输出方波。

#include "pca0_util.h"

/**
* @brief PCA0 工作方式0 边沿触发
*/
void PCA0Mode0(void){
    select_bank1();
    // 工作在单沿模式、禁止PCA0溢出中断、选择系统时钟作为PCA0时钟源
  P0CMD=0x00;
    // 捕捉方式、任意沿触发、打开捕捉/比较中断、使能比较/捕捉模块0
  P0CPM0=0x39;
    // 配置计数器最大值
  P0TOPH=0x08;
  P0TOPL=0x00;
    // 启动PCA0计数器
  PCACON=0x1;
    select_bank0();
}
/**
* @brief PCA0中断
*/
void INT_PCA0(void) interrupt 20
{ 
  _push_(INSCON);
  Select_Bank1();
	// 清除溢出标志
  P0CF = 0x00;
	Select_Bank0();
	P1_0=~P1_0;
  _pop_(INSCON);       
}

P1_0 输出波形频率1kHz,如下图所示:
在这里插入图片描述
计数器值可以从P0CPLn、P0CPHn获取。

2. Mode1 软件定时器方式

(1)工作方式简介

在软件定时器方式下(也称为比较输出方式),可以实现连续的软件定时。在这种模式下,PCA0会将计数器/定时器的计数值与对应模块的16位捕捉/比较寄存器(P0CPHn和P0CPLn)进行比较。当计数值与比较寄存器中的值匹配时,PCA0CF中的捕捉/比较标志(P0CCFn)会被置为逻辑‘1’(如果P0MATn = 1),并且会产生一个中断请求(如果已经允许中断)。此外,与模块相关的P0CEXn引脚上的逻辑电平也会发生变化(通过简单设置P0TCPn来启用该功能)。

当CPU进入中断服务程序时,P0CCFn位不会自动清零,需要通过软件来清除。

原理框图:
在这里插入图片描述

(2)代码实现

下面代码实现连续软件定时,当PCA0计数值与P0CPH0和P0CPL0中的值匹配时产生一次中断,同时P0CEX0(P1.2) 口翻转一次。

/**
* @brief PCA0 工作方式1 软件定时器
*/
void PCA0Mode1(void){
  select_bank1();
  // 单沿模式、禁止PCA0溢出中断、选择系统时钟作为PCA0时钟源
  P0CMD = 0x00;
  // 连续软件定时方式、允许P0CEX0输出波形、打开捕捉/比较中断
  P0CPM0 = 0x47;
  // 配置PCA0 计数器最大值
  P0TOPH = 0x40;
  P0TOPL = 0x20;
  // 配置比较/捕捉模块匹配值
  P0CPH0 = 0x00;
  P0CPL0 = 0x20;
  // 使能比较/捕捉模块
  P0CPM0 |= 0x08;
  // 启动PCA0计数器
  PCACON = 0x1;
  select_bank0();
}

频率计算: 24M/(0x4020*2) 约为731Hz,实测波形:
在这里插入图片描述

3. Mode2 频率输出方式

(1)工作方式简介

在频率输出方式下,模块的P0CEXn引脚会产生可编程频率的方波。要启用这种模式,需要设置P0SMPn寄存器的P0SMNn位为10。在这种模式下,P0CPn寄存器的更新不使用双缓冲机制。

方波的频率由以下公式确定:

F P 0 C E X n = F P C A 0 2 × P 0 C P H n F_{P0CEXn} = \frac{F_{PCA0}}{2 \times P0CPHn} FP0CEXn=2×P0CPHnFPCA0

其中,( F_{PCA0} ) 是由PCA0的方式寄存器(P0CMD)中的P0CPS2-P0CPS0位选择的PCA0时钟的频率。
P0CPHn中的值代表P0CEXn引脚发生电平变化前要计的PCA时钟数。如果P0CPHn的值为0x00,相当于256。

具体操作流程如下:

  1. 比较/捕捉模块的低字节P0CPLn与PCA0计数器的低字节进行比较。
  2. 当两者匹配时,P0CEXn引脚的电平会发生改变,并且P0CPLn中的偏移值会加到P0CPHn。
  3. 计数器会继续计数,直到再次匹配。
  4. 周而复始,P0CEXn引脚输出频率由P0CPHn控制。

如果PCA0的某个比较/捕捉模块启用了该模式,P0TOPL的值将固定为0xFF,用户可以通过配置P0TOPH值来改变计数的最大值。

(2)代码实现

下面代码实现 P0CEX0 引脚可输出750kHz波
形,频率计算为:
24 M 2 ∗ 0 x 10 = 750 k H z \frac{24M}{2*0x10} = 750kHz 20x1024M=750kHz

/**
* @brief PCA0 工作方式2 频率输出方式
*/
void PCA0Mode2(void){
  select_bank1();
  // 单沿模式、允许PCA0溢出中断、选择系统时钟作为PCA0时钟源
  P0CMD = 0x80;
  // 频率输出方式、允许P0CEX0输出波形
  P0CPM0 = 0x80;
  // 配置比较/捕捉模块匹配值
  P0CPH0 = 0x10;
  P0CPL0 = 0x20;
  // 使能比较/捕捉模块、启动PCA0计数器
  PCACON = 0x1;
  P0CPM0 |= 0x08;
  select_bank0();
}

实测波形752kHz。
在这里插入图片描述

修改 P0CPHn 可以改变输出波形。

4. Mode3 PWM模式

(1)工作方式简介

PCA0的每个模块都可以被独立地配置为产生脉宽调制(PWM)输出。要启用PWM模式,可以通过配置P0SMPn寄存器的P0SMNn位为11来实现。

功能配置

在PWM模式下,可以通过配置P0FSPn和P0FSNn位来选择四种不同的PWM功能:

  • 8位PWM(单斜坡)
  • 16位PWM(单斜坡)
  • 16位相位修正PWM(双斜坡)
  • 16位相频修正PWM(双斜坡)
溢出与自动重载

当比较/捕捉模块工作在8位PWM功能时,PCA0Counter低8位PL0从0x00向P0TOPL递增计数(单斜坡模式)。当PL0溢出时(从0xFF到0x00),保存在P0CPHn中的值被自动装入到P0CPLn,这个过程不需要软件干预。

占空比

在8位PWM方式下,P0CPHn寄存器用来改变PWM输出信号的占空比。当P0TCPn = 0时,当PCA计数器/定时器的低字节(PL0)与P0CPLn中的值相等时,P0CEXn引脚上的输出被清‘0’;当PL0中的计数值溢出时,P0CEXn输出被置‘1’。而当P0TCPn = 1时,P0CEXn引脚输出相反极性的波形。

8位PWM方式的占空比计算公式为:
[ \text{Duty} = \frac{256 - (P0CPHn + 1)}{256} ]

工作方式原理框图

在这里插入图片描述

(2)8位脉宽PWM代码实现

下面代码实现输出:

  • P0CEX0(P1.2) 输出占空比为 0.8 的正向波形,
  • P0CEX1(P1.0) 输出占空比为 0.8 的反向波形。

其中占空比的计算:
D u t y = ( 256 − ( P 0 C P H n + 1 ) ) 256 ≈ 0.8 Duty = \frac{(256-(P0CPHn+1))}{256} ≈ 0.8 Duty=256(256(P0CPHn+1))0.8

频率为 24M/0xFF≈94KHz

/**
* @brief PCA0 工作方式3 PWM8模式
*/
void PCA0Mode3PWM8(void){
  select_bank1();
  // 单沿模式、允许PCA0溢出中断、选择系统时钟作为PCA0时钟源
  P0CMD = 0x80;

  // P0CM0 配置比较/捕捉模块0工作方式:PWM8模式、打开捕捉/比较中断
  P0CPM0 = 0xC3;
  // 配置比较/捕捉模块0匹配值
  P0CPH0 = 0x30;
  P0CPL0 = 0x30;
  // 使能比较/捕捉模块、PWM正向输出波形
  P0CPM0 |= 0x08;

  // P0CPM1 配置比较/捕捉模块1工作方式: PWM输出方式,打开捕捉/比较中断
  P0CPM1 = 0xC3;
  // 配置比较/捕捉模块1匹配值
  P0CPH1 = 0x30;
  P0CPL1 = 0x30;
  // 使能比较/捕捉模块1、PWM反向输出波形
  P0CPM1 |= 0x0C;
  
  // 启动PCA0计数器
  PCACON = 0x01;
  select_bank0();
}

在这里插入图片描述

在这里插入图片描述

(3)16 位脉宽调制器(PWM16 )实现

16位脉宽调制(PWM)与8位PWM相似,都是基于PCA0计数器的单边计数模式。在16位PWM模式下,P0CPn(16位捕捉/比较模块)定义了PWM信号低电平的持续时间,以PCA0时钟数计算。当P0TCPn = 0时,当PCA0计数器与P0CPn值匹配时,P0CEXn输出被置为低电平;当计数器溢出时,P0CEXn输出被置为高电平。当P0TCPn = 1时,P0CEXn引脚输出极性相反的波形。

16位PWM的占空比计算方式为:Duty =(65536-(P0CPn+1))/65536。

下面代码实现:

  • P0CEX0 输出占空比为 0.8 的正向波形,
  • P0CEX1 输出占空比为 0.8 的反向波形。

频率为 24M/0xFFFF≈366Hz

/**
* @brief PCA0 工作方式3 PWM16模式
*/
void PCA0Mode3PWM16(void){
  select_bank1();
  // 单沿模式、允许PCA0溢出中断、选择系统时钟作为PCA0时钟源
	P0CMD=0x80;
  // P0CPM0 配置比较/捕捉模块0工作方式:PWM16模式、打开捕捉/比较中断
	P0CPM0=0xD3;
  // 配置比较/捕捉模块0匹配值
	P0CPH0=0x30;
	P0CPL0=0x30;
  // 使能比较/捕捉模块0、PWM正向输出波形
	P0CPM0|=0x08;

  // P0CPM1 配置比较/捕捉模块1工作方式:PWM16模式,打开捕捉/比较中断
	P0CPM1=0xD3;
  // 配置比较/捕捉模块1匹配值
	P0CPH1=0x30;
	P0CPL1=0x30;
  // 使能比较/捕捉模块1、PWM反向输出波形
	P0CPM1|=0x0c;

  // 启动PCA0计数器
	PCACON=0x1;
  select_bank0();
}

在这里插入图片描述

在这里插入图片描述

(4) 16位相位修正脉宽XPWM16

16位相位修正脉宽调制器(XPWM16)提供了一种获得高精度、相位准确的PWM波形的方法。这种模式基于双斜坡操作,即计时器从0x0000计数到P0TOP,然后从P0TOP倒退回到0x0000。在P0TCPn = 0时,当计时器往P0TOP计数时,若PCA0计数器与P0CPn匹配,P0CEXn输出被置为低电平;而在计时器往0x0000计数时,若PCA0计数器与P0CPn匹配,P0CEXn输出被置为高电平。当P0TCPn = 1时,P0CEXn引脚输出极性相反的波形。

在16位相位修正PWM模式下,PWM的分辨率由P0TOP定义,最小分辨率为2比特(P0TOP设为0x0003),最大分辨率为16位。PWM周期起始于P0TOP点,终止于P0TOP点,并且P0TOP和P0CPn寄存器的值在达到P0TOP值时得到更新。

若要在PCA0运行时改变P0TOP值,建议使用相位与频率修正模式代替相位修正模式。若P0TOP保持不变,则这两种模式实际上没有区别。

在相位修正模式下,PWM的频率为:
F P x XPWM = f sysclk 2 × P0TOP F_{P_x\text{XPWM}} = \frac{f_{\text{sysclk}}}{2 \times \text{P0TOP}} FPxXPWM=2×P0TOPfsysclk

匹配值P0CPn和最大值P0TOPn用来修改占空比,计算公式与后面16位相频修正方式相同 。

下面的代码实现:

  • P0CEX0 输出频率为 46.9KHz 的正向波形,
  • P0CEX1 输出频率为 46.9Hz 的反向波形

频率计算为: 24M/(2*0x0100) ≈ 47kHz

/**
* @brief PCA0 工作方式3 XPWM16模式
*/
void PCA0Mode3XPWM16(void){
  select_bank1();
  // 双沿模式、允许PCA0溢出中断、选择系统时钟作为PCA0时钟源
	P0CMD=0xC0;
  // 配置PCA0计数最大值
	P0TOPH=0x01;
	P0TOPL=0x00;

  // P0CPM0 配置比较/捕捉模块0工作方式:16位相位修正PWM输出方式、打开捕捉/比较中断
	P0CPM0=0xE3;
  // 配置比较/捕捉模块0匹配值
	P0CPH0=0x0;
	P0CPL0=0x90;
  // 使能比较/捕捉模块0、PWM正向输出波形
	P0CPM0|=0x08;

  // P0CPM1 配置比较/捕捉模块1工作方式:16位相位修正PWM输出方式,打开捕捉/比较中断
	P0CPM1=0xE3;
  // 配置比较/捕捉模块1匹配值
	P0CPH1=0x0;
	P0CPL1=0x90;
  // 使能比较/捕捉模块1、PWM反向输出波形
	P0CPM1|=0x0c;
  
  // 启动PCA0计数器
	PCACON=0x1;
  select_bank0();
}

在这里插入图片描述

在这里插入图片描述

(5) 16 位相频修正 XPPWM16 方式

相频修正PWM(XPPWM)模式也是一种基于双斜坡操作的方法,用于产生高精度、相位与频率准确的PWM波形。

相频修正PWM模式与相位修正PWM模式的主要区别在于P0CPn和P0TOP寄存器的更新时间。在相频修正PWM模式中,P0CPn和P0TOP寄存器的值在0x0000点更新,而在相位修正PWM模式中则是在P0TOP点更新。因此,在相频修正PWM模式下,PWM输出的所有周期均为对称信号,这确保了输出的脉冲是绝对对称的,从而保证了频率的准确性。在P0CPn寄存器通过双缓冲方式得到更新的同一个时钟周期里,PCA0溢出标志CF0被置位,可用来在每次计数器达到0x0000时产生中断。

相频修正PWM模式的PWM分辨率由P0TOP定义,最小分辨率为2比特(P0TOP设为0x0003),最大分辨率为16位(P0TOP设为0xff)。

输出的PWM频率由以下公式定义:
F P x XPPWM = f sysclk 2 × P0TOP F_{P_x\text{XPPWM}} = \frac{f_{\text{sysclk}}}{2 \times \text{P0TOP}} FPxXPPWM=2×P0TOPfsysclk
输出的占空比由以下公式定义:
Duty = ( P 0 T O P − P 0 C P n ) P 0 T O P \text{Duty} = \frac{(P0TOP - P0CPn)}{P0TOP} Duty=P0TOP(P0TOPP0CPn)

下面代码实现:

  • P0CEX0 输出频率为 46.9KHz 的正向波形
  • P0CEX1 输出频率为 46.9KHz 的反向波形
    频率为: 24M/(2*0x100) ≈ 47kHz
    占空比: (0x100-0x90)/0x100 ≈ 0.44
    与相位修正方式相比 ,仅修改了工作模式值。
/**
* @brief PCA0 工作方式3 XPPWM16模式
*/
void PCA0Mode3XPPWM16(void){
  select_bank1();
  // 双沿模式、允许PCA0溢出中断、选择系统时钟作为PCA0时钟源
	P0CMD=0xC0;
  // 配置PCA0计数最大值
	P0TOPH=0x01;
	P0TOPL=0x00;

  // P0CPM0 配置比较/捕捉模块0工作方式:16位相频修正PWM输出方式、打开捕捉/比较中断
	P0CPM0=0xF3;
  // 配置比较/捕捉模块0匹配值
	P0CPH0=0x0;
	P0CPL0=0x90;
  // 使能比较/捕捉模块0、PWM正向输出波形
	P0CPM0|=0x08;

  // P0CPM1 配置比较/捕捉模块1工作方式:16位相频修正PWM输出方式,打开捕捉/比较中断
	P0CPM1=0xF3;
  // 配置比较/捕捉模块1匹配值
	P0CPH1=0x0;
	P0CPL1=0x90;
  // 使能比较/捕捉模块1、PWM反向输出波形
	P0CPM1|=0x0c;
  
  // 启动PCA0计数器
	PCACON=0x1;
  select_bank0();
}

在这里插入图片描述
本文学习资源来自中颖官方文档。
本文代码开源地址:
https://gitee.com/xundh/learn-sinowealth-51

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《极域多媒体教室互动管理系统软件》控制方法大全

前言及背景: 当我坐在电脑前,打开它,点开谷歌,刚刚想打开百度,突然闪出来了: 该网页已被阻止!!! 正文: 1.极域控制原理: 好…

使用EZDML自动生成测试数据

项目场景: 项目开发时,新创建的表需要增加一部分测试数据用于简单的功能测试。 问题描述 无论使用代码还是使用plsql自带的数据生成工具都感觉有点麻烦,我只想点点点就能生成数据。 解决方案: 提示:这里填写该问题的具体解决方案: 使用 EZDML 可以方便的生成测试数据。…

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:(1)训练初始数据&…

如何开始用 C++ 写一个光栅化渲染器?

光栅化渲染器是计算机图形学中最基础且广泛应用的一种渲染技术,它将三维模型转化为二维图像。下面我们将逐步介绍如何使用C语言从零开始构建一个简单的光栅化渲染器。 一、理解光栅化渲染原理 光栅化是一种将几何数据(如点、线、三角形)转换…

一文详解手机IP地址如何改变

在互联网时代,手机的IP地址扮演着至关重要的角色。它不仅是手机在网络中的标识,还关系到手机的网络连接、隐私保护以及访问权限等方面。然而,在某些情况下,我们可能需要改变手机的IP地址,以满足特定的需求或解决网络问…

8×8点阵数码管显示驱动/大电流数码管驱动IC-VK16K33C SOP20

产品品牌:永嘉微电/VINKA 产品型号:VK16K33C 封装形式:SOP20 概述 VK16K33C是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁 存器、键盘扫描、LED 驱动模块等电路。数据通过I2C通讯接口与MCU通信。SE…

腾讯再次回归电商,视频号小店真的要起飞了?

大家好,我是电商小布。 在互联网快速发展的现状下,各个平台都开始加入到电商这一行。 就连之前在电商上栽过跟头的腾讯,都再次回归电商,推出了视频号小店这个项目。 视频号小店背靠着视频号平台,结合当前最热的电商…

数字中国_智慧公厕

在面向未来构建城市竞争新优势、推动城市治理现代化的进程中,推进城市智慧化发展、数字化转型显得尤为重要。作为一种新形态的信息化公共厕所,智慧公厕扮演着举足轻重的角色,对于智慧城市和智慧乡村的发展至关重要,也是城市信息化…

如何加密VM虚拟机

参考官方文档:加密虚拟机 (vmware.com) 选择该虚拟机,然后选择虚拟机 > 设置。在选项选项卡中,选择访问控制。单击加密。选择适当的加密类型。单击加密,键入加密密码,然后单击加密。 要获得虚拟机的访问权限&#…

C++ primer 第十八章

C语言的三大特性:异常处理、命名空间、多重继承。 1.异常处理 异常处理机制允许我们能够将问题的检测与解决过程分离开来。 1.1、抛出异常 在C语言中,我们通过抛出一条表达式来引发一个异常。 当执行一个throw时,程序的控制权从throw转移…

linux 开机自启动

方式1—依赖桌面启动,一般适用与UI相关程序 1、创建运行脚本,以管理员放方式运行,加入密码 vim runapp.sh #!/bin/bash cd /home/nvidia/test echo ‘passcode’ | sudo -S ./testapp 2、终端输入 gnome-session-properties 3、在com…

【超简单】基于PaddleSpeech搭建个人语音听写服务

一、【超简单】之基于PaddleSpeech搭建个人语音听写服务 1.需求分析 亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?当您面对成吨的会议录音,着急写会议纪要而不得不愚公移山、人海战术?听的头晕眼花,听的漏洞百出,听的怀疑人生,那么你…

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

React Redux 和 Vuex 都是前端状态管理库,分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制,帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点: 相同点: 中心化状态管理:两者都提…

OSCP靶场--Nagoya

OSCP靶场–Nagoya 考点 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.214.21 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-02 08:52 EDT Nmap scan report for 192.168.214.21 Host is up (0.38s latency).…

一文介绍CNN/RNN/GAN/Transformer等架构 !!

文章目录 前言 1、卷积神经网络(CNN) 2、循环神经网络(RNN) 3、生成对抗网络(GAN) 4、Transformer 架构 5、Encoder-Decoder架构 前言 本文旨在介绍深度学习架构,包括卷积神经网络CNN、循环神经…

K8S node节点配置

1.开始操作之前要先关闭防火墙,SELinux,swap分区 关闭防火墙 sudo systemctl stop firewalld关闭SELinux sudo setenforce 0 # 临时关闭 sudo sed -i s/^SELINUXenforcing$/SELINUXper…

应用Ribo-seq技术量化tRNA对乳腺癌细胞转移的调控

技术简介 Ribo-seq,又称为Ribosome Profiling或者翻译组测序,能够对与核糖体结合并正在被翻译的约30 nt的mRNA片段进行测序,详细检测体内的翻译状态,Ribo-seq是连接转录组学与蛋白质组学之间的桥梁。该技术可构建癌细胞全基因组水…

为什么PCB板上需要晶振

PCB板,即印刷电路板,是现代电子设备中不可或缺的组成部分。它的基本功能是提供电子元件之间的电气连接,使电子元件能够正确、高效地工作。然而,为了使电子设备能够正常工作,PCB板上的电子元件需要遵循一定的时序和频率…

Java入门基础知识第八课(数组)——冒泡排序、Arrays工具类

前面二白讲了关于数组的概念、语法以及简单的输入输出,实际上关于数组的知识还有很多,接下来咱们讲一下冒泡排序以及一些常用的Arrays工具类,需要记忆的知识很多,而且容易混淆。 一、冒泡排序 简介(原理)…

浅谈LockBit勒索病毒

在数字时代,随着科技的飞速发展,网络安全问题愈发凸显。恶意软件和勒索软件等网络威胁正不断演变,其中一款备受关注的勒索软件就是LockBit。本文将深入介绍LockBit的特征、攻击手段及对网络安全的威胁。 主要特征 LockBit是一种高度复杂且具…