【瑞萨RA6E2】ADC 电压温度计
本文介绍了瑞萨 RA-Eco-RA6E2-64PIN-V1.0 开发板由 ADC 采集芯片温度和电压数据并串口打印,实现 ADC 电压温度计的项目设计。
项目介绍
瑞萨 RA6E2 Eco 开发板结合 ADC 温度传感器和ADC功能实现电压和温度测量的项目设计。
- 硬件连接:RA6E2开发板串口接线、ADC引脚通道接线;
- 流程图:代码和项目流程;
- 工程代码:ADC 配置和主程序;
- 效果演示:串口打印ADC电压和温度。
硬件连接
- 使用 Type-C 数据线连接开发板和电脑,用以串口通信;
- 使用 J-LINK 调试器连接板载 SWD 调试端口;
- 使用杜邦线连接 P000 引脚,用以测试 ADC 采样电压;

流程图

工程创建
- 打开 e^2^ studio 软件;
- 依次点击
文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA ;
- 依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择
R7FA6E2BB3CFM ,工具链选择 GNU ARM Embedded ,调试器选择 J-Link ;
- 完成工程创建 ;
串口配置
-
进入 FSP 配置界面,打开 Pins 标签页,根据原理图或开发板丝印,将 P109 和 P110 引脚分别配置为 TXD9 和 RXD9 串口模式;

-
新建串口通信堆栈 New Stack - Connectivity - UART (r_sci_uart) ;
-
串口属性配置

-
进入 BSP 标签页,配置 RA Common 属性

ADC 配置
- 进入 Stacks 堆栈标签页,新建 ADC 堆栈
New Stack - Analog - ADC (r_adc) ;
- 选中 ADC 堆栈,进入属性选项;
- Input 选项下勾选 Channel 0 和 Temperature Sensor 选项;
- 中断配置 - Interrupts - Callback 值修改为 adc_callback - 优先级设置为 Priority 2 ;
- 引脚 Pins 开启 AN000 对应 P000 引脚;

- 配置完成后,点击
Generate Project Content 按钮,生成工程代码;
- 右键项目,构建工程,确保 0 报错。
代码
包括关键执行代码和官方示例代码。
关键代码
在项目文件目录中,打开 src/hal_entry.c 文件,添加如下关键代码
#include "hal_data.h"
#include <stdio.h>
fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#endif
PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for(int i=0;i<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}
volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
scan_complete_flag = true;
}
#define VCC_UV (3300000UL)
#define RES_SHIFT (12U)
#define REF_TEMP (127)
#define SLOPE_UV_PER_C (4000L)
static int32_t get_temperature_c(void)
{
R_ADC_ScanStart(&g_adc0_ctrl);
adc_status_t status = { .state = ADC_STATE_SCAN_IN_PROGRESS };
while (status.state == ADC_STATE_SCAN_IN_PROGRESS)
{
R_ADC_StatusGet(&g_adc0_ctrl, &status);
}
uint16_t raw;
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &raw);
adc_info_t info;
R_ADC_InfoGet(&g_adc0_ctrl, &info);
int32_t cal127 = (int32_t)info.calibration_data;
int32_t v1_uv = (VCC_UV >> RES_SHIFT) * cal127;
int32_t vs_uv = (VCC_UV >> RES_SHIFT) * raw;
int32_t temp_c = (vs_uv - v1_uv) / SLOPE_UV_PER_C + REF_TEMP;
return temp_c;
}
static void get_adc_voltage(uint16_t *p_raw, float *p_volt)
{
uint16_t adc_raw;
R_ADC_ScanStart(&g_adc0_ctrl);
adc_status_t status = { .state = ADC_STATE_SCAN_IN_PROGRESS };
while (status.state == ADC_STATE_SCAN_IN_PROGRESS)
{
R_ADC_StatusGet(&g_adc0_ctrl, &status);
}
err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_raw);
assert(FSP_SUCCESS == err);
float volt = (float)(adc_raw/4095.0)*3.3;
*p_raw = adc_raw;
*p_volt = volt;
}
void hal_entry(void)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
while (1)
{
int32_t temp_c = get_temperature_c();
uint16_t adc_raw;
float volt;
get_adc_voltage(&adc_raw, &volt);
printf("{\"adc\": %u, \"volt\": %.3f, \"temp\": %ld}\r\n",adc_raw,volt,temp_c);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
- 保存文件,右键项目 - 构建项目;
- 右键项目 - 调试项目 - 上传固件至开发板。
Demo 代码
有关 FSP 中 ADC 函数使用的官方示例代码如下,详见:RA Flexible Software Package Documentation: ADC (r_adc)
#define ADC_EXAMPLE_CALIBRATION_DATA_RA6M1 (0x7D5)
#define ADC_EXAMPLE_VCC_MICROVOLT (3300000)
#define ADC_EXAMPLE_TEMPERATURE_RESOLUTION (12U)
#define ADC_EXAMPLE_REFERENCE_CALIBRATION_TEMPERATURE (127)
void adc_temperature_example (void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
(void) R_ADC_ScanStart(&g_adc0_ctrl);
adc_status_t status;
status.state = ADC_STATE_SCAN_IN_PROGRESS;
while (ADC_STATE_SCAN_IN_PROGRESS == status.state)
{
(void) R_ADC_StatusGet(&g_adc0_ctrl, &status);
}
uint16_t temperature_conversion_result;
err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &temperature_conversion_result);
assert(FSP_SUCCESS == err);
int32_t reference_calibration_data;
adc_info_t adc_info;
(void) R_ADC_InfoGet(&g_adc0_ctrl, &adc_info);
reference_calibration_data = (int32_t) adc_info.calibration_data;
int32_t slope_uv_per_c = BSP_FEATURE_TSN_SLOPE;
int32_t v1_uv = (ADC_EXAMPLE_VCC_MICROVOLT >> ADC_EXAMPLE_TEMPERATURE_RESOLUTION) *
reference_calibration_data;
int32_t vs_uv = (ADC_EXAMPLE_VCC_MICROVOLT >> ADC_EXAMPLE_TEMPERATURE_RESOLUTION) *
temperature_conversion_result;
int32_t temperature_c = (vs_uv - v1_uv) / slope_uv_per_c + ADC_EXAMPLE_REFERENCE_CALIBRATION_TEMPERATURE;
if ((temperature_c < 20) || (temperature_c > 25))
{
__BKPT(0);
}
}
详见:RA Flexible Software Package Documentation: ADC (r_adc)
效果
- TypeC - USB 数据线连接开发板串口和电脑;
- 打开串口调试助手,配置对应的波特率等参数;
- 打开串口,即可接收芯片发送的 ADC 数值、电压和温度信息;

将 P000 引脚分别连接 3.3V 和 GND ,输出对应的电压值

总结
本文介绍了瑞萨 RA-Eco-RA6E2-64PIN-V1.0 开发板由 ADC 采集芯片温度和 P000 电压数据,并串口打印实现ADC温度计和电压测量的项目设计,为该产品在物联网领域的开发设计和快速应用提供了参考。