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
