在RA6M4處理器的ADC里,有兩路ADC可以分別采樣當前的CPU內部溫度和參考電壓值。
6.1 ADC接口配置
首先,在FSP配置中選擇 Stacks ,點擊 "New Stack" -> "Analog" -> "ADC(r_adc)" 添加 ADC 協議棧。
接下來設置 ADC 的相關配置,并重新生成代碼。
- 設置ADC的名稱為 g_adc0, 并選擇 Unit 0;
- 修改采樣方式為 Single Scan 模式;
- 設置ADC采樣中斷的優先級為2,并設置中斷回調函數為 adc0_callback() ;
然后在 "Module g_adc ADC(r_adc)" -> "Input" -> "Channel Scan Mask(channel availability varies by MCU)" 下選擇 "Temperature Sensor" 和 "Voltage Sensor"兩個通道,并生成代碼。
6.2 源碼修改
創建ADC操作相關的頭文件 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_ */
創建ADC操作相關的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 源文件,在里面添加按鍵初始化代碼并修改藍色Led燈為系統運行的心跳燈狀態。
... ...
#include "bsp_adc.h"
... ...
void hal_entry(void)
{
... ...
adc_init();
while (1)
{
... ...
adc_read_cpu_hwinfo();
}
}
6.3 編譯運行
代碼修改完成后,在開發板上編譯運行,此時調試串口上將會實時打印當前CPU的內核溫度和參考電壓值。
-
處理器
+關注
關注
68文章
19259瀏覽量
229653 -
單片機
+關注
關注
6035文章
44554瀏覽量
634652 -
adc
+關注
關注
98文章
6495瀏覽量
544466 -
ADC采樣
+關注
關注
0文章
134瀏覽量
12840
發布評論請先 登錄
相關推薦
評論