Other Parts Discussed in Thread: TMS320F28P550SJ, C2000WARE
器件型号: TMS320F28P550SJ
主题: C2000WARE 中讨论的其他器件
您好团队、
我将 TMS320F28P550 MCU 用于太阳能应用。这是 80 引脚封装。 我希望同时使用 ADC 和比较器:我使用 ADC A4 测量交流电压。 请分享使用 ADC 与 COMP 进行频率测量的示例代码。
此致、
Atul Kaushik
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.
Other Parts Discussed in Thread: TMS320F28P550SJ, C2000WARE
器件型号: TMS320F28P550SJ
主题: C2000WARE 中讨论的其他器件
您好团队、
我将 TMS320F28P550 MCU 用于太阳能应用。这是 80 引脚封装。 我希望同时使用 ADC 和比较器:我使用 ADC A4 测量交流电压。 请分享使用 ADC 与 COMP 进行频率测量的示例代码。
此致、
Atul Kaushik
您好、Atul、
对假日周末的延迟回复表示歉意
我需要有关您在此处所需内容的更多信息。 只需使用 ADC 或 CMPSS 即可实现频率测量。 我们为 ADC 和 CMPSS 外设提供了示例代码、以展示特定用例或外设特性。 F28P550x 器件的模拟通道通过这种方式实现、引脚上的模拟信号始终通过硬接线连接到该引脚上也可用的所有相关模拟外设。 这只是相关模拟外设是否配置为将相关模拟引脚用作它们使用的源这一问题而已。
期待在获得更多详细信息后为您提供进一步帮助。
此致、
Zackary Fleenor
尊敬的 Fleenor:
感谢您的意见。
电网交流信号连接在 A4 ADC 引脚上。 RMS 电压测量中使用的信号相同。 现在、我需要测量连接在 A4 处的电网信号的频率。 为此 、我想使用内部比较器来生成 ZCD。 现在我有几个问题
1.是否可以从内部比较器生成 ZCD ?
2.可以在比较器和 ECAP 之间进行内部连接吗? 如果是、请分享如何实现这一点、因为我知道如何使用 GPIO 进行连接、但它不适用于我的用例。
因此、我的用例就是这样
A4 ADC===>>CMPSS====>>ECAP。
所有连接均为内部连接、无需外部连接。
此致、
Atul Kaushik
尊敬的 Atul:
是的、您所需的信号路径 A4→CMPSS→ECAP(全部内部使用) TMS320F28P550SJ 可实现的瞬态响应。 以下是每个作品的工作原理:
A4 上的模拟信号为 硬接线到 ADC 和 CMPSS 输入 —无需配置即可“共享“引脚[1][2]。 您可以使用 ADC 对 A4 进行采样以进行 RMS 电压测量、同时使用 CMPSS 进行过零检测。 具体来说、根据 TRM 中的表 14-4、 CMPSS-2 HP 输入多路复用器 (HPMXSEL0) 选择通道 A4 [1]。
是、内部比较器可以生成 ZCD。 按如下方式配置 CMPSS-2:
这是避免外部 GPIO 连接的关键。 TMS320F28P55x 包含 X-BAR(交叉开关)互连系统 用于在内部将 CMPSS 输出路由到包括 eCAP 在内的其他外设[5]:
配置流程:
XBAR_setInputPin()或等效输入 X-BAR 寄存器将 CMPSS-2 跳闸输出连接到 eCAP 输入 我们不会为此具体用例提供单个组合 ADC+CMPSS+ECAP 示例、但 C2000Ware 包含相关的构建块[3][4]:
cmpss_ex1_asynch.c—演示使用内部 DAC 作为基准的 CMPSS 配置、并将 CTRIPOUTH 路由至输出 X-BAR [3] cmpss_ex2_digital_filter.c—显示了比较器输出上用于抑制噪声的数字滤波器配置[4] 您需要通过以下方式调整这些设置:
此外、 Power_MEAS_SINE_ANALYZER C2000Ware DigitalPower SDK 中的库提供了一种基于软件的电网频率测量方法、使用具有基于阈值的过零检测功能的 ADC 样本、可用作互补或替代方法[6]。
为了帮助完善这项建议、了解以下信息会有所帮助:
资源:
此致、
Zackary Fleenor
尊敬的 Fleenor:
很抱歉重新打开此主题。
现在、我有以下配置
A4 >> CMPSS2>>ECAP1
ADC 引脚 A4 连接到 CMPSS2。 CMPSS2 的输出到 ECAP1 的输入。 我遵循 CMPSS 和 ECAP 的代码。 我不使用 OUTXBAR 和 INPUTXBAR。 我面临的问题是
1.我持续接收 ECAP 上的中断、而不在 A4 引脚上发出信号。
请检查下面的 ECAP 和 CMPSS 配置并建议。
也检查我的回答你的查询. 请帮助我们如何能够将 CMPSS 输出与输入 XBar 连接
为了帮助完善这项建议、了解以下信息会有所帮助:
输入 xbar 7、ECAP 1
CTRIPH
void myECAP0_init (){
//
//禁用、清除所有捕获标志和中断
//
eCAP_disableInterrupt (myECAP0_BASE、
(eCAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
eCAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
eCAP_ISR_SOURCE_COUNTER_COMPARE));
eCAP_clearInterrupt (myECAP0_BASE、
(eCAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
eCAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
eCAP_ISR_SOURCE_COUNTER_COMPARE));
//
//禁用时间戳捕获。
//
eCAP_disableTimeStampCapture (myECAP0_BASE);
//
//停止时间戳计数器。
//
ECAP_STOPCounter (myECAP0_BASE);
//
//将 eCAP 设置为捕获模式。
//
ECAP_enableCaptureMode (myECAP0_BASE);
//
//设置捕获模式。
//
eCAP_setCaptureMode (myECAP0_BASE、eCAP_ONE_SHATE_CAPTURE_MODE、eCAP_EVENT_4);
//
//设置捕获事件预分频器。
//
eCAP_setEventPrescaler (myECAP0_BASE、0U);
//
//设置捕获事件极性。
//
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_1、eCAP_Evnt_falling_edge);
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_2、eCAP_Evnt_rising edge);
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_3、eCAP_Evnt_falling_edge);
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_4、eCAP_Evnt_rising edge);
//
//在发生事件时配置计数器复位
//
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_1);
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_2);
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_3);
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_4);
//
//选择 eCAP 输入。
//
eCAP_selectECAPInput (myECAP0_BASE、eCAP_INPUT_OUTPUTXBAR3);//eCAP_INPUT_CMPSS2_CTRIP_HIGH);
//
//设置相移值计数。
//
eCAP_setPhaseShiftCount (myECAP0_BASE、0U);
//
//启用使用相移值进行计数器加载。
//
eCAP_enableLoadCounter (myECAP0_BASE);
//
//配置同步输出信号模式。
//
eCAP_setSyncOutMode (myECAP0_BASE、eCAP_SYNC_OUT_SYNCI);
//
//配置仿真模式。
//
eCAP_setEmulationMode (myECAP0_BASE、eCAP_emulation_stop);
//
//设置同步输入脉冲源。
//
eCAP_setSyncInPulseSource (myECAP0_BASE、eCAP_SYNC_IN_PULSE_SRC_DISABLE);
//
//开始 myECAP0 的时间戳计数器。
//
eCAP_startCounter (myECAP0_BASE);
//
//为 myECAP0 启用时间戳捕获。
//
eCAP_enableTimeStampCapture (myECAP0_BASE);
//
//将 Re 配置为 myECAP0 的 eCAP 模块。
//
eCAP_rearm (myECAP0_BASE);
//
//为 myECAP0 启用中断源。
//
eCAP_enableInterrupt (myECAP0_BASE、(eCAP_ISR_SOURCE_CAPTURE_EVENT_4));
void myECAP0_init (){
//
//禁用、清除所有捕获标志和中断
//
eCAP_disableInterrupt (myECAP0_BASE、
(eCAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
eCAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
eCAP_ISR_SOURCE_COUNTER_COMPARE));
eCAP_clearInterrupt (myECAP0_BASE、
(eCAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
eCAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
eCAP_ISR_SOURCE_COUNTER_COMPARE));
//
//禁用时间戳捕获。
//
eCAP_disableTimeStampCapture (myECAP0_BASE);
//
//停止时间戳计数器。
//
ECAP_STOPCounter (myECAP0_BASE);
//
//将 eCAP 设置为捕获模式。
//
ECAP_enableCaptureMode (myECAP0_BASE);
//
//设置捕获模式。
//
eCAP_setCaptureMode (myECAP0_BASE、eCAP_ONE_SHATE_CAPTURE_MODE、eCAP_EVENT_4);
//
//设置捕获事件预分频器。
//
eCAP_setEventPrescaler (myECAP0_BASE、0U);
//
//设置捕获事件极性。
//
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_1、eCAP_Evnt_falling_edge);
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_2、eCAP_Evnt_rising edge);
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_3、eCAP_Evnt_falling_edge);
eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_4、eCAP_Evnt_rising edge);
//
//在发生事件时配置计数器复位
//
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_1);
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_2);
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_3);
eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_4);
//
//选择 eCAP 输入。
//
eCAP_selectECAPInput (myECAP0_BASE、eCAP_INPUT_OUTPUTXBAR3);//eCAP_INPUT_CMPSS2_CTRIP_HIGH);
//
//设置相移值计数。
//
eCAP_setPhaseShiftCount (myECAP0_BASE、0U);
//
//启用使用相移值进行计数器加载。
//
eCAP_enableLoadCounter (myECAP0_BASE);
//
//配置同步输出信号模式。
//
eCAP_setSyncOutMode (myECAP0_BASE、eCAP_SYNC_OUT_SYNCI);
//
//配置仿真模式。
//
eCAP_setEmulationMode (myECAP0_BASE、eCAP_emulation_stop);
//
//设置同步输入脉冲源。
//
eCAP_setSyncInPulseSource (myECAP0_BASE、eCAP_SYNC_IN_PULSE_SRC_DISABLE);
//
//开始 myECAP0 的时间戳计数器。
//
eCAP_startCounter (myECAP0_BASE);
//
//为 myECAP0 启用时间戳捕获。
//
eCAP_enableTimeStampCapture (myECAP0_BASE);
//
//将 Re 配置为 myECAP0 的 eCAP 模块。
//
eCAP_rearm (myECAP0_BASE);
//
//为 myECAP0 启用中断源。
//
eCAP_enableInterrupt (myECAP0_BASE、(eCAP_ISR_SOURCE_CAPTURE_EVENT_4));
}
尊敬的 Fleenor:
我无法 在我的 xp.h 中找到 XBAR_IN_MUX_CMPSS2_CTRLIPH
我的 SDK ,我有以下选项,请建议我必须使用哪一个
XAP_EPWM_MUX02_CMPSS2_CTRLBh = 0x0400、//!EPWM MUX02 CMPSS2 CTRIPH
XBAR_INPUT_FLG_CMPSS2_CTRLIH = 0x0003、
XBar _CLB_MUX02_CMPSS2_CTRL.h = 0x0400、//!CLB MUX02 CMPSS2 CTRIPH
请建议在 SDK 中使用它的十六进制值。 以及您使用的 SDK。
此致、
阿图尔
尊敬的 Atul:
您应该使用此处的 INPUTXBAR 选择 (XBAR_INPUT_FLG_CMPSS2_CTRL.h)。 对先前错误的命名规则表示歉意。
供参考:
XBar = EPWM_MUX02_CMPSS2_CTRLBh = PWMXBAR 选择
XBar _CLB_MUX02_CMPSS2_CTRL.h = CLB INPUTXBAR 选择
此致、
Zackary Fleenor