DSP学习记录之eCAP

eCAP(推荐从第二章工作原理开始看)

一、构成及工作模式

1.基本介绍及构成

捕获单元模块(eCAP)能够捕获外部输入引脚的逻辑状态(电平的高或者低、低电平翻转时的上升沿或下降沿),并利用内部定时器对外部事件或者引脚状态变化进行处理

通常用来测量脉冲信号的周期和占空比(计算传感器幅值)、电机测速(捕捉HALL传感器脉冲)、测量脉冲电平宽度

模块结构框图如下:

构成包括:· 专用的捕获输入引脚;

32位时钟计数器,用于计时;

4个32位的时间寄存器,用于保存不同捕获阶段的时间信息(CAP1~CAP4);

4级序列发生器(Modulo4计数器)可与eCAP引脚上升/下降沿事件同步;

可为4个捕获事件设定独立的边沿极性;

输入信号的预分频功能;

单次捕获功能,比较寄存器在1~4次捕获事件后,可停止捕获;

连续捕获功能;

4次捕获事件均可触发中断。

(1)工作模式

eCAP模块用于输入可以实现捕获功能,即捕获工作模式;用于输出还可以作为一个单通道的脉冲发生器,产生PWM,即APWM工作模式。两种工作模式区别:

如上图:

a.当eCAP模块工作在捕获模式时,计数器工作在增计数模式,CAP1~CAP4用来保存时间信息;

b.当eCAP模块工作在APWM模式时,计数器也工作在增计数模式,可以产生不对称PWM,此时CAP1作为周期寄存器,CAP2作为比较寄存器,CAP3作为周期寄存器的映射寄存器,CAP4作为比较寄存器的映射寄存器。当使用映射模式时,给CAP1/CAP2写任何值的时候,同样会写入相应的映射寄存器CAP3/CAP4。

2.捕获模式

工作模式结构图如下:

可以看到,从右到左分别有:事件(脉冲)预分频、极性选择、单次/连续控制、中断控制等

(1)输入信号分频

当输入信号频率较高时,测量可能出错,可以通过预分频器进行分频来测量

(2)32位计数器

eCAP模块用一个32位计数器来计时,该计数器直接由系统时钟SYSCLKOUT驱动,即这个计数器的时钟等于SYSCLKOUT,如果 SYSCLKOUT为150MHz,那么eCAP的时钟频率也为150MHz,每隔6.67ns计数一次。

相位寄存器通过软件或硬件方式将多个eCAP模块的计数器进行同步,这个功能在eCAP模块工作在APWM方式下时可控制PWM脉冲间的相位关系。

(3)边沿极性选择和CAPx寄存器

极性选择的主要作用是确定捕获脉冲在上升沿还是下降沿

可通过寄存器为4个捕获事件CEVT1~CEVT4独立选择上升沿或下降沿捕获,同时每个边沿都可通过Modulo4序列发生器进行限定。

当eCAP模块捕获到边沿事件时,可将这一刻时间计数器的值锁存到相应的CAPx寄存器中,CAPx寄存器在下降沿时进行装载。可通过寄存器ECCTL1 的CAPLDEN位可禁止或使能装载功能

CAPx寄存器在APWM工作模式下,CAP1和CAP2寄存器分别用作周期寄存器和比较寄存器,而CAP3和CAP4用作周期映射寄存器和比较映射寄存器。

(4)单次捕获和连续捕获

eCAP模块可以通过寄存器ECCTL2的CONT/ONESHT位来选择连续捕获或者单次捕获。

Mod4是一个两位的计数器,在边沿捕获事件(CEVT1~CEVT4)发生时按照0→1→2→3→0的顺序进行增计数,直到有事件将其停止。
a.在单次模式下,Mod4计数器会和ECCTL2的STOP_WRAP位进行比较,STOP_WRAP位可以被设置为0~3,当Mod4计数器的值等于STOP_WRAP位的值时,计数器停止计数,并且禁止装载CAPx寄存器,即捕获功能停止工作。开始下次捕获前,需要将ECCTL2 的重新装载位REARM置1,这样可以将Mod4计数器复位到0,Mod4计数器可以重新开始计数,同时也使能了CAPx的装载功能。

b.在连续模式下,Mod4计数器会随着捕获事件的发生连续增计数(0→1→2→3→0),时钟计数器的值会连续不断地被锁存到CAP1~CAP4中。

(5)中断

产生中断的事件: eCAP模块一共可以产生7种中断事件:CEVT1、CEVT2、CEVT3、CEVT4、CNTOVF、CTR=PRD和CTR=CMP。

a.在捕获工作模式下有5种,其中CEVT1~CEVT4为捕获中断事件,当相应的边沿被捕获到时,产生该事件;CNTOVF为时钟计数器上溢事件,当32位的时钟计数器计数到溢出时,产生该事件。

b.在APWM工作模式下有两种中断事件:周期中断CTR=PRD和比较中断CTR=CMP。当计数器的值等于周期寄存器时,产生周期中断;当计数器的值等于比较寄存器时,产生比较中断。

中断相关寄存器: eCAP模块和中断相关的有4个寄存器:中断使能寄存器ECEINT、中断标志寄存器ECFLG、中断清除寄存器ECCLR和中断强制寄存器ECFRC。

中断的清除与复位: 可以通过中断使能寄存器ECEINT来使能/禁止每个中断事件,而中断标志寄存器ECFLG可以表明某个中断事件是否已经发生,并且包含全局中断标志位INT。在中断复位程序中,必须通过写ECCLR寄存器中相应的位来清除中断标志位,以便接收下一个中断事件。通过中断强制寄存器ECFRC可以软件强制产生中断事件,用于测试。

3.APWM模式

eCAP模块可以配置为APWM模式,此时CAP的引脚向外输出PWM脉冲。

二、工作原理举例

1.工作原理

以连续事件捕获举例:

如图,CEVT1配置为上升沿、CEVT2配置为下降沿、CEVT3配置为上升沿、CEVT4配置为下降沿,moudle4寄存器不断连续循环0到1顺序

eCAP模块有一个32位的时间计数器,工作时它会从0计数到0xFFFFFFFF,每次增加1,循环计数。计数器的时钟为SYSCLKOUT,比如系统时钟为150MHz,则每计一次数经过了6.67ns ,从而由时间计数器的值便可计算得到相应的时间。

当计数由0xFFFFFFFF变为0时,会产生一个溢出信号,对应于计数器溢出中断CNTOVF。

当CAP引脚上的脉冲跳变信息(上升沿或下降沿)和设定捕获的边沿信息相同时,便产生了一个捕获事件。eCAP模块支持4个连续的捕获事件CEVT1~CEVT4,通过寄存器配置可以给这4个捕获事件选择需要捕获的边沿极性。

eCAP开始工作时,计数器开始计数,Mod4序列控制计数器也开始计数,首先Mod4的值是0,当引脚捕获到上升沿时,发生捕获事件CEVT1,如果使能了CAPx的装载功能,则将时间计数器的值装载到CAP1中,此时,时间计数器可以继续计数,也可以被复位清0,重新开始计数,这取决于寄存器的配置。时间计数器如果在每次捕获事件发生时不复位,即连续不断地从0计数到0xFFFFFFFF,周而复始,称时间计数器工作在绝对时间模式下;如果在每次捕获事件发生时复位,则称时间计数器工作在差分时间模式下

接下来,Mod4的值为1,当引脚捕获到下降沿时,发生捕获事件CEVT2,时间计数器的值装载进CAP2。接下来,Mod4的值为2,当引脚捕获到上升沿时,发生捕获事件CEVT3,时间计数器的值装载进CAP3。接下来,Mod4的值为3,当引脚捕获到下降沿时,发生捕获事件CEVT4,事件计数器的值装载进CAP4。然后Mod4的值为0,如此循环。通过CAP1~CAP4 寄存器记录的时间便可计算得到脉冲的信息。

实际使用时,边沿极性可自由选择设置。如果使能了捕获事件CEVT1~CEVT4或者溢出事件CNTOVF的中断,则事件发生时便会响应相应的中断。

注意

(1)TMS320F28335有6个eCAP模块eCAP1~6,实际使用时可能不会全部使用,由于功能引脚都是复用的,所以要根据实际情况来选择。每个eCAP模块都有4个时间寄存器CAP1 ~CAP4,eCAP模块和时间寄存器CAPx的表述不要搞混

(2)在发生捕获事件时,时间计数器的值是否装载入CAP寄存器,取决于ECCTL1的CAPLDEN位,而与是否进入CAP中断没有关系。

2.脉冲捕捉实例

在实际使用中,eCAP 控制寄存器1(ECCTL1)的四个CTRRST位用来控制在捕获事件发生后是否重置计数器,如果不重置,则说eCAP工作于绝对时间模式,反之,工作于差分时间模式,下面举例说明这两种模式下eCAP的测量脉冲周期和占空比方法:

(1)绝对时间模式测量脉冲周期/占空比

如图,CEVT1配置为上升沿,CEVT2为下降沿,CEVT3配置为上升沿,CEVT4为下降沿,对应的计时器计时时间为图中的 t 1 , t 2 , t 3 , t 4 t_1 ,t_2,t_3,t_4 t1,t2,t3,t4,后面时间按照顺序排列。则

第一个脉冲的周期为: T = t 3 − t 1 T=t_3-t_1 T=t3−t1,占空比为 D = t 2 − t 1 t 3 − t 1 D=\frac{t_2-t_1}{t_3-t_1} D=t3−t1t2−t1

第二个脉冲的周期为: T = t 5 − t 3 T=t_5-t_3 T=t5−t3,占空比为 D = t 4 − t 3 t 5 − t 3 D=\frac{t_4-t_3}{t_5-t_3} D=t5−t3t4−t3

(2)差分时间模式测量脉冲周期/占空比

该种情况和上面一种的区别在于:在每个捕获事件发生后,重置计时器

如图,CEVT1配置为上升沿,CEVT2为下降沿,CEVT3配置为上升沿,CEVT4为下降沿,对应的计时器计时时间间隔为图中的 T 1 , T 2 , T 3 , T 4 T_1 ,T_2,T_3,T_4 T1,T2,T3,T4,后面时间按照顺序排列。则

第一个脉冲的周期为: T = T 1 + T 2 T=T_1+T_2 T=T1+T2,占空比为 D = T 1 T 1 + T 2 D=\frac{T_1}{T_1+T_2} D=T1+T2T1

第二个脉冲的周期为: T = T 3 + T 4 T=T_3+T_4 T=T3+T4,占空比为 D = T 3 T 3 + T 4 D=\frac{T_3}{T_3+T_4} D=T3+T4T3

三、寄存器汇总

所有寄存器及地址:

(1)时间标志寄存器(TSCTR)

(2)计数相位寄存器(CTRPHS)

(3)捕获寄存器1、2、3、4(CAP1、CAP2、CAP3、CAP4)

(4)eCAP控制寄存器1(ECCTL1)

(5)eCAP控制寄存器2(ECCTL2)

(6)eCAP中断使能寄存器(ECEINT)

(7)eCAP中断标志寄存器(ECFLG)

(8)eCAP中断清除寄存器(ECCLR)

(9)eCAP强制中断寄存器(ECFRC)

四、配置步骤

(1)使能eCAP外设时钟

c 复制代码
//(1)使能eCAP外设时钟
	EALLOW;
	SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK=1;//开启时钟源
	EDIS;

(2)初始化GPIO为eCAP1功能,即选择GPIO复用功能

这一步eCAP库文件内已经提供了函数完成此项操作,eCAP1的GPIO初始化函数如下,我们只需要调用就可以

我们例程中使用的是eCAP1对应GPIO24,注意确保库文件的初始化的GPIO正确

c 复制代码
InitECap1Gpio();

(3)eCAP工作方式配置

包括捕捉模式、捕获边沿信号、捕获后计数器是否清零等

c 复制代码
//3.eCAP工作方式配置
	//(1)在配置前,先使模块处于安全状态
	ECap1Regs.ECEINT.all = 0x0000;   // 禁用所有捕获中断
	ECap1Regs.ECCLR.all = 0xFFFF;    // 清除所有捕获中断标志位,防止残留标志误触发
	ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // 禁用CAP1-CAP4寄存器的自动装载功能
	ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // 确保时间戳计数器停止计数


	//(2)核心工作模式与捕获参数配置
	// 配置外设寄存器
	ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // 设置捕获模式:单次模式 (One-shot)
	ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;   // 设置捕获事件停止点:在4个事件后停止 (Stop at 4 events)

	// 设置四个捕获事件的触发边沿
	ECap1Regs.ECCTL1.bit.CAP1POL = 1;      // 捕获事件1 (CEVT1) 触发边沿:下降沿 (Falling edge)
	ECap1Regs.ECCTL1.bit.CAP2POL = 0;      // 捕获事件2 (CEVT2) 触发边沿:上升沿 (Rising edge)
	ECap1Regs.ECCTL1.bit.CAP3POL = 1;      // 捕获事件3 (CEVT3) 触发边沿:下降沿 (Falling edge)
	ECap1Regs.ECCTL1.bit.CAP4POL = 0;      // 捕获事件4 (CEVT4) 触发边沿:上升沿 (Rising edge)

	// 配置差分模式:每个捕获事件后均复位时间戳计数器[2,3](@ref)
	ECap1Regs.ECCTL1.bit.CTRRST1 = 1;      // 捕获事件1发生后复位计数器
	ECap1Regs.ECCTL1.bit.CTRRST2 = 1;      // 捕获事件2发生后复位计数器
	ECap1Regs.ECCTL1.bit.CTRRST3 = 1;      // 捕获事件3发生后复位计数器
	ECap1Regs.ECCTL1.bit.CTRRST4 = 1;      // 捕获事件4发生后复位计数器

	// 同步信号配置
	ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;    // 使能同步输入 (Enable sync in)
	ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;    // 同步输出选择:直通模式 (Pass through),即SYNC_IN直接作为SYNC_OUT

	//(3)启动捕获模块
	ECap1Regs.ECCTL1.bit.CAPLDEN = 1;      // 使能捕获单元,允许在事件发生时将时间戳装载到CAP1-CAP4寄存器
	ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;    // 启动时间戳计数器开始计数 (Start Counter)
	ECap1Regs.ECCTL2.bit.REARM = 1;        // 重载单次序列 (arm one-shot),准备响应捕获事件
	ECap1Regs.ECCTL1.bit.CAPLDEN = 1;      // (再次确认)使能CAP1-CAP4寄存器装载

(4)eCAP对应中断配置(鄙人觉得该部分在测占空比周期方面啥用没有

因为开启了eCAP1的中断功能,而eCAP1它连接在INT4.1,所以需要对它进行使能以及中断向量表的指定

c 复制代码
//4.eCAP对应中断配置
	ECap1Regs.ECEINT.bit.CEVT4 = 1;        // 使能捕获事件4中断 (4 events = interrupt)

	// 配置PIE(外设中断扩展)向量表,将ECAP1_INT中断服务程序地址设置为ecap1_isr[1,5](@ref)
	EALLOW; // 允许写入受保护的寄存器
	PieVectTable.ECAP1_INT = &eCAP1_IRQn;	//中断回调函数
	EDIS;  // 禁止写入受保护的寄存器

	// 使能CPU级中断
	IER |= M_INT4;                         // 使能CPU的第4号中断(该中断连接至ECAP1-4中断)

	// 配置PIE控制器,使能第4组第1个子中断(即ECAP1中断)[1,2,5](@ref)
	PieCtrlRegs.PIEIER4.bit.INTx1 = 1;

	// 使能全局中断
	EINT; // 使能全局中断INTM
	ERTM; // 使能全局实时调试中断DBGM

(5)编写中断函数

这一步其实应该在eCAP_Init函数配置之前,否则会出现编译出错

当eCAP1连续捕获到4次边沿信号时(捕捉CEVT4的中断)即进入中断,因此需要编写一个中断服务函数,函数名要与前面指定的中断向量名一致,中断函数执行完后需要清除相关中断标志

五、实验

实现的功能是:通过旋转电位器,控制PWM6A的比较值,从而控制占空比,CAP2捕获F28335的ePWM5A产生的PWM脉冲信号低电平时间,CAP3捕获高电平时间

硬件:ePWM5A 输出PWM信号,则需要使用一根导线将ePWM6A(GPIO10)与eCAP1(GPIO24)连接

软件:

eCAP.c:

c 复制代码
#include "eCAP.h"

void Fail()
{
	//__asm(" ESTOP0");
}
__interrupt void eCAP1_IRQn(void)
{
	// 检查CAP2、CAP3、CAP4捕获寄存器的值是否在预期范围内(EPwm5Regs.TBPRD*2的±1范围内)
	if(ECap1Regs.CAP2 > EPwm5Regs.TBPRD+1 || ECap1Regs.CAP2 < EPwm5Regs.TBPRD-1)
	{
	    Fail();  // 如果CAP2值超出容差范围,则判定为测试失败
	}
	if(ECap1Regs.CAP3 > EPwm5Regs.TBPRD+1 || ECap1Regs.CAP3 < EPwm5Regs.TBPRD-1)
	{
	    Fail();  // 如果CAP3值超出容差范围,则判定为测试失败
	}
	if(ECap1Regs.CAP4 > EPwm5Regs.TBPRD+1 || ECap1Regs.CAP4 < EPwm5Regs.TBPRD-1)
	{
	    Fail();  // 如果CAP4值超出容差范围,则判定为测试失败
	}
	// 清除eCAP1的中断标志位,为下一次中断做准备[1](@ref)
	ECap1Regs.ECCLR.bit.CEVT4 = 1;  // 清除捕获事件4标志
	ECap1Regs.ECCLR.bit.INT = 1;     // 清除全局中断标志

	// 重新武装(REARM)eCAP模块,使其准备好进行下一次捕获序列(特别是在单次模式下)[1](@ref)
	ECap1Regs.ECCTL2.bit.REARM = 1;

	// 向PIE(外设中断扩展)控制器应答第4组中断,允许接收该组后续中断[2,3](@ref)
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

void eCAP_Init(void)
{
	//1.使能eCAP外设时钟
	EALLOW;
	SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK=1;//开启时钟源
	EDIS;

	//2.eCAP的GPIO配置
	InitECap1Gpio();

	//3.eCAP工作方式配置
	//(1)在配置前,先使模块处于安全状态
	ECap1Regs.ECEINT.all = 0x0000;   // 禁用所有捕获中断
	ECap1Regs.ECCLR.all = 0xFFFF;    // 清除所有捕获中断标志位,防止残留标志误触发
	ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // 禁用CAP1-CAP4寄存器的自动装载功能
	ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // 确保时间戳计数器停止计数


	//(2)核心工作模式与捕获参数配置
	// 配置外设寄存器
	ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // 设置捕获模式:单次模式 (One-shot)
	ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;   // 设置捕获事件停止点:在4个事件后停止 (Stop at 4 events)

	// 设置四个捕获事件的触发边沿
	ECap1Regs.ECCTL1.bit.CAP1POL = 1;      // 捕获事件1 (CEVT1) 触发边沿:下降沿 (Falling edge)
	ECap1Regs.ECCTL1.bit.CAP2POL = 0;      // 捕获事件2 (CEVT2) 触发边沿:上升沿 (Rising edge)
	ECap1Regs.ECCTL1.bit.CAP3POL = 1;      // 捕获事件3 (CEVT3) 触发边沿:下降沿 (Falling edge)
	ECap1Regs.ECCTL1.bit.CAP4POL = 0;      // 捕获事件4 (CEVT4) 触发边沿:上升沿 (Rising edge)

	// 配置差分模式:每个捕获事件后均复位时间戳计数器[2,3](@ref)
	ECap1Regs.ECCTL1.bit.CTRRST1 = 1;      // 捕获事件1发生后复位计数器
	ECap1Regs.ECCTL1.bit.CTRRST2 = 1;      // 捕获事件2发生后复位计数器
	ECap1Regs.ECCTL1.bit.CTRRST3 = 1;      // 捕获事件3发生后复位计数器
	ECap1Regs.ECCTL1.bit.CTRRST4 = 1;      // 捕获事件4发生后复位计数器

	// 同步信号配置
	ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;    // 使能同步输入 (Enable sync in)
	ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;    // 同步输出选择:直通模式 (Pass through),即SYNC_IN直接作为SYNC_OUT

	//(3)启动捕获模块
	ECap1Regs.ECCTL1.bit.CAPLDEN = 1;      // 使能捕获单元,允许在事件发生时将时间戳装载到CAP1-CAP4寄存器
	ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;    // 启动时间戳计数器开始计数 (Start Counter)
	ECap1Regs.ECCTL2.bit.REARM = 1;        // 重载单次序列 (arm one-shot),准备响应捕获事件
	ECap1Regs.ECCTL1.bit.CAPLDEN = 1;      // (再次确认)使能CAP1-CAP4寄存器装载


	//4.eCAP对应中断配置
	ECap1Regs.ECEINT.bit.CEVT4 = 1;        // 使能捕获事件4中断 (4 events = interrupt)

	// 配置PIE(外设中断扩展)向量表,将ECAP1_INT中断服务程序地址设置为ecap1_isr[1,5](@ref)
	EALLOW; // 允许写入受保护的寄存器
	PieVectTable.ECAP1_INT = &eCAP1_IRQn;	//中断回调函数
	EDIS;  // 禁止写入受保护的寄存器

	// 使能CPU级中断
	IER |= M_INT4;                         // 使能CPU的第4号中断(该中断连接至ECAP1-4中断)

	// 配置PIE控制器,使能第4组第1个子中断(即ECAP1中断)[1,2,5](@ref)
	PieCtrlRegs.PIEIER4.bit.INTx1 = 1;

	// 使能全局中断
	EINT; // 使能全局中断INTM
	ERTM; // 使能全局实时调试中断DBGM
}
ePWM.c:

```c
#include "ePWM.h"

void ePWM_Init(unsigned char tbprd)
{
	//(1)使能ePWM外设时钟及失能时基模块时钟
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;//失能时钟同步
	SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK=1;//开启时钟源
	EDIS;

	//(2)开启ePWM对应GPIO时钟及初始化配置
	InitEPwm6Gpio();

	//(3)初始化时基模块,即配置TB相关寄存器值
	EPwm6Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE;	//当时基寄存器的值等于比较寄存器CMPA时发生事件
	EPwm6Regs.TBCTL.bit.PHSEN=TB_DISABLE;	//禁止装载同步
	EPwm6Regs.TBPHS.half.TBPHS=0;	//自动装载相位寄存器设置为0,这一步不设置也行
	EPwm6Regs.TBCTR=0x0000; 		//清除Clearcounter
	EPwm6Regs.TBPRD= tbprd;			//TB周期寄存器
	EPwm6Regs.TBCTL.bit.CTRMODE=0x0; //计数模式
	EPwm6Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;	//一分频
 	EPwm6Regs.TBCTL.bit.CLKDIV=TB_DIV1;		//TBCLK = SYSCLKOUT
 	//HDSPCLKDIV为0时,TBCLK = SYSCLKOUT/(2^CLKDIV)

 	//(4)初始化比较模块,即配置CC相关寄存器值
 	EPwm6Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;//影子寄存器装载
 	EPwm6Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;
 	EPwm6Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;//CTR = 0时装载
 	EPwm6Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
 	//SetComparevalues
 	EPwm6Regs.CMPA.half.CMPA=0; //SetcompareAvalue
 	EPwm6Regs.CMPB=0;

 	//(5)初始化动作限定模块,即配置AQ相关寄存器值
 	EPwm6Regs.AQCTLA.bit.ZRO=0x2;
 	EPwm6Regs.AQCTLA.bit.CAU=0x1;
 	//EPwm6Regs.AQCTLA.bit.CAD=0x1;

 	EPwm6Regs.AQCTLB.bit.ZRO=0x1;
 	EPwm6Regs.AQCTLB.bit.CBU=0x2;
 	//EPwm6Regs.AQCTLB.bit.CBD=0x2;

 	//(6)初始化事件触发模块,即配置ET相关寄存器
 	EPwm6Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO; //TBCTR = 0时发生触发事件
 	EPwm6Regs.ETSEL.bit.INTEN=1; 		//使能中断
 	EPwm6Regs.ETPS.bit.INTPRD=ET_1ST;	//一次就触发

 	//(7)初始化死区模块、斩波模块,即配置DB、PC相关寄存器值

 	//(8)使能时基计数器时钟
 	EALLOW;
 	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
 	EDIS;

}



void EPwm6A_SetCompare(unsigned char ARRA)
{
	EALLOW;  // 允许写入受保护的寄存器
	EPwm6Regs.CMPA.half.CMPA=ARRA;
	EDIS;    // 禁止写入受保护的寄存器
}

void EPwm6B_SetCompare(unsigned char ARRB)
{
	EALLOW;  // 允许写入受保护的寄存器
	EPwm6Regs.CMPB = ARRB;
	EDIS;    // 禁止写入受保护的寄存器
}

MyADC.c:

c 复制代码
#include "MyADC.h"

void ADC_Init(void)
{
	//1.使能ADC外设时钟
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
	EDIS;

	//2.ADC初始化设置(调用TI库函数)
	InitAdc();

	//(3)ADC工作方式设置,包括采样方式、工作频率、采样通道数
	AdcRegs.ADCTRL3.bit.ADCCLKPS=1;//HSPCLK工作25M下不分频
	AdcRegs.ADCTRL1.bit.CPS = 1;//对HSPCLK2分频,即采样频率为6.25Mhz
	AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0f;//采样时间选择为15即HS宽度为16

	AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//级联排序器模式
	AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;//A0为采样通道
	AdcRegs.ADCTRL1.bit.CONT_RUN=1;//连续采样模式(即非启停模式)
	AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0;//最大采样通道数,因为只用到A0,所以只有1个,即数值为0

	//4.设置触发方式为软件触发
	AdcRegs.ADCTRL2.all=0x2000; //all为2000即ADCTEL2寄存器的第13位SOC_SEQ1位为1即软件触发,其余位均为0
}

//5.读取转换数据
Uint16 Read_ADCValue(void)
 {
	while(AdcRegs.ADCST.bit.INT_SEQ1==0);//查询转换是否结束
	AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//清除中断标志位
	return AdcRegs.ADCRESULT0>>4;//将转换结果返回出去
}

主函数:

c 复制代码
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "Key.h"
#include "led.h"
#include "Interrupt.h"
#include "SMG.h"
#include "ePWM.h"

void main()
{
	InitSysCtrl();

	InitPieCtrl();
	IER=0x0000;
	IFR=0x0000;
	InitPieVectTable();


	float adc_vol;

	//TIM0_Init(150,200000);//200ms

	Led_Init();
	SMG_Init();
	ADC_Init();
	ePWM_Init(1000);
	eCAP_Init();

	while(1)
	{
		 adc_vol=(float)Read_ADCValue()*1000/4095;

		 EPwm6A_SetCompare(adc_vol);
		 //EPwm6B_SetCompare(adc_vol);

		 //SMG_DisplayInt(Read_ADCValue());
		 SMG_DisplayInt(adc_vol);
	}



}

实验现象:

现象解释:

程序中,CAP1配置为下降沿、CAP2配置为上升沿、CAP1配置为下降沿、CAP1配置为上升沿,如图:则低电平时间就是ECAP1Regs.CAP2即T1,高电平时间就是ECAP1Regs.CAP3即T2

相关推荐
Nautiluss3 天前
一起玩XVF3800麦克风阵列(十)
linux·人工智能·python·音频·语音识别·实时音视频·dsp开发
Silicore_Emma9 天前
芯谷科技—D2010:高效电机控制与保护的卓越之选
单片机·电机控制·工业自动化·电动工具调速·智能家电设备·绍兴芯谷·d2010
GreenGoblin10 天前
永磁同步电机无传感器之龙博格观测器(Luenberger Observer)离散化推导及建模
电机控制·foc
侠***I12 天前
双馈风机虚拟惯性与下垂控制参与一次调频及频率二次跌落现象探究
dsp开发
做一道光17 天前
9、电机控制——hall自学习
笔记·学习·电机控制
XINVRY-FPGA17 天前
XC2C256-7VQG100I Xilinx CoolRunner-II CPLD FPGA
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
XINVRY-FPGA18 天前
EP1C6T144I7N Altera Cyclone FPGA
嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
做一道光20 天前
电机控制——电流采样(三电阻)
单片机·嵌入式硬件·学习·电机控制
做一道光20 天前
电机控制——电流采样(双电阻)
笔记·单片机·嵌入式硬件·电机控制