0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机的ADC采样设计

CHANBAEK 来源:凌云物联网实验室 作者:郭工 2022-12-19 09:23 次阅读

在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

    文章

    19155

    浏览量

    229044
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632691
  • adc
    adc
    +关注

    关注

    98

    文章

    6429

    浏览量

    544035
  • ADC采样
    +关注

    关注

    0

    文章

    134

    浏览量

    12829
收藏 人收藏

    评论

    相关推荐

    STC单片机ADC采样程序设计

    BOOLRun;//BOOL量作为定时采样标志,比如每隔3秒,置位一 次该标志 BYTECurch;//当前通道 BYTEtempCvData[6];//转换结果临时缓冲
    发表于 05-29 14:45 7994次阅读

    单片机ADC采样问题

    其他的问题都解决了,不知道为什么ADC采样交流电流这么困难,好多天了都没有解决,愁死人了
    发表于 12-14 15:27

    单片机adc采样原理

    单片机adc采样原理,关于卡尔曼滤波,看看百度百科上的定义算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 "预测量" 和 "误差"
    发表于 07-14 06:09

    STM8S003单片机ADC采样通道有几个呢

    STM8S003单片机ADC采样通道总共有5个,从AIN2---AIN6,多通道采样时需要将ADC转换设置为单次转换模式,每次切换
    发表于 02-21 07:04

    怎样去测试STM32单片机ADC采样速率问题

    突然想测试一下STM32单片机ADC采样速率问题,按照常规方法,可以通过ADC采样,然后将采样
    发表于 02-22 06:28

    单片机ADC采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率?

    单片机ADC采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率
    发表于 11-15 19:09

    STC12系列单片机ADC采样是多少位的?

    STC12系列单片机ADC采样是多少位的
    发表于 10-16 07:39

    STM8SF103单片机ADC采样电压设计

    要做AD采样,首先要解决的就是AD的参考电压,之前查看手册上并没有描述AIN7通道,有的仅仅是几个外部采样通道。AIN7通道是内部通道,用于提供一个恒定的电压参考值。 从别的资料找到下面这句话,很明显是存在这么一个通道的,后面测试也证明这个是正确的。
    发表于 12-06 15:42 1.3w次阅读
    STM8SF103<b class='flag-5'>单片机</b>的<b class='flag-5'>ADC</b><b class='flag-5'>采样</b>电压设计

    STC12C4052ADSTC单片机ADC采样C程序

    STC12C4052ADSTC单片机ADC采样C程序(罗马仕电源技术偏执狂价格)-STC12C4052ADSTC单片机ADC
    发表于 09-18 10:27 55次下载
    STC12C4052ADSTC<b class='flag-5'>单片机</b><b class='flag-5'>ADC</b><b class='flag-5'>采样</b>C程序

    AVR单片机ADC采样编程需要注意的问题

    AVR单片机ADC采样编程需要注意的问题10位ADC高6位没有使用,所以取值时应首先做:ADCH & 0X03取低两位,屏蔽高6位
    发表于 11-14 20:51 2次下载
    AVR<b class='flag-5'>单片机</b><b class='flag-5'>ADC</b><b class='flag-5'>采样</b>编程需要注意的问题

    单片机ADC采样算法----平均值采样

    单片机在模拟电路中使用的时候,经常需要用到AD功能,而通过单片机ADC采集回来的数据往往不能直接使用,在不同场合下需要对采集到的数据要通过不同的算法对数据进行处理,先来看看最简单的平均值采样
    发表于 11-15 15:06 26次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>ADC</b><b class='flag-5'>采样</b>算法----平均值<b class='flag-5'>采样</b>法

    解决STM32单片机ADC采样不准确偏移的问题

    项目场景:用STM32CubeMX生成的ADC采样测量电压。单片机:STM32G070MDK:V5.25问题描述:采样回来的数值Debug看总是大了些许,几个通道都是这样,具体测试情况
    发表于 11-16 20:36 19次下载
    解决STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>ADC</b><b class='flag-5'>采样</b>不准确偏移的问题

    单片机ADC采样算法----中位值滤波法

    中位值滤波法就是通过连续采样奇数个数据,然后对数据从小到大排序,取中间的值做为本次采样值。 下面看C代码的实现#define M 11unsigned int filter2( void
    发表于 11-17 09:06 18次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>ADC</b><b class='flag-5'>采样</b>算法----中位值滤波法

    单片机ADC采样算法----卡尔曼滤波

    关于卡尔曼滤波,看看百度百科上的定义 算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 "预测量" 和 "误差",计算得到当前的最优量. 再预测下一刻的量,里面比较突出的是观点是.把误差纳入计算, 而且分为预测误差和测量误差两种.通称为 噪声.还有一个非常大的特点是,误差独立存在,始终不受测量数据的影响。下来先了解一个卡尔曼滤波中几个参数的含义:概率(Pr...
    发表于 12-29 19:30 27次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>ADC</b><b class='flag-5'>采样</b>算法----卡尔曼滤波

    单片机ADC采样输入阻抗怎么匹配

    单片机ADC采样输入阻抗怎么匹配
    的头像 发表于 05-17 17:00 9211次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>ADC</b><b class='flag-5'>采样</b>输入阻抗怎么匹配