- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
基于CYTVII-B-E-1M-SK验证SDL7.3 TCPWM timer功能,示例代码路径如下:
T2G_Sample_Driver_Library_7.3.0\tviibe1m\src\examples\tcpwm\timer
附件是验证的cm4代码(“tviibe1m_flash_cm4_mc_template.eww”工程);
目前出现的问题是:
TCPWM计数时钟配置为10MHz,当周期寄存器设置为5us时,通过IO翻转,实测波形正常;
当把周期寄存器配置成1us时,发现IO翻转波形出现异常,如下所示:
无论是波形周期,还是占空比,都出现错误;
请问出现该问题的原因是IO不支持高速翻转,还是TCPWM配置错误呢?
如果是IO翻转有频率限制,那datasheet哪里有对应的参数说明?
期待答复,谢谢~~
Solved! Go to Solution.
- Labels:
-
Automotive Traveo_II
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi chme_4646286,
我们将有问题的代码放入M0+ / M4核中分别跑,发现能到达的最大翻转频率不同。而两段代码是相同的,也就是说TCPWM的配置是相同的。
所以我们认为当频率较高(在500kHZ后),出现翻转频率错误的原因是由于M0无法及时响应并完成中断服务函数导致的。也就是说,在CPU依然处理前一次的中断服务函数时,下一个TCPWM触发的中断已经到来,这导致了实际翻转频率偏低。在频率更快的M4上,其可以支持到翻转频率更高,大约1.1MHZ。
Systick作为ARM核内的模块,访问速度较片内外设TCPWM模块有优势,所以其响应中断、清除标志位的速度更快,核心能够以更高的频率响应它的中断。但频率足够高时,也会出现类似的形况。
由于芯片已经是ASIC电路,我们无法进行类似Pre-silicon-validation-process的深入研究去观察TCPWM模块实际的中断多久产生一次,在高频下产生是否正常。非常抱歉。但TCPWM模块share共同的时钟源和计数器,如果PWM能在高频下正常工作,那么counter在高频下的工作也应该是正常的。
Best Regards,
Finn
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi chme_4646286,
产生PWM波可以使用PWM专用模块,不需要使用counter模块。
在PWM模块中可以更方便的配置频率和占空比。根据您代码中的上下文判断,您配置的是1MHz的PWM波而不是10MHz,我在1MHz用例程测试没有发生问题。
请参考SDL library - pwm - normal例程
Best Regards,
Finn
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi chme_4646286,
使用通用GPIO在高频翻转时将出现严重失真,请查看附图(频率约为13MHz)。
所以当需要高频PWM波形时,请仅使用PWM模块,并将GPIO的hsiom配置到对应PWM模块
Best Regards,
Finn
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi yanf;
感谢你的答复;
这里我并不是要验证PMW功能,此处IO翻转的目前只是为了验证我设置的timer周期值是否和实际值保持一致;
就如我示例中修改的:
外设时钟我设置的10MHz,在counter寄存器结构体中不再分频,peirod寄存器计数10次,
如下所示:
cy_stc_tcpwm_counter_config_t const MyCounter_config =
{
.........
.period = 10ul - 1ul, // 10,000,000Hz / 10 = 1us
.clockPrescaler = CY_TCPWM_COUNTER_PRESCALER_DIVBY_1, // 10,000,000Hz / 1 = 10MHz
........
}
此时timer中断周期应该是1us,通过IO翻转检测该周期值;
但是IO翻转测的波形明显不对(如第一个问题中的附图),能帮忙解答下为什么会出现这种问题吗?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi chme_4646286,
我明白您的意思了,您希望了解出现您附图中的错误是否由于定时器不准确。
这种情况是由于通用GPIO无法支持高速翻转,导致波形不准确。您可以做一下试验,将target frequency设置为2000000 (2MHZ)
此时Period 设置为10,波形准确。Period 设置为1,波形不准确。
如果是由于定时器不准确,period为10时,误差为10倍累计,更加不准确。所以定时器不准确不成立。
是普通GPIO不支持高速翻转导致的这样的情况,并非定时器不准确。高速PWM波需要使用PWM对应的GPIO复用类型。
Period = 10
Period = 1
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi chme_4646286,
经过测试这种情况确实存在。我们正在内部讨论排查原因。谢谢您的等待。
Best Regards,
Finn
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi chme_4646286,
我们将有问题的代码放入M0+ / M4核中分别跑,发现能到达的最大翻转频率不同。而两段代码是相同的,也就是说TCPWM的配置是相同的。
所以我们认为当频率较高(在500kHZ后),出现翻转频率错误的原因是由于M0无法及时响应并完成中断服务函数导致的。也就是说,在CPU依然处理前一次的中断服务函数时,下一个TCPWM触发的中断已经到来,这导致了实际翻转频率偏低。在频率更快的M4上,其可以支持到翻转频率更高,大约1.1MHZ。
Systick作为ARM核内的模块,访问速度较片内外设TCPWM模块有优势,所以其响应中断、清除标志位的速度更快,核心能够以更高的频率响应它的中断。但频率足够高时,也会出现类似的形况。
由于芯片已经是ASIC电路,我们无法进行类似Pre-silicon-validation-process的深入研究去观察TCPWM模块实际的中断多久产生一次,在高频下产生是否正常。非常抱歉。但TCPWM模块share共同的时钟源和计数器,如果PWM能在高频下正常工作,那么counter在高频下的工作也应该是正常的。
Best Regards,
Finn