在RA6M4處理器的ADC里,有兩路ADC可以分別采樣當(dāng)前的CPU內(nèi)部溫度和參考電壓值。
6.1 ADC接口配置
首先,在FSP配置中選擇 Stacks ,點(diǎn)擊 "New Stack" -> "Analog" -> "ADC(r_adc)" 添加 ADC 協(xié)議棧。
接下來設(shè)置 ADC 的相關(guān)配置,并重新生成代碼。
- 設(shè)置ADC的名稱為 g_adc0, 并選擇 Unit 0;
- 修改采樣方式為 Single Scan 模式;
- 設(shè)置ADC采樣中斷的優(yōu)先級(jí)為2,并設(shè)置中斷回調(diào)函數(shù)為 adc0_callback() ;
然后在 "Module g_adc ADC(r_adc)" -> "Input" -> "Channel Scan Mask(channel availability varies by MCU)" 下選擇 "Temperature Sensor" 和 "Voltage Sensor"兩個(gè)通道,并生成代碼。
6.2 源碼修改
創(chuàng)建ADC操作相關(guān)的頭文件 src/bsp_adc.h 如下:
#ifndef BSP_ADC_H_
#define BSP_ADC_H_
/* Macro to provide delay in read adc data*/
#define ADC_READ_DELAY 0x01
fsp_err_t adc_init(void);
void adc_deinit(void);
fsp_err_t adc_read_cpu_hwinfo(void);
#endif /* BSP_ADC_H_ */
創(chuàng)建ADC操作相關(guān)的C文件 src/bsp_adc.c 如下:
#include
#include "bsp_api.h"
#include "hal_data.h"
#include "bsp_adc.h"
/* Flag to notify that adc scan is started, so start reading adc */
volatile bool scan_complete_flag = false;
fsp_err_t adc_init(void)
{
fsp_err_t err = FSP_SUCCESS;
/* Open/Initialize ADC module */
err = R_ADC_Open (&g_adc0_ctrl, &g_adc0_cfg);
if (FSP_SUCCESS != err)
{
printf("** R_ADC_Open API failed **
");
return err;
}
/* Configures the ADC scan parameters */
err = R_ADC_ScanCfg (&g_adc0_ctrl, &g_adc0_channel_cfg);
if (FSP_SUCCESS != err)
{
printf("** R_ADC_ScanCfg API failed **
");
return err;
}
return FSP_SUCCESS;
}
void adc_deinit(void)
{
fsp_err_t err = FSP_SUCCESS;
/* close the ADC driver */
err = R_ADC_Close (&g_adc0_ctrl);
if (FSP_SUCCESS != err)
{
printf("** R_ADC_Close API failed **
");
}
}
#define ADCTEMP_AS_C(a) ((((float)a) * 0.196551f) - 277.439f)
#define ADCTEMP_AS_F(a) ((((float)a) * 0.353793f) - 467.39f)
#define ADCTEMP_AS_V(a) (float)((((float)a) * 3.3) / 4096.0)
fsp_err_t adc_read_cpu_hwinfo(void)
{
fsp_err_t err = FSP_SUCCESS; // Error status
uint16_t adc_data;
float mcu_temp = 0.0;
float mcu_vol = 0.0;
scan_complete_flag = false;
/* Start the ADC scan*/
err = R_ADC_ScanStart (&g_adc0_ctrl);
if (FSP_SUCCESS != err)
{
/* ADC Failure message */
printf("** R_ADC_ScanStart API failed **
");
return err;
}
while (!scan_complete_flag)
{
/* Wait for callback to set flag. */
}
/* Read the internal temperature sample result */
err = R_ADC_Read (&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &adc_data);
if (FSP_SUCCESS != err)
{
/* ADC Failure message */
printf("** R_ADC_Read API failed **
");
return err;
}
mcu_temp = ADCTEMP_AS_C(adc_data); /* Conversion ADC temperature in celsius */
printf("
MCU Internal Temperature ADC Data: %d Celsius: %.02f'C
", adc_data, mcu_temp);
/* Read the internal reference voltage sample result */
err = R_ADC_Read (&g_adc0_ctrl, ADC_CHANNEL_VOLT, &adc_data);
if (FSP_SUCCESS != err)
{
/* ADC Failure message */
printf("** R_ADC_Read API failed **
");
return err;
}
mcu_vol = ADCTEMP_AS_V(adc_data); /* Conversion ADC to voltage */
printf("MCU Internal Reference Voltage ADC Data: %d Voltage: %.02fV
", adc_data, mcu_vol);
/* 1 Seconds Wait time between successive readings */
R_BSP_SoftwareDelay (ADC_READ_DELAY, BSP_DELAY_UNITS_SECONDS);
return err;
}
/* Callback function */
void adc0_callback(adc_callback_args_t *p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
scan_complete_flag = true;
}
修改 src/hal_entry.c 源文件,在里面添加按鍵初始化代碼并修改藍(lán)色Led燈為系統(tǒng)運(yùn)行的心跳燈狀態(tài)。
... ...
#include "bsp_adc.h"
... ...
void hal_entry(void)
{
... ...
adc_init();
while (1)
{
... ...
adc_read_cpu_hwinfo();
}
}
6.3 編譯運(yùn)行
代碼修改完成后,在開發(fā)板上編譯運(yùn)行,此時(shí)調(diào)試串口上將會(huì)實(shí)時(shí)打印當(dāng)前CPU的內(nèi)核溫度和參考電壓值。
-
處理器
+關(guān)注
關(guān)注
68文章
19407瀏覽量
231179 -
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44622瀏覽量
638519 -
adc
+關(guān)注
關(guān)注
99文章
6533瀏覽量
545745 -
ADC采樣
+關(guān)注
關(guān)注
0文章
134瀏覽量
12903
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論