这一篇我们来进行PWM的输出测试,并基于前面的命令行实现,添加PWM命令,以实现指令控制输出不同占空比和周期的PWM。这样就实现了一个可以使用的PWM信号源。
时钟
详见手册20. General PWM Timer (GPT)
这里对一些关心的基本特征描述下
GPT使用PCLKD最大100M
引脚
使用P207
GTIOC5A
参数
初始化
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的输出也算比较高了。
实现接口
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%
输入pwm 30 10000设置10K 30%占空比
示波器实测周期占空比都正确
以上实际就实现了一个PWM信号发生器,直接命令行操作,如果再加上上位机就可以更加灵活操作,具有一定实用价值了。
r_gpt.c中只有R_GPT_DutyCycleSet等接口,但是没有设置时钟源频率的接口,配置好后hal_data.c中的参数只在Open时生效,时钟源频率没有接口再动态修改,
只能自己再通过寄存器读写实现。但是动态修改时钟源是一个很重要的需求,因为定时器只有16位,所以输出不同频率范围也需要时钟源做相应的修改。
这也是库代码一个可以优化的地方,灵活性不是很好。
引用: lugl4313820 发表于 2023-10-20 09:19 看了一下50M的波形还非常的不错,这芯片不错不错!
50M的输出确实很不错了
引用: Jacktang 发表于 2023-10-20 07:31 理论上可以输出最大100M的PWM波,实测只能输出50MHz,差距还是不小,不一定是测试方面,主要看能产生100M的 ...
理论上应该周期设置为1,周期到tog一下就是100M,但是实际测试,没有tog,
不知道是不是需要特殊配置还是不支持这种模式。等有时间仔细看看手册。