目录
概述
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.cDescription: pwm interfaceAuthor : tangmingfei2013@126.comDate : 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 100void pwm_init( void )
{// timer 1 GPT_IO_PIN_GTIOCAR_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_GTIOCBR_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 */