您好!
我想计算八 个 不同占空比的方波(30kHz)的平均值。 我想从8个 GPIO 引脚读取8个信号、我必须计算这些方波的平均值以进行比较。 我将 GPIO 引脚设置为输入、但您能告诉我如何通过数字滤波器或其他方法找到30kHz 和3.3v 幅度方波信号的平均值吗?
注意:我在计时器中断函数中使用平均值进行比较。
谢谢、
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我想计算八 个 不同占空比的方波(30kHz)的平均值。 我想从8个 GPIO 引脚读取8个信号、我必须计算这些方波的平均值以进行比较。 我将 GPIO 引脚设置为输入、但您能告诉我如何通过数字滤波器或其他方法找到30kHz 和3.3v 幅度方波信号的平均值吗?
注意:我在计时器中断函数中使用平均值进行比较。
谢谢、
尊敬的 Richard:
是的、您已经完全理解了、但有两个问题。
在我使用 eCAP 模块时、计算的占空比值发生了突然变化、如下所示。 它在所有 eCAP 计算的占空比值中周期性发生。 所有捕获的占空比都应接近675、但您可以观察到它在某些时候变得非常高、如下图所示。 否则、它会提供大致相同的值。
2.如果我确实找到了上述问题的解决方案,那么到目前为止,eCAP 将会做得非常完美,但将来我至少需要8 个 eCAP 模块,所以我想找到永久解决方案。 因此、我应该使用数字滤波器来计算要比较的平均值或占空比。 我觉得通过 GPIO 引脚为输入实施数字滤波器是更好的选择。
谢谢、
Yedida、您好!
我看到您的问题。 我可以尝试帮助解决 eCAP 问题、但即使成功、您仍需要测量另外两个输入。 eQEP 中有一个边沿捕获单元、F28335有两个、因此您可能仍然能够使用硬件来测量事件时序、尽管这需要一些工作。
如果您使用数字滤波器、则必须采样远高于30kHz、并且对于八个通道、我怀疑您将消耗大量的 CPU 带宽。 是否可以在硬件中进行滤波并使用 ADC 测量每个通道? 每个 ADC 输入端都有一个 R-C 滤波器。 此处提供了相关的应用手册:
http://www.ti.com/lit/an/spraa88a/spraa88a.pdf
此致、
Richard
尊敬的 Richard:
谢谢你。 请告诉我 eCAP 模块的问题是什么。 我已经在硬件中实现了低通滤波器、但我唯一的问题是它的时间常数可能会影响系统性能、电容和电阻值的容差可能会影响输出。 我设计的滤波器为2.2k 和0.1uF (时间常数= 220uS)。 我希望至少每100us 采样一次、 这样可能会减慢我的系统速度。 如果我增大电阻值、则会出现 ADC 存储器串扰问题。
请告诉我上面提到的 eCAP 问题是否有任何解决方案。
谢谢、
尊敬的 Richard、用于使用 eCAP 模块设置和计算占空比。
下面是代码
void SetupECapture(){
///----------------------------------------------------------
//--为捕捉配置 eCAP1单元
///----------------------------------------------------------
ECap1Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
ECap1Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
ECap1Regs.TSCTR = 0;//清除计数器
ECap1Regs.CTRPHS = 0;//清除计数器相位寄存器
ECap1Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
//位15-11 00000:保留
//位10 0:APWMPOL、无关
//位9 0:CAP/APWM、0 =捕捉模式、1 = APWM 模式
//位8 0:SWSYNC、0 =无操作(无 s/w 同步)
//位7-6 10:SYNCO_SEL、10 =禁用 SYNC OUT 信号
//位5 0:SYNCI_EN、0 =禁用同步输入
//位4 1:TSCTRSTOP、1 =使能计数器
//位3 0:重新 ARM、0 =不重新 ARM、1 =重新 ARM
//位2-1 11:STOP_Wrap、11 = 4次捕捉后换行
//位0 0:CONT/ONESHT、0 =连续模式
ECap1Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
//位15-14 11:自由/软、11 =忽略仿真挂起
//位13-9 00000:预分频、00000 = 1分频
//位8 1:CAPLDEN、1 =使能捕捉结果加载
//位7 0:CTRRST4、0 =在 CAP4事件发生时不复位计数器
//位6 1:CAP4POL、0 =上升沿、1 =下降沿
//位5 0:CTRRTST3、0 =在 CAP3事件发生时不复位计数器
//位4 0:CAP3POL、0 =上升沿、1 =下降沿
//位3 0:CTRRST2、0 =不在 CAP2事件上复位计数器
//位2 1:CAP2POL、0 =上升沿、1 =下降沿
//位1 0:CTRRST1、0 =不在 CAP1事件上复位计数器
//位0 0:CAP1POL、0 =上升沿、1 =下降沿
ECap1Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP 中断
//位15-8 0:保留
//位7 0:CTR=CMP、0 =禁用比较中断
//位6 0:CTR=PRD、0 =禁用周期中断
//位5 0:CTROVF、0 =溢出中断被禁用
//位4 0:CEVT4、0 =事件4中断被禁用
//位3 1:CEVT3、1 =事件3中断被使能
//位2 0:CEVT2、0 =事件2中断被禁用
//位1 0:CEVT1、0 =事件1中断被禁用
//位0 0:保留
ECap2Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
ECap2Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
ECap2Regs.TSCTR = 0;//清除计数器
ECap2Regs.CTRPHS = 0;//清除计数器相位
ECap2Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
ECap2Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
ECap2Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP
ECap3Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
ECap3Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
ECap3Regs.TSCTR = 0;//清除计数器
ECap3Regs.CTRPHS = 0;//清除计数器阶段
ECap3Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
ECap3Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
ECap3Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP
ECap4Regs.ECEINT.ALL = 0;//禁用所有 eCAP 中断
ECap4Regs.ECCTL1.bit.CAPLDEN = 0;//禁用捕捉结果的加载
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 0;//停止计数器
ECap4Regs.TSCTR = 0;//清除计数器
ECap4Regs.CTRPHS = 0;//清除计数器阶段
ECap4Regs.ECCTL2.all = 0x0096;// ECAP 控制寄存器2.
ECap4Regs.ECCTL1.ALL = 0xC144;// ECAP 控制寄存器1.
ECap4Regs.ECEINT.ALL = 0x0008;//启用所需的 eCAP
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;//在 PIE 组4中启用 ECAP1_INT
IER |= 0x0008;//在 IER 中启用 INT4以启用 PIE 组4
}
中断空 eCAP1_ISR(){
// PwmPeriod =(int32) ECap1Regs.CAP3 -(int32) ECap1Regs.CAP1;
PwmDuty1 =(Int32) ECap1Regs.CAP2 -(Int32) ECap1Regs.CAP1;
PwmDuty2 =(int32) ECap2Regs.CAP2 -(int32) ECap2Regs.CAP1;
PwmDuty3 =(Int32) ECap3Regs.CAP2 -(Int32) ECap3Regs.CAP1;
PwmDuty4 =(int32) ECap4Regs.CAP2 -(int32) ECap4Regs.CAP1;
PieCtrlRegs.PIEACK.all = PIEACK_group4;//必须确认 PIE 组
ECap1Regs.ECCLR.bit.INT = 1;//清除 ECAP1中断标志
ECap1Regs.ECCLR.bit.CEVT3 = 1;//清除 CEVT3标志
}