ZHCU083I January 2013 – October 2021 TMS320F2802-Q1 , TMS320F28026-Q1 , TMS320F28026F , TMS320F28027-Q1 , TMS320F28027F , TMS320F28027F-Q1 , TMS320F28052-Q1 , TMS320F28052F , TMS320F28052F-Q1 , TMS320F28052M , TMS320F28052M-Q1 , TMS320F28054-Q1 , TMS320F28054F , TMS320F28054F-Q1 , TMS320F28054M , TMS320F28054M-Q1 , TMS320F2806-Q1 , TMS320F28062-Q1 , TMS320F28062F , TMS320F28062F-Q1 , TMS320F28068F , TMS320F28068M , TMS320F28069-Q1 , TMS320F28069F , TMS320F28069F-Q1 , TMS320F28069M , TMS320F28069M-Q1
使用 InstaSPIN 时,会发生几次时钟抽取。第一个需要考虑的时钟为中断时钟,它由使用 CPU 时钟计时的外设产生。通常,中断服务程序 (ISR) 由 ADC 转换结束 (EOC) 触发。此转换由 PWM 模块触发。
首先,让我们来回顾如何根据 user.h 文件中的用户参数配置 PWM 频率。从 CPU 时钟开始,用户定义的 CPU 时钟速率(单位为 MHz)为:
//! \brief Defines the system clock frequency, MHz (6xF and 6xM devices)
//!
#define USER_SYSTEM_FREQ_MHz (90)
//! \brief Defines the system clock frequency, MHz (2xF devices)
//!
#define USER_SYSTEM_FREQ_MHz (60)
然后定义 PWM 频率(单位为 MHz),据此可得出中断频率。
//! \brief Defines the Pulse Width Modulation (PWM) frequency, kHz
//!
#define USER_PWM_FREQ_kHz (15.0)
//! \brief Defines the Pulse Width Modulation (PWM) period, usec
//!
#define USER_PWM_PERIOD_usec (1000.0/USER_PWM_FREQ_kHz)
//! \brief Defines the Interrupt Service Routine (ISR) frequency, Hz
//!
#define USER_ISR_FREQ_Hz (USER_PWM_FREQ_kHz *1000.0)
//! \brief Defines the Interrupt Service Routine (ISR) period, usec
//!
#define USER_ISR_PERIOD_usec USER_PWM_PERIOD_usec
目前为止,CPU 时钟设置了 PWM 频率,同时也设置了 ISR 的频率。此时 ISR 实际并非由 PWM 计时器本身触发,而是由 ADC 转换结束指令触发,而 ADC 则是由 PWM 计时器启动。
图 10-1 是从 CPU 到生成 ISR 的全过程时钟时序图。
这个时序图表示米6体育平台手机版_好二三四 (TI) InstaSPIN 软件包交付时的中断触发情况,因为这是在取中断时确保转换就绪的最安全方法。用户可能还会考虑其他情况,例如 ADC 提前中断、PWM 中断或者 CPU 计时器中断。唯一要求是那些中断可定期生成。
注意,执行时间可通过多种不同方法测量。以下示例介绍如何测量执行时间:
在 InstaSPIN 执行时序中有几个抽取值,也称为节拍率,该速率允许 InstaSPIN 中控制代码的不同部分采用不同的执行时钟速率。以下节拍率可用于 InstaSPIN:
//! \brief Defines the number of pwm clock ticks per isr clock tick
//! 注意:Valid values are 1, 2 or 3 only
#define USER_NUM_PWM_TICKS_PER_ISR_TICK (1)
//! \brief Defines the number of isr ticks per controller clock tick
//!
#define USER_NUM_ISR_TICKS_PER_CTRL_TICK (1)
//! \brief Defines the number of controller clock ticks per current controller clock tick
//!
#define USER_NUM_CTRL_TICKS_PER_CURRENT_TICK (1)
//! \brief Defines the number of controller clock ticks per estimator clock tick
//!
#define USER_NUM_CTRL_TICKS_PER_EST_TICK (1)
//! \brief Defines the number of controller clock ticks per speed controller clock tick
//!
#define USER_NUM_CTRL_TICKS_PER_SPEED_TICK (10)
//! \brief Defines the number of controller clock ticks per trajectory clock tick
//!
#define USER_NUM_CTRL_TICKS_PER_TRAJ_TICK (10)
为了显示所有这些节拍率,请参见图 10-2。定义的以下缩写便于在软件执行时钟树图中引用:
USER_NUM_PWM_TICKS_PER_ISR_TICK -> /ETPS
USER_NUM_ISR_TICKS_PER_CTRL_TICK -> /ISRvsCTRL
USER_NUM_CTRL_TICKS_PER_CURRENT_TICK -> /CTRLvsCURRENT
USER_NUM_CTRL_TICKS_PER_EST_TICK -> /CTRLvsEST
USER_NUM_CTRL_TICKS_PER_SPEED_TICK -> /CTRLvsSPEED
USER_NUM_CTRL_TICKS_PER_TRAJ_TICK -> /CTRLvsTRAJ
对于 F2806x 器件,软件执行时钟树从 90MHz 的 SYSCLKOUT 开始,而所有其他值都从此时钟抽取。对于 F2805x 和 F2802x 器件,最大频率为 60MHz,而不是 90MHz。
在默认设置为 1 的时钟预分频器后,为得到 PWM 发生器的理想分辨率,我们使用了 TBPRD 寄存器(请参见图 10-2)。此寄存器含有一个周期值,这样输出端便能生成 PWM 频率。
软件执行时钟树的第一次抽取发生在硬件中。根据 ETPS 寄存器(事件触发预分频寄存器)的值,PWM 频率可实现 1 分频、2 分频或 3 分频。当 ADC 开始转换信号需要在每个 PWM 周期、每 2 个或每 3 个 PWM 周期触发一次时,这一特性非常实用。这种硬件抽取过程由 user.h 文件中的 USER_NUM_PWM_TICKS_PER_ISR_TICK 定义控制。
第二次抽取在软件中完成,下文将对此进行详细介绍。