【瑞萨RA_FSP】电位器电压采集

news2024/11/25 14:21:24

文章目录

  • 一、硬件设计
  • 二、软件设计
    • 1. 文件结构
    • 2. FSP配置
    • 3. ADC初始化函数
    • 4. ADC中断回调函数
    • 5. 如果未启用中断
    • 6. ADC读取转换结果函数
    • 7. hal_entry入口函数


一、硬件设计

野火启明6M5开发板的 ADC 电位器电路图如图所示。
在这里插入图片描述
可知,开发板板载的电位器连接到 P000 引脚, P000 引脚可以连接到MCU内部的 ADC 外设,从而对电位器输入的模拟信号进行采集。
在这里插入图片描述

二、软件设计

1. 文件结构

ADC
├─ ......
└─ src
   ├─ led
   │  ├─ bsp_led.c
   │  └─ bsp_led.h
   ├─ debug_uart
   │  ├─ bsp_debug_uart.c
   │  └─ bsp_debug_uart.h
   ├─ adc
   │  ├─ bsp_adc.c
   │  └─ bsp_adc.h
   └─ hal_entry.c

2. FSP配置

打开该工程的 FSP 配置界面进行配置。

首先依次点击 “Stacks” -> “Pins” -> “Peripherals” -> “ADC0” 来配置通道 AN000 对应的引脚为 P000。 如下图所示。
在这里插入图片描述
然后依次点击 “Stacks” -> “New Stack” -> “Analog” -> “ADC (r_adc)” 来配置ADC模块。 如下图所示。
在这里插入图片描述
ADC 的属性配置:
在这里插入图片描述
在这里插入图片描述
配置完成之后可以按下快捷键“Ctrl + S”保存, 最后点右上角的 “Generate Project Content” 按钮,让软件自动生成配置代码即可。

3. ADC初始化函数

void ADC_Init(void)
{
   fsp_err_t err;
   err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
   err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
   assert(FSP_SUCCESS == err);
}
  • R_ADC_Open()为整个外设设置操作模式、触发源、中断优先级和配置。如果启用了中断,该函数将注册一个回调函数指针,以便在扫描完成时通知用户。

  • R_ADC_ScanCfg()配置ADC扫描参数。通道特定设置是在这个函数中设置的。

4. ADC中断回调函数

//ADC转换完成标志位
volatile bool scan_complete_flag = false;

void adc_callback(adc_callback_args_t * p_args)
{
   FSP_PARAMETER_NOT_USED(p_args);
   scan_complete_flag = true;
}

在FSP配置页面注册回调函数以及优先级,就可以使用来自ADC的中断回调函数了。

Tips: 通过ADC的中断回调函数来判断ADC是否转换完成。 需要定义了一个布尔类型的数据scan_complete_flag来当做ADC读取完成的标志位。 当没有转换完成的时候scan_complete_flag的值一直为false,单ADC触发中断的时候将scan_complete_flag的值变为true。

5. 如果未启用中断

如果未启用中断,则可使用R_ADC_StatusGet() API 用于轮询 ADC 以确定扫描何时完成。读取 API 函数用于访问转换后的 ADC 结果。这适用于支持校准的MCU的普通扫描和校准扫描。

6. ADC读取转换结果函数

ADC读取思路,在这里调用R_ADC_ScanStart触发相应的adc通道转换,当ADC转换完成之后会将scan_complete_flag标志位变为true。 当判断到标志位变为true后使用R_ADC_Read()或R_ADC_Read32()读取转换完成的数值。

/* 进行ADC采集,读取ADC数据并转换结果 */
double Read_ADC_Voltage_Value(void)
{
   uint16_t adc_data;
   double a0;

   (void)R_ADC_ScanStart(&g_adc0_ctrl);
   while (!scan_complete_flag) //等待转换完成标志
   {
      ;
   }
   scan_complete_flag = false; //重新清除标志位

   /* 读取通道0数据 */
   R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data);
   /* ADC原始数据转换为电压值(ADC参考电压为3.3V) */
   a0 = (double)(adc_data*3.3/4095);

   return a0;
}
  • R_ADC_ScanStart()启动软件扫描或启用扫描的硬件触发器,具体取决于触发器在R_ADC_Open调用中的配置方式。如果该单元被配置为ELC或外部硬件触发,那么该功能允许触发信号到达ADC单元。该函数不能控制触发器本身的生成。如果该单元被配置为软件触发,则该功能启动软件触发扫描。

  • R_ADC_Read()从单通道或传感器寄存器读取转换结果,返回的数据为uint16_t型。

  • R_ADC_Read32()从单通道或传感器寄存器读取转换结果,返回的数据为uint32_t型。

7. hal_entry入口函数

void hal_entry(void)
{
   LED_Init();         // LED 初始化
   Debug_UART4_Init(); // SCI4 UART 调试串口初始化

   /* ADC 初始化 */
   ADC_Init();

   printf("这是一个读取电位器ADC电压转换值的例程\r\n");
   printf("打开串口助手查看ADC转换结果,旋钮电位器,可以看到ADC值在一定范围之内发生变化\r\n");
   printf("开始读取ADC转换值:\r\n");


   while(1)
   {
      printf("a0 = %f\r\n", Read_ADC_Voltage_Value());
      R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //大概0.5秒钟读取一次
      LED1_TOGGLE;
   }


#if BSP_TZ_SECURE_BUILD
   /* Enter non-secure code */
   R_BSP_NonSecureEnter();
#endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随机森林特征重要性(Variable importance)评估方法

Random Forest Variable importance 算法介绍实现算法流程分类回归 实验实验1:waveform数据集(分类)实验2:superconductivity数据集(回归)实验3:power-consumption数据集(回归&#…

UNIX环境高级编程——进程间通信

15.1 引言 本章将说明进程之间相互通信技术——进程间通信(InterProcess Communication,IPC)。 IPC类型包括: 前10种IPC形式通常限于同一台主机的两个进程之间的IPC;最后2种是仅有的支持不同主机上两个进程之间的I…

5G NR SRS功率控制

3GPP TS 38.213 7.3.1节中,关于SRS的功率控制算法如下: 其中, : 表示在载波f服务小区c以及SRS的发送时隙i UE被配置的最大发射功率; : 表示在载波f,BWP b, 服务小区c,SRS资源集qs所配置的p0值&#xff1…

【GateWay快速入门】 —— 每天一点小知识

💧 Z o o K e e p e r 快速入门 \color{#FF1493}{ZooKeeper快速入门} ZooKeeper快速入门💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 《数据结构与算法》专…

子线程不显示Toast?

Handler不仅在ANR过程中有用到,Toast中也用到了Handler。 代码如下: public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.lay…

chatgpt赋能python:Python如何进行高效的查询?

Python如何进行高效的查询? 在Python中,查询是一项非常常见的操作,而高效的查询在数据量增大时可以显著提高程序的性能和效率。本文将介绍Python中的查询方式以及如何进行高效的查询操作。 Python中的查询方式 Python中查询的方式主要分为…

嵌入式容器源码解析

问题分析 不同于使用springmvc,在我们使用springboot时无需配置tomcat就可以直接使用,这就说明springboot已经在我们启动项目时将tomcat配置好了,接下来我们就来看看springboot底层是怎么实现的。 源码解析 ServletWebServerFactoryAutoConfiguratio…

基于Java乡镇自来水收费系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

chatgpt赋能python:如何使用Python查看当前路径

如何使用Python查看当前路径 作为一名有10年Python编程经验的工程师,我今天想和大家分享如何使用Python来查看当前路径。这在开发过程中非常有用,尤其是当需要导入文件或访问某个文件夹时。在本文中,我将介绍在Windows、Mac和Linux系统上如何…

深蓝学院C++基础与深度解析笔记 第 3 章 数组、 vector 与字符串

第 3 章 数组、 vector 与字符串 一、数组 将一到多个相同类型的对象串连到一起,所组成的类型 int a → int b[10] b的类型是int[10]; A、 数组的初始化方式: ● 缺省初始化 ● 聚合初始化( aggregate initialization ) int b[3…

ansible的部署和命令模块和playbooks剧本

系列文章目录 文章目录 系列文章目录一、Ansible1、Ansible简介2、Ansible特点及优势3、Ansible核心程序4、Ansible工作原理及流程5.部署Ansible自动化运维工具6、Ansible常用模块 二、playbooks剧本1.playbooks2、playbooks组成部分3、playbooks启动及检测 总结 一、Ansible …

简单的TCP网络程序·多进程、多线程(后端服务器)

前文链接 -- 简单的TCP网络程序单进程 上篇文章中,实现了TCP网络通信的的单进程版本,因为实现的是一个死循环的逻辑,是串行实运行的,显然这和实际中的TCP通信是不同的,为了解决这方面的问题,需要使用多进程…

B+树:MySQL数据库索引的实现

作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建…

chatgpt赋能python:Python怎么横着输出?

Python怎么横着输出? 如果你是一名有10年Python编程经验的工程师,你一定已经经历过许多项目,很可能你曾经需要对代码进行一些横向格式化或输出。Python作为一种高级编程语言,有各种各样的技巧和技能。在本文中,我们将…

node安装后的全局环境变量配置

安装node时,位置最好不要装在c盘,这里,我在D盘下创建了文件夹"node",安装地址选择在该文件夹下 一直next,直到安装结束,打开"node"文件夹,安装完后,里面的配置…

C++【STL】之vector的使用

文章目录: vector介绍vector使用1. 默认成员函数1.1 默认构造1.2 拷贝构造1.3 析构函数1.4 赋值重载 2. 迭代器2.1 正向迭代器2.2 反向迭代器 3. 容量操作3.1 获取空间数据3.2 空间扩容3.3 大小调整3.4 空间缩容 4. 数据访问4.1 下标随机访问4.2 获取首尾元素 5. 数…

chatgpt赋能python:Python怎么横向键盘输入?

Python怎么横向键盘输入? 如果你是一位使用Python进行编程的工程师,你肯定明白快速而准确地输入代码的重要性。现在,许多程序员都找到了一个方法来更快地输入代码-横向键盘输入。 什么是横向键盘输入? 横向键盘输入是一种方法&…

基于Java校园驿站管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

力扣题库刷题笔记5--最长回文子串

1、题目如下: 2、个人Python代码实现: 首先想到的是通过类似冒泡排序的方式进行切片,然后判断切片的子字符串是否为回文字符串,然后记录出最长的回文字符串,代码如下: 可以看到,通过切片的方式&…

合宙Air724UG Cat.1模块硬件设计指南--电源供电

电源供电 简介 在模块应用设计中,电源设计是很重要的一部分,供电部分的电路设计不当会造成模块出现工作异常、指标恶化等现象,而良好的电源设计方案能够给模块提供稳定的工作状态。 特性 模块主供电VBAT:3.3V~4.3V,推…