在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文章
19657瀏覽量
232460 -
單片機
+關注
關注
6055文章
44796瀏覽量
643582 -
adc
+關注
關注
99文章
6599瀏覽量
547495 -
ADC采樣
+關注
關注
0文章
134瀏覽量
13073
發布評論請先 登錄
相關推薦
STC單片機ADC采樣程序設計
單片機adc采樣原理
STM8S003單片機ADC采樣通道有幾個呢
單片機ADC的采樣頻率和采樣速率是不是同一個概念?采樣頻率、速率要遠遠大于被采樣的信號頻率和速率?
STM8SF103單片機的ADC采樣電壓設計

STC12C4052ADSTC單片機ADC采樣C程序

AVR單片機ADC采樣編程需要注意的問題

單片機ADC采樣算法----平均值采樣法

解決STM32單片機的ADC采樣不準確偏移的問題

單片機ADC采樣算法----中位值濾波法

單片機ADC采樣算法----卡爾曼濾波

評論