在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文章
18210浏览量
221928 -
单片机
+关注
关注
5997文章
43947浏览量
620542 -
adc
+关注
关注
95文章
5643浏览量
539278 -
ADC采样
+关注
关注
0文章
124浏览量
12705
发布评论请先 登录
相关推荐
STC单片机ADC采样程序设计
BOOLRun;//BOOL量作为定时采样标志,比如每隔3秒,置位一
次该标志
BYTECurch;//当前通道
BYTEtempCvData[6];//转换结果临时缓冲
发表于 05-29 14:45
•7711次阅读
单片机adc采样原理
单片机adc采样原理,关于卡尔曼滤波,看看百度百科上的定义算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 "预测量" 和 "误差"
发表于 07-14 06:09
AVR单片机进行ADC采样编程需要注意哪些问题
AVR单片机ADC采样编程需要注意的问题10位ADC高6位没有使用,所以取值时应首先做:ADCH & 0X03取低两位,屏蔽高6位
发表于 11-23 07:43
STM8S003单片机ADC采样通道有几个呢
STM8S003单片机ADC采样通道总共有5个,从AIN2---AIN6,多通道采样时需要将ADC转换设置为单次转换模式,每次切换
发表于 02-21 07:04
单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率?
单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率
发表于 11-15 19:09
STC12C4052ADSTC单片机ADC采样C程序
STC12C4052ADSTC单片机ADC采样C程序(罗马仕电源技术偏执狂价格)-STC12C4052ADSTC单片机ADC
发表于 09-18 10:27
•52次下载
AVR单片机ADC采样编程需要注意的问题
AVR单片机ADC采样编程需要注意的问题10位ADC高6位没有使用,所以取值时应首先做:ADCH & 0X03取低两位,屏蔽高6位
发表于 11-14 20:51
•2次下载
单片机ADC采样算法----平均值采样法
单片机在模拟电路中使用的时候,经常需要用到AD功能,而通过单片机ADC采集回来的数据往往不能直接使用,在不同场合下需要对采集到的数据要通过不同的算法对数据进行处理,先来看看最简单的平均值采样
发表于 11-15 15:06
•26次下载
解决STM32单片机的ADC采样不准确偏移的问题
项目场景:用STM32CubeMX生成的ADC采样测量电压。单片机:STM32G070MDK:V5.25问题描述:采样回来的数值Debug看总是大了些许,几个通道都是这样,具体测试情况
发表于 11-16 20:36
•18次下载
单片机ADC采样算法----中位值滤波法
中位值滤波法就是通过连续采样奇数个数据,然后对数据从小到大排序,取中间的值做为本次采样值。 下面看C代码的实现#define M 11unsigned int filter2( void
发表于 11-17 09:06
•18次下载
单片机ADC采样算法----卡尔曼滤波
关于卡尔曼滤波,看看百度百科上的定义 算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 "预测量" 和 "误差",计算得到当前的最优量. 再预测下一刻的量,里面比较突出的是观点是.把误差纳入计算, 而且分为预测误差和测量误差两种.通称为 噪声.还有一个非常大的特点是,误差独立存在,始终不受测量数据的影响。下来先了解一个卡尔曼滤波中几个参数的含义:概率(Pr...
发表于 12-29 19:30
•27次下载
评论