[RA4 & RA6] RA6T2: 如何使用GPT互补PWM模式

[复制链接]
4|0
瑞萨新闻官 发表于 2026-9-18 22:55 | 显示全部楼层 |阅读模式
本帖最后由 瑞萨新闻官 于 2026-9-18 22:58 编辑

RA6T2通用PWM定时器(GPT)支持互补PWM模式,该模式能够生成带死区时间的三相互补PWM波,并确保在占空比0%和100%附近的线性度。本文将以互补PWM模式3(波峰波谷双沿触发)为例,说明基于FSP,设置通用PWM定时器驱动模块*(r_gpt),启用此工作模式的步骤。
*由于其他RA MCU通用PWM定时器(GPT)外设通常不支持互补PWM工作模式,FSP通用PWM定时器驱动模块(r_gpt)默认不包含此配置功能。
以下示例展示了如何使用三个连续GPT通道的互补PWM模式,在以下条件下生成带死区时间的三相互补PWM波。

PWM频率:10kHz
死区时间:2微秒(GTDVU=240,PCLKD=120MHz)
GTIOA输出:
初始输出电平为低电平,有效电平为高电平
在向上计数比较匹配时输出高电平,在向下计数比较匹配时输出低电平。
GTIOB输出:
初始输出电平为低电平,有效电平为高电平
在向上计数比较匹配时输出低电平,在向下计数比较匹配时输出高电平。

第一步:基于MCK-RA6T2开发板创建一个 No RTOS  的  RA C/C++ Flat Project。项目创建完成后,打开FSP配置界面。
  • 在e2studio工具栏中选择:File > New > RA C/C++ Project > Renesas RA
  • 选择 Flat (Non-TrustZone) Project
  • RTOS选择:No RTOS
  • 选择 Bare Metal (Minimal)
第二步:在FSP配置窗口的"堆栈"选项中,首先在HAL/公共堆栈中添加 Three-Phase PWM module(r_gpt_three_phase)。该模块可在 Timer 分类下找到。
  • New Stack > Timers > Three-Phase PWM (r_gpt_three_phase)
第三步:第二步操作完成后,配置窗口将出现如上图所示的错误提示。该错误可通过配置底层GPT驱动模块的Pin Output Support来消除。
选择任意一个r_gpt模块,将其Pin Output Support属性配置为 Enabled with Extra Features。
第四步:按以下设置配置 Three-Phase PWM 模块(r_gpt_three_phase)。其他属性保持默认值不变。
  • General > Period: 10
  • General > Period Unit: Kilohertz
  • General > GPT U-Channel: 4
  • General > GPT V-Channel: 5
  • General > GPT W-Channel: 6
  • Extra Features > Dead Time > Dead Time Count Up (Raw Counts): 240
在互补PWM模式下,GTDVD 寄存器无效,GTDVU寄存器将同时作为向上计数和向下计数时的死区时间值。因此,我们仅需配置Dead Time Count Up (Raw Counts)。

第五步:通过FSP配置界面,按以下设置配置用于U signal output的g_timer1定时器。

  • Interrupts > Callback: gpt_u_callback
  • Interrupts > Overflow/Crest Interrupt Priority: Priority 1
  • Interrupts > Underflow/Trough Interrupt Priority: Priority 1
由于GPT回调通道已设置为U通道,我们需要为U通道GPT注册一个用户回调函数。此外,我们将采用互补PWM模式3以实现在波峰和波谷双沿触发数据计数传输,因此需要同时启用Crest Interrupt 和 Trough Interrupt。
第六步:配置本示例所需的MCU引脚。
  • FSP Configuration > Pins > Peripherals > Timers:GPT > GPT
    • GTCPPO4: PB10 (used as PWM Synchronous Output Pin)
  • FSP Configuration > Pins > Peripherals > Timers:GPT > GPT4
    • GTIOC4A: PB04
    • GTIOC4B: PB05
  • FSP Configuration > Pins > Peripherals > Timers:GPT > GPT5
    • GTIOC5A: PB06
    • GTIOC5B: PB07
  • FSP Configuration > Pins > Peripherals > Timers:GPT > GPT6
    • GTIOC6A: PB08
    • GTIOC6B: PB09
第七步:在hal_entry.c文件中添加以下初始化函数,用以启用互补PWM模式3。
  1. static fsp_err_t gpt_complementary_pwm_mode_3_init (void)

  2. {

  3.     fsp_err_t err = FSP_SUCCESS;

  4.     /* Initializes the module. */

  5.     err = R_GPT_THREE_PHASE_Open(&g_three_phase0_ctrl, &g_three_phase0_cfg);

  6.     /* Handle any errors. This function should be defined by the user. */

  7.     if(FSP_SUCCESS != err)

  8.     {

  9.         return err;

  10.     }

  11.     R_GPT4->GTCR_b.MD = 0x0E; //Complementary PWM mode 3(transfer at crest and trough)

  12.     R_GPT5->GTCR_b.MD = 0x0E; //Complementary PWM mode 3(transfer at crest and trough)

  13.     R_GPT6->GTCR_b.MD = 0x0E; //Complementary PWM mode 3(transfer at crest and trough)

  14.     /*

  15.      * GTBER: General PWM Timer Buffer Enable

  16.      * - BD0: GTCCR Buffer Operation

  17.      * - BD1: GTPR Buffer Operation

  18.      * - BD2: GTADTRA/GTADTRB Buffer Operation

  19.      * - BD3: GTDVU/GTDVD Buffer (This bit is invalid in complementary PWM mode)

  20.      */

  21.     R_GPT4->GTBER_b.BD0 = 0; //GTCCCR Buffer operation is enabled

  22.     R_GPT4->GTBER_b.BD1 = 0; //GTPR Buffer operation is enabled

  23.     R_GPT4->GTBER_b.BD2 = 1; //GTADTRA/GTADTRB Buffer operation is disabled

  24.     R_GPT5->GTBER_b.BD0 = 0; //GTCCCR Buffer operation is enabled

  25.     R_GPT5->GTBER_b.BD1 = 0; //GTPR Buffer operation is enabled

  26.     R_GPT5->GTBER_b.BD2 = 1; //GTADTRA/GTADTRB Buffer operation is disabled

  27.     R_GPT6->GTBER_b.BD0 = 0; //GTCCCR Buffer operation is enabled

  28.     R_GPT6->GTBER_b.BD1 = 0; //GTPR Buffer operation is enabled

  29.     R_GPT6->GTBER_b.BD2 = 1; //GTADTRA/GTADTRB Buffer operation is disabled

  30.     R_GPT4->GTPDBR = 6000;

  31.     R_GPT5->GTPDBR = 6000;

  32.     R_GPT6->GTPDBR = 6000;

  33.     /*

  34.      * GTIOR : General PWM Timer I/O Control Register

  35.      * - In complementary PWM mode,

  36.      * the only values that can be set in the GTIOA[4:0] bits are 01001b, and 10110b

  37.      * - In complementary PWM mode,

  38.      * the only values that can be set in the GTIOB[4:0] bits are 00110b, and 11001b

  39.      * GTIOA = 0x09

  40.      *  - Initial output is Low (Active level is High),

  41.      *  - High output in up count compare match

  42.      *  - Low output in down count compare match

  43.      * GTIOB = 0x06

  44.      *  - Initial output is Low (Active level is High),

  45.      *  - Low output in up count compare match

  46.      *  - High output in down count compare match

  47.      */

  48.     R_GPT4->GTIOR_b.GTIOA = 0x09;

  49.     R_GPT5->GTIOR_b.GTIOA = 0x09;

  50.     R_GPT6->GTIOR_b.GTIOA = 0x09;

  51.     R_GPT4->GTIOR_b.GTIOB = 0x06;

  52.     R_GPT5->GTIOR_b.GTIOB = 0x06;

  53.     R_GPT6->GTIOR_b.GTIOB = 0x06;

  54.     /*PSYE: PWM Synchronous output Enable:

  55.      * Enable GTCPPOT4 output */

  56.     R_GPT4->GTIOR_b.PSYE = 1;

  57.     /*

  58.      * GTBER2: General PWM Timer Buffer Enable 2

  59.      * - CP3DB=0 : Disable double buffer function in complementary PWM mode 3, 4

  60.      * - OLTTA: GTIOCnA Output Level Buffer Transfer Timing Select

  61.      * - OLTTB: GTIOCnB Output Level Buffer Transfer Timing Select

  62.      */

  63.     R_GPT4->GTBER2_b.CP3DB = 0;

  64.     R_GPT4->GTBER2_b.OLTTA = 3; //complementary PWM mode: Transfer at both crest and trough

  65.     R_GPT4->GTBER2_b.OLTTB = 3; //complementary PWM mode: Transfer at both crest and trough

  66.     R_GPT5->GTBER2_b.CP3DB = 0;

  67.     R_GPT5->GTBER2_b.OLTTA = 3; //complementary PWM mode: Transfer at both crest and trough

  68.     R_GPT5->GTBER2_b.OLTTB = 3; //complementary PWM mode: Transfer at both crest and trough

  69.     R_GPT6->GTBER2_b.CP3DB = 0;

  70.     R_GPT6->GTBER2_b.OLTTA = 3; //complementary PWM mode: Transfer at both crest and trough

  71.     R_GPT6->GTBER2_b.OLTTB = 3; //complementary PWM mode: Transfer at both crest and trough

  72.     R_GPT4->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = 3000;

  73.     R_GPT5->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = 3000;

  74.     R_GPT6->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = 3000;

  75.     /* Start the timer. */

  76.     err = R_GPT_THREE_PHASE_Start(&g_three_phase0_ctrl);

  77.     if(FSP_SUCCESS != err)

  78.     {

  79.         return err;

  80.     }

  81.     return FSP_SUCCESS;

  82. }
第八步:在hal_entry.c文件中添加以下代码,该代码包含gpt_u_callback函数的执行。

  1. static volatile int direction = 1; // 1 for incrementing, -1 for decrementing

  2. static volatile int u2_count_u = 0U;

  3. static void rm_motor_driver_set_uvw_duty_test (void)

  4. {

  5.     u2_count_u += direction;

  6.     // Check if the counter needs to change direction

  7.     if (u2_count_u == 6240) {

  8.         direction = -1; // Switch to decrementing

  9.     } else if (u2_count_u == 0) {

  10.         direction = 1; // Switch to incrementing

  11.     }

  12.     R_GPT4->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = (uint32_t) u2_count_u;

  13.     R_GPT5->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = (uint32_t) u2_count_u;

  14.     R_GPT6->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = (uint32_t) u2_count_u;

  15. }

  16. #define DEBUG_OUTPUT_PD00_ENABLE 1

  17. void gpt_u_callback(timer_callback_args_t *p_args)

  18. {

  19.     /* TODO: add your own code here */

  20.     if(p_args->event == TIMER_EVENT_CREST)

  21.     {

  22. #if DEBUG_OUTPUT_PD00_ENABLE

  23.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_00, BSP_IO_LEVEL_LOW);

  24. #endif

  25.         rm_motor_driver_set_uvw_duty_test();

  26.     }

  27.     if(p_args->event == TIMER_EVENT_TROUGH)

  28.     {

  29. #if DEBUG_OUTPUT_PD00_ENABLE

  30.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_00, BSP_IO_LEVEL_HIGH);

  31. #endif

  32.         rm_motor_driver_set_uvw_duty_test();

  33.     }

  34. }
第九步:在hal_entry.c文件的开头添加以下代码。

  1. enum e_gpt_three_phase_prv_gtccr

  2. {

  3.     GPT_THREE_PHASE_PRV_GTCCRA = 0U,

  4.     GPT_THREE_PHASE_PRV_GTCCRB,

  5.     GPT_THREE_PHASE_PRV_GTCCRC,

  6.     GPT_THREE_PHASE_PRV_GTCCRE,

  7.     GPT_THREE_PHASE_PRV_GTCCRD,

  8.     GPT_THREE_PHASE_PRV_GTCCRF

  9. };

  10. static fsp_err_t gpt_complementary_pwm_mode_3_init (void);
第十步:在hal_entry()函数中调用gpt_complementary_pwm_mode_3_init以启动三相PWM。随后,GPT Compare Capture Register(GTCCRD)将在GPTn_OVF和GPTn_UDF中断后周期性地更新。
  • GPTn_OVF:在互补PWM模式下,这些中断请求在波峰处触发(主通道GTCNT计数器值从GTPR寄存器值变为GTPR寄存器值减1)
  • GPTn_UDF:在互补PWM模式下,这些中断请求在波谷处触发(主通道GTCNT计数器值从0变为1)

  1. void hal_entry(void)

  2. {

  3.     /* TODO: add your own code here */

  4.     fsp_err_t err = FSP_SUCCESS;

  5.     /* Complementary PWM mode Setting */

  6.     err = gpt_complementary_pwm_mode_3_init();

  7.     assert(err == FSP_SUCCESS);

  8.     while(1)

  9.     {

  10.     }

  11. #if BSP_TZ_SECURE_BUILD

  12.     /* Enter non-secure code */

  13.     R_BSP_NonSecureEnter();

  14. #endif

  15. }
第十一步:进行一次快速测量以验证结果是否符合目标操作要求。
以下示例演示了如何使用三个连续GPT通道的互补PWM模式在如下条件下生成带死区时间的三相互补PWM波:

PWM Frequency: 10kHz
Deadtime period: 2us (GTDVU=240, PCLKD=120MHz)
GTIOA 输出:
初始输出电平为Low,有效电平为High。
在向上计数比较匹配时输出High,在向下计数比较匹配时输出Low。
GTIOB: 初始输出电平为Low
初始输出电平为Low,有效电平为高电平。
在向上计数比较匹配时输出Low,在向下计数比较匹配时输出High。
Suitable Products
RA
您需要登录后才可以回帖 登录 | 注册

本版积分规则

268

主题

271

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部
0