本帖最后由 瑞萨新闻官 于 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。 第八步:在hal_entry.c文件中添加以下代码,该代码包含gpt_u_callback函数的执行。
- static volatile int direction = 1; // 1 for incrementing, -1 for decrementing
- static volatile int u2_count_u = 0U;
- static void rm_motor_driver_set_uvw_duty_test (void)
- {
- u2_count_u += direction;
- // Check if the counter needs to change direction
- if (u2_count_u == 6240) {
- direction = -1; // Switch to decrementing
- } else if (u2_count_u == 0) {
- direction = 1; // Switch to incrementing
- }
- R_GPT4->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = (uint32_t) u2_count_u;
- R_GPT5->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = (uint32_t) u2_count_u;
- R_GPT6->GTCCR[GPT_THREE_PHASE_PRV_GTCCRD] = (uint32_t) u2_count_u;
- }
- #define DEBUG_OUTPUT_PD00_ENABLE 1
- void gpt_u_callback(timer_callback_args_t *p_args)
- {
- /* TODO: add your own code here */
- if(p_args->event == TIMER_EVENT_CREST)
- {
- #if DEBUG_OUTPUT_PD00_ENABLE
- R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_00, BSP_IO_LEVEL_LOW);
- #endif
- rm_motor_driver_set_uvw_duty_test();
- }
- if(p_args->event == TIMER_EVENT_TROUGH)
- {
- #if DEBUG_OUTPUT_PD00_ENABLE
- R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_00, BSP_IO_LEVEL_HIGH);
- #endif
- rm_motor_driver_set_uvw_duty_test();
- }
- }
第九步:在hal_entry.c文件的开头添加以下代码。
- enum e_gpt_three_phase_prv_gtccr
- {
- GPT_THREE_PHASE_PRV_GTCCRA = 0U,
- GPT_THREE_PHASE_PRV_GTCCRB,
- GPT_THREE_PHASE_PRV_GTCCRC,
- GPT_THREE_PHASE_PRV_GTCCRE,
- GPT_THREE_PHASE_PRV_GTCCRD,
- GPT_THREE_PHASE_PRV_GTCCRF
- };
- 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)
- void hal_entry(void)
- {
- /* TODO: add your own code here */
- fsp_err_t err = FSP_SUCCESS;
- /* Complementary PWM mode Setting */
- err = gpt_complementary_pwm_mode_3_init();
- assert(err == FSP_SUCCESS);
- while(1)
- {
- }
- #if BSP_TZ_SECURE_BUILD
- /* Enter non-secure code */
- R_BSP_NonSecureEnter();
- #endif
- }
第十一步:进行一次快速测量以验证结果是否符合目标操作要求。 以下示例演示了如何使用三个连续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
|