[原创] 【瑞萨电子200MHz Cortex-M33 RA6E2评估板】PWM测试-实现命令行控制的PWM信号源

qinyunti   2023-10-19 20:03 楼主

前言

这一篇我们来进行PWM的输出测试,并基于前面的命令行实现,添加PWM命令,以实现指令控制输出不同占空比和周期的PWM。这样就实现了一个可以使用的PWM信号源。

PWM配置

时钟

详见手册20. General PWM Timer (GPT)

这里对一些关心的基本特征描述下

GPT使用PCLKD最大100M

image-20231019200354-1.png  

 

引脚

使用P207

GTIOC5A

image-20231019200354-2.png  

image-20231019200354-3.png  

image-20231019200354-4.png  

参数

image-20231019200354-5.png  

代码

初始化

gpt_initialize(void)

 

启动

gpt_start(void)

以上代码都不需要修改

 

 

 

 

设置占空比

set_intensity

修改为可以配置占空比和周期

fsp_err_t set_intensity(uint32_t raw_count, uint32_t period, uint8_t pin)

{

    fsp_err_t err = FSP_SUCCESS;

    //raw_count *= STEP;

#if defined(BOARD_RA4W1_EK) || defined (BOARD_RA6T1_RSSK)

    raw_count = (MAX_DUTY_CYCLE - raw_count);

#endif

    /* Set GPT timer's DutyCycle as per user input */

    err = R_GPT_DutyCycleSet (&g_timer_ctrl, raw_count, pin);

    if (FSP_SUCCESS != err)

    {

        APP_ERR_PRINT ("\r\n ** R_GPT_DutyCycleSet API failed **\r\n");

    }

 

    err = R_GPT_PeriodSet (&g_timer_ctrl, period);

    if (FSP_SUCCESS != err)

    {

        APP_ERR_PRINT ("\r\n ** R_GPT_PeriodSet API failed **\r\n");

    }

    return err;

}

最大频率测试

100M的时钟频率理论上可以输出最大100M的PWM波,

实测只能输出50MHz,直接修改初始化参数,周期设置为2,占空比设置为1,其他更小的值无法输出PWM

示波器实测50M输出准确,50MHz的输出也算比较高了。

image-20231019200354-6.png  

image-20231019200354-7.jpeg  

任意频率占空比测试

实现接口

void pwm_set_frq_period(uint32_t duty, uint32_t frq)

{

uint32_t period = (uint64_t)100000000ul/frq;

duty = ((uint64_t)duty*period*2+100)/200;

set_intensity(duty, period, TIMER_PIN);

}

 

 

添加命令行

shell_func.c中添加

extern void pwm_set_frq_period(uint32_t duty, uint32_t frq);

void PwmFun(unsigned char* param)

{

uint32_t duty;

uint32_t frq;

if(2 == sscanf((const char*)param, "%*s %d %d", &duty, &frq))

  {

pwm_set_frq_period(duty, frq);

}

}

shell_cmd_list中添加一行

  { (const uint8_t*)"pwm",         PwmFun,         "pwm duty frq"},

 

shell_func.h中添加

void PwmFun(unsigned char* param);

 

输入help回车可以看到新添加的命令pwm

 

输入pwm 10 10000设置频率为10k占空比为10%

image-20231019200354-8.png  

 

 

输入pwm 30 10000设置10K 30%占空比

示波器实测周期占空比都正确

image-20231019200354-9.jpeg  

以上实际就实现了一个PWM信号发生器,直接命令行操作,如果再加上上位机就可以更加灵活操作,具有一定实用价值了。

总结

r_gpt.c中只有R_GPT_DutyCycleSet等接口,但是没有设置时钟源频率的接口,配置好后hal_data.c中的参数只在Open时生效,时钟源频率没有接口再动态修改,

只能自己再通过寄存器读写实现。但是动态修改时钟源是一个很重要的需求,因为定时器只有16位,所以输出不同频率范围也需要时钟源做相应的修改。

这也是库代码一个可以优化的地方,灵活性不是很好。

 

回复评论 (4)

理论上可以输出最大100M的PWM波,实测只能输出50MHz,差距还是不小,不一定是测试方面,主要看能产生100M的波形不

点赞  2023-10-20 07:31
看了一下50M的波形还非常的不错,这芯片不错不错!
点赞  2023-10-20 09:19
引用: lugl4313820 发表于 2023-10-20 09:19 看了一下50M的波形还非常的不错,这芯片不错不错!

50M的输出确实很不错了

点赞  2023-10-20 10:05
引用: Jacktang 发表于 2023-10-20 07:31 理论上可以输出最大100M的PWM波,实测只能输出50MHz,差距还是不小,不一定是测试方面,主要看能产生100M的 ...

理论上应该周期设置为1,周期到tog一下就是100M,但是实际测试,没有tog,

不知道是不是需要特殊配置还是不支持这种模式。等有时间仔细看看手册。

点赞  2023-10-20 10:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复