基础知识

CCU6,Capture/Compare Unit 6捕获/比较单元,是一个专门用于电机控制而设计的16位捕获和比较单元。
CCU6包含多个定时器,将它们的计数值和参考值进行比较,来生成PWM信号。
定时器12(T12)配有三个比较器。通过同步它们,最多可以产生三个同步的PWM信号,这些信号可以是中心对齐的或边缘对齐的。

实验目标

使用CCU6产三个固定频率和不同占空比的中心对准脉冲宽调制(PWM)信号。

实验现象

使用三个示波器探头连到三各引脚。
image.png
可以观察到三个中心对齐的PWM信号,配置占空比,每个周期为50 us
image.png

三个频率为20 kHz和不同占空比(25%、50%和75%)的PWM信号。T12被配置为上下倒计时,这三个信号在中心对齐。

实验原理

一个图搞定
image.png

实验代码

禁用/初始化中断

在进行CCU6初始化时,第一步先禁用中断IfxCpu_disableInterrupts()

  1. boolean interruptState = IfxCpu_disableInterrupts(); /* Disable global interrupts */

这样可以避免还没有进行配置的外设抢占任务。
在初始化要结束的阶段别忘了重新启用中断:

  1. /* Restore interrupts to their initial state */
  2. IfxCpu_restoreInterrupts(interruptState);

CCU6的配置

先创建一个结构体IfxCcu6_TimerWithTrigger_Config,并使用IfxCcu6_TimerWithTrigger_initConfig()按默认配置进行初始化:

  1. /* Timer configuration: timer used as counter */
  2. IfxCcu6_TimerWithTrigger_Config timerConf;
  3. IfxCcu6_TimerWithTrigger_initConfig(&timerConf, &MODULE_CCU60); /* Initialize the timer configuration with default values */

需要修改的参数有:

  • PWM信号的频率
  • 计数器模式,向上/向下

然后再次调用IfxCcu6_TimerWithTrigger_init()进行参数使能。

  1. /* User timer configuration */
  2. timerConf.base.frequency = PWM_FREQUENCY; /* Set the desired frequency for the PWM signal */
  3. timerConf.base.countDir = IfxStdIf_Timer_CountDir_upAndDown; /* Configure the timer to count up and down, in
  4. * order to generate center-aligned PWM signals */
  5. /* Initialize the timer driver */
  6. IfxCcu6_TimerWithTrigger_init(&g_timer, &timerConf);

配置PWM的高低驱动程序

配置输出引脚和占空比,以及三个通道的比较模块。
首先也是配置一个结构体IfxCcu6_PwmHl_Config,使用IfxCcu6_PwmHl_initConfig()进行默认参数的初始化:

  1. /* PWM High/Low driver configuration */
  2. IfxCcu6_PwmHl_Config pwmHlConf;
  3. IfxCcu6_PwmHl_initConfig(&pwmHlConf); /* Initialize the PwmHl configuration with
  4. * default values */

指定使用的通道数量,然后再次进行初始化:

  1. /* User PWM High/Low driver configuration */
  2. pwmHlConf.timer = &g_timer; /* Use the already configured timer */
  3. pwmHlConf.base.channelCount = NUMBER_OF_CHANNELS; /* Configure the driver to use use all three
  4. * compare modules available in T12 */
  5. /* Assign output pins */
  6. pwmHlConf.cc0 = &IfxCcu60_CC60_P02_0_OUT;
  7. pwmHlConf.cc1 = &IfxCcu60_CC61_P02_7_OUT;
  8. pwmHlConf.cc2 = &IfxCcu60_CC62_P02_4_OUT;
  9. pwmHlConf.cout0 = &IfxCcu60_COUT60_P02_1_OUT;
  10. pwmHlConf.cout1 = &IfxCcu60_COUT61_P02_3_OUT;
  11. pwmHlConf.cout2 = &IfxCcu60_COUT62_P02_5_OUT;
  12. /* Initialize the PwmHl driver */
  13. IfxCcu6_PwmHl_init(&g_driver, &pwmHlConf);

选择对齐方式IfxCcu6_PwmHl_setMode():

  1. /* Instruct the driver to generate center aligned PWM signals */
  2. IfxCcu6_PwmHl_setMode(&g_driver, Ifx_Pwm_Mode_centerAligned);

设置三个通道的占空比,并更新数据

  1. /* Instruct the driver to generate center aligned PWM signals */
  2. IfxCcu6_PwmHl_setMode(&g_driver, Ifx_Pwm_Mode_centerAligned);
  3. /* Set the duty cycles for the three channels */
  4. Ifx_TimerValue cmpValues[NUMBER_OF_CHANNELS];
  5. cmpValues[0] = CHANNEL1_COMPARE_VALUE; /* Set the compare value for channel 1 */
  6. cmpValues[1] = CHANNEL2_COMPARE_VALUE; /* Set the compare value for channel 2 */
  7. cmpValues[2] = CHANNEL3_COMPARE_VALUE; /* Set the compare value for channel 3 */
  8. g_driver.update(&g_driver, cmpValues); /* Apply the compare values */

最后RUN:

  1. IfxCcu6_TimerWithTrigger_run(&g_timer);