Renesas R7FA8D1BH (Cortex®-M85)的PWM控制小车

发布于:2024-10-10 ⋅ 阅读:(163) ⋅ 点赞:(0)

目录

概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 硬件架构

2.1 硬件框架结构

2.2 小车控制原理

3 软件功能实现

3.1 FSP配置参数

3.2 代码实现

3.3 源代码文件


源代码下载地址:

https://www.firebbs.cn/forum.php?mod=viewthread&tid=37943

详细设计文档:

https://zhuanlan.zhihu.com/p/852031299

概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)的PWM控制小车,包括系统实现的框架结构,小车运行方向的控制实现原理,还使用FSP配置PWM参数,实现小车运行速度和方向的控制功能。

1 软硬件

1.1 软硬件环境信息

软硬件信息 版本信息
Renesas MCU R7FA8D1BH
Keil MDK ARM 5.38
FSP 版本 5.3.0
调试工具:N32G45XVL-STB DAP-LINK

1.2 开发板信息

笔者选择使用野火耀阳开发板_瑞萨RA8,该板块的主控MCU为R7FA8D1BHECBD,7FA8D1BHECBD的内核为ARM Contex-M85。

1.3 调试器信息

对于R7FA8D1BHECBD芯片,其使用的内核为Cortex®-M85 Core, ST-LINK-V2或者J-LINK-V9不支持下载和调试功能。笔者经过多次尝试,发现N32G45XVL-STB板卡上自带的DAP-LINK可以下载和调试R7FA8D1BHECBD。

下图为N32G45XVL-STB开发板实物图:

2 硬件架构

2.1 硬件框架结构

PWM控制小车接口介绍

左侧车轮控制:

1) 使用GPT1生成PWM控制P105接口

2) 使用GPT2生成PWM控制P102接口

右侧车轮控制:

1) 使用GPT6生成PWM控制PA11接口

1) 使用GPT4生成PWM控制P804接口

系统工作框架结构如下:

2.2 小车控制原理

1)前进功能:

P105:输出PWM

P102:停止输出PWM

PA11:输出PWM

P804:停止输出PWM

2)后退功能

P105:停止输出PWM

P102:输出PWM

PA11:停止输出PWM

P804:输出PWM

3)左转功能

P105:停止输出PWM

P102:输出PWM

PA11:输出PWM

P804:停止输出PWM

4)右转功能

P105:输出PWM

P102:停止输出PWM

PA11:停止输出PWM

P804:输出PWM

3 软件功能实现

3.1 FSP配置参数

1)配置GPT1参数

2)配置GPT2参数 

3)配置GPT6参数  

 4)配置GPT4参数  

3.2 代码实现

在3.1步完成参数配置之后,就可以生成PWM的配置代码,并编写功能代码

1)PWM初始化函数

代码21行:初始化timer1

代码23行:停止PWM输出

代码25行:设置占空比

代码28行:初始化timer2

代码29行:停止PWM输出

代码31行:设置占空比

代码34行:初始化timer3

代码36行:停止PWM输出

代码37行:设置占空比

代码40行:初始化timer4

代码42行:停止PWM输出

代码43行:设置占空比

2)设置占空比函数

代码57行: 获取当前PWM的配置参数

代码64行:设置占空比

 

3.3 源代码文件

 创建bsp_pwm.c文件,编写如下代码

 /*
 FILE NAME  :  bsp_pwm.c
 Description:  pwm interface
 Author     :  tangmingfei2013@126.com
 Date       :  2024/09/22
 */
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "bsp_pwm.h"
#include "hal_data.h"


#define INIT_PWM      0
#define MAX_VALUE     100


void pwm_init( void )
{
    // timer 1   GPT_IO_PIN_GTIOCA
    R_GPT_Open(&g_timer1_ctrl, &g_timer1_cfg);
    
    R_GPT_Stop(&g_timer1_ctrl);
    /* Set the calculated duty cycle. */
    pwm_SetDuty(&g_timer1_ctrl,INIT_PWM, GPT_IO_PIN_GTIOCA);
    
    // timer 2   GPT_IO_PIN_GTIOCB
    R_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);
    R_GPT_Stop(&g_timer2_ctrl);
    // set duty 
    pwm_SetDuty(&g_timer2_ctrl,INIT_PWM, GPT_IO_PIN_GTIOCB); 
    
    // timer 3   GPT_IO_PIN_GTIOCA 
    R_GPT_Open(&g_timer3_ctrl, &g_timer3_cfg);
    // set duty 
    pwm_SetDuty( &g_timer3_ctrl,INIT_PWM, GPT_IO_PIN_GTIOCA);
    R_GPT_Stop(&g_timer3_ctrl);
    
    // timer 4   GPT_IO_PIN_GTIOCA 
    R_GPT_Open(&g_timer4_ctrl, &g_timer4_cfg);
    // set duty 
    pwm_SetDuty( &g_timer4_ctrl,INIT_PWM, GPT_IO_PIN_GTIOCA);
    R_GPT_Stop(&g_timer4_ctrl);
}

void pwm_SetDuty( timer_ctrl_t * const p_ctrl, uint8_t duty, uint32_t pin)
{
    fsp_err_t  err;
    timer_info_t info;
    uint32_t current_period_counts;
    uint32_t duty_cycle_counts;
    uint8_t dutyVal;
 
    if (duty > 100)
        duty = 100; 
 
    R_GPT_InfoGet(p_ctrl, &info);
    
    current_period_counts = info.period_counts;
    
    dutyVal = MAX_VALUE - duty;
    duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * dutyVal) / 100);
    
    err = R_GPT_DutyCycleSet(p_ctrl, duty_cycle_counts, pin);
    assert(FSP_SUCCESS == err);
}

/* End of this file */


网站公告

今日签到

点亮在社区的每一天
去签到