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.

[参考译文] TM4C123AE6PM:TM4C123、SSI 的波形发生器时序问题

Guru**** 2578945 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/750129/tm4c123ae6pm-wave-generator-timing-issue-with-tm4c123-ssi

器件型号:TM4C123AE6PM

大家好、  

我需要一些有关软件设计的建议。 这里是快速说明、我有一些 DAC 生成了一些模拟信号、作为对 某些输入方波信号的响应。 它会生成一些小输出波、该波始于输入信号的上升沿、结束于下降沿。 MCU 和 DAC 之间通过 SSI 接口进行通信。 我在输入信号上设置 GPIO 中断、因此当上升沿或下降沿发生时、系统会收到通知。 在上升沿、我开始通过 SSI 值发送到 DAC。 发送在运行频率为250kHz 的定时器中断内完成。 输入信号的频率最大为100Hz、在该频率下误差不是太明显、但在较高的频率下、我看到上升沿和输出波形开始之间的差异较大。 输出波在输入方波信号后延迟一段时间。 这里是代码块、如果您对我的错误行为有一些建议、可能我应该在主循环中生成信号、而不是在计时器中断中生成信号?  

void portB_ISR (void)
{
if (GPIOIntStatus (input_square_port、false)&input_square_PIN){
if (GPIOPin_port、input_square_PIN))//edge was rissing
{
flag_Falling=0
;ui32_timer_cnt=0
;

inflag_timer_find_for_timer_falling



















(timer_fet_ise_signed)= 0;

如果 TIv_timer_f_timer_falling (timer_f_timer_fet_timer_find_timer_signal = 0)、则 TIvert_timer_f_timer_falling = 0;如果 TIv_timer_f_timer_f_timer_signal = 0;如果 TIvert_for_timer_ning_timer_falling = 0;如果 TIv_timer_f_sign_timer_f_sign_signal = 1;如果 TIvert_for_timer_ning_falling (timer_f_f_timer_falling = 1)、则= 0;t
540)
ui32_outval=ui32_outval-50;
否则(ui32_outval>416)
ui32_outval=ui32_outval-10;
否则
{
if (ui32_outval=416)
ui32_outval=370;
否则
ui32_outval=416;
}i32_outval=u32_uS/256]

;uiS32_uSval=uuuuuuS32_outval/ uuuuS32uuuSval=uuuuuS32uS/ uSval[uS32_uuuuu0];uS32uu

}
//输入信号中的上升沿->如果
(FLAG_RISING)
{

ui32_outval=0;
pui32DataTx[0]= ui32_outval;
SSIDataPut (SSI0_BASE、pu32DataTx[0]);}


如果(FLAG_COUNT_Picker)
{ui32_pick+




;SSi32_fiftx+= u+= ui32_fiftor+;


}uip_ip_iptor+(u32_fiftor+)、则关闭输出信号 
void SSI_Configuration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
//GPIOPinConfigure (GPIO_PA4_SSI0RX);//RX 未使用 GPIO_P3_SSIP_SSIP_SSIP_SIMP_CLK

;GPIO_SSIP_SSIP_SSIP_SSIP_CLK (
GPIO_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_SIMP_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_0);GPIO_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_SSIP_CLK (GP_SSIP 16000000、16);
SSIEnable (SSI0_BASE);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Djedjica、

    [引用 user="Djedjica"]输入信号的频率最大为100Hz,在该频率下误差不是太明显,但在较高频率下,我看到上升沿与输出波形开始之间的差异较大。

    我在这里的两个问题是:

    1) 1)如果这是最大值、为什么性能高于它?

    2) 2)那么、您发现明显误差的较高频率的值是多少?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jacobi 先生、您好!  

    感谢您的回答、我没有使用任何开关信号、并注意到只有在下降沿响应和输出信号时才会延迟。 它大约为100us、并且是恒定的、我认为随着频率的增加、它更大是错误的。 对于最终产品、我认为这种延迟不是太重要、但如果 我错过了一些东西、我会感兴趣。 如果我在一个引脚上有两个边沿中断、 那么响应时间延迟的原因是什么以及我可以做什么。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Djedjica、

    查看您的代码、您会发现 Timer1 ISR 内部存在很多问题。 比我推荐的要好 您应该将 SPIDataPut 等 API 拉到该 ISR 之外。 这可能是您看到的滞后的根源。

    一旦您处于 ISR 中、如果您没有更高优先级的 ISR 触发器、那么您将无法让该 ISR 保持到结束状态、因此当发生另一个中断时、您可能会被卡在 SPIDataPut API 中、从而导致系统响应时间滞后。

    通过使 Timer1 ISR 尽可能精简、只需设置标志等、然后您可以确保在较短的时间内为其和其他 ISR 提供服务、这样就可以消除对更改的条件作出反应时的任何滞后。