MSPM0L1306例程学习-ADC部分(2)

MSPM0L1306例程学习系列
使用的TI的官方例程,即SDK里边包含的例程代码。
可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/

MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程:
在这里插入图片描述

前边讲了3个例程,今天讲第4个例程,使用ADC的内部通道,对系统的电源电压进行测量。 ADC模块硬件上预留有多个内部通道,可以用于系统的内部测量。如下图所示,A0-A9是连接到外部IO引脚的,其它通道是连接到内部模块的。
电源监测使用A15,系统内部将电源电压进行1/3分压之后,送到ADC模块。
在这里插入图片描述
官方的这个例程设计得一般,比大小没有太大意义,不如直接设断点看计算出的电源电压;更多可以查看下边的代码注释。

同样的,因为用了sysconfig图形配置工具,系统的初始化配置如下:
在这里插入图片描述

与前边的代码例程相比,不需要每次转换完以后都调用DL_ADC12_enableConversions(ADC12_0_INST)来使能ADC转换,即ENC=1。 因为这个例程ADC的工作模式变了,配置成单通道、多次转换模式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验步骤:

  1. 下载程序;
  2. 添加查看的变量gAdcResultVolts;
  3. 设置断点,查看ADC的采样结果值(有可能被优化了),查看计算出来的电压值gAdcResultVolts;
  4. 万用表测量电源电压,对比计算出来的电压值;

在这里插入图片描述

在这里插入图片描述

添加注释后的详细代码参考如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_monitor_supply.c
 * 描述:
 *   使用ADC内部通道(有专门的一路用于监测电源电压),测量系统的电源电压。
 *   1、单通道、多次转换、自动采样模式、软件触发;
 *   2、使用MEM0,选择ADC通道15(内部电源监控通道,取电源电压的1/3送到ADC模块)
 *   3、使用内部参考电压,2.5V
 *   4、PA0引脚连接有LED灯;
 *   5、对通道15进行AD采样和转换,根据转换结果进行LED的指示操作:
 *     a.当转换结果小于ADC12_SUPPLY_MONITOR_VALUE时,LED灭; 否则,点亮LED
 *     b.例程这个灯亮和灯灭设计的没啥意义,建议通过断点直接查看电源电压;
 *
 * 操作描述:
 *   1、下载程序;
 *   2、添加查看的变量gAdcResultVolts;
 *   3、设置断点,查看ADC的采样结果值(有可能被优化了),查看计算出来的电压值gAdcResultVolts;
 *   4、万用表测量电源电压,对比计算出来的电压值;
 *
 * 注意事项:
 *   1、从数据手册里可以查看到,电源电压监测通道为A15(内部通道);将电源电压分压后使用,1/3*VDD
 *   2、查看ADC的采样结果值,这个变量有可能被优化了,但不影响计算的电压值;思考下,怎么才能不优化?
 *
 * 思考:
 *   万用表测量电源电压,看测量值是否符合预取结果。
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

/*
 * 作为入门例程,这个宏定义把系统整复杂了;
 * 定义了这么多,最终就是想等到一个变量: ADC12_SUPPLY_MONITOR_VALUE
 * 用于将ADC的转换结果跟它进行比较;
 * 这个例程,比大小没有太大意义,不如直接设断点看计算出的电源电压;
 *
 * 能理解这个公式就行,根据AD的转换结果反算出电压;
 * gAdcResultVolts = (adcResult * ADC12_REF_VOLTAGE) / (1 << ADC12_BIT_RESOLUTION) * 3;
 *
 * (1 << ADC12_BIT_RESOLUTION) --》12位的AD,2的12次方;
 * AD的转换结果adcResult / 2的12次方,  再✖参考电压ADC12_REF_VOLTAGE, 计算出当前AD的采样对应的电压;
 * 电源电压还要再✖3
 */

/* clang-format off */
#define ADC12_BIT_RESOLUTION                (12)
#define ADC12_REF_VOLTAGE                   (2.5)
#define ADC12_SUPPLY_MONITOR_VOLTAGE        (2.5)
 #define ADC12_SUPPLY_MONITOR_VALUE         ( (1 << ADC12_BIT_RESOLUTION) * \
                                              (ADC12_SUPPLY_MONITOR_VOLTAGE / \
                                               (3 * ADC12_REF_VOLTAGE)))
/* clang-format on */

volatile bool gCheckADC;
volatile float gAdcResultVolts;

int main(void)
{
    uint16_t adcResult;

    //器件初始化
    SYSCFG_DL_init();

    //配置器件的中断
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

    //ADC12的结果更新标志位清零
    gCheckADC = false;

    //软件启动ADC12转换
    DL_ADC12_startConversion(ADC12_0_INST);

    while (1)
    {

        //等待转换完成
        //如果标志位gCheckADC不是true,程序在while循环等待
        //gCheckADC=true后,程序继续往下执行
        while (false == gCheckADC)
        {
            __WFE();
        }

        //ADC12的结果更新标志位清零
        gCheckADC = false;

        //从结果寄存器读取本次的转换结果
        adcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);

        //将ADC的转换结果换算成电压值?
        gAdcResultVolts = (adcResult * ADC12_REF_VOLTAGE) / (1 << ADC12_BIT_RESOLUTION) * 3;

        //比较的话,还是直接用ADC的采样的结果进行比较,整型数.结果为整数以进行高效处理
        if (adcResult > ADC12_SUPPLY_MONITOR_VALUE)
        {
            DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        }
        else
        {
            DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
        }
    }
}


/*
 * ADC12中断处理函数
 *
 * 中断里只设置结果更新标志位gCheckADC
 *
 */

void ADC12_0_INST_IRQHandler(void)
{
    switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
    {
        case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
            gCheckADC = true;
            break;
        default:
            break;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业选CRM系统,这3个关键点你一定不能错过

在充满竞争的商业市场中&#xff0c;企业需要一种强大的工具来管理客户关系&#xff0c;从而提高销售效率。CRM客户关系管理软件就是企业所需要的。然而仅仅是在国内&#xff0c;CRM的供应商就超过了一千家&#xff0c;那么应该怎样选择适合企业的CRM系统&#xff1f; 一、软件…

设计模式——观察者模式(Observer Pattern)

概述 观察者模式是使用频率最高的设计模式之一&#xff0c;它用于建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c;其他对象将相应作出反应。在观察者模式中&#xff0c;发生改变的对象称为观察目标&#xff0c;而被通知的对象称…

Python 自动化之处理docx文件(一)

批量筛选docx文档中关键词 文章目录 批量筛选docx文档中关键词前言一、做成什么样子二、基本架构三、前期输入模块1.引入库2.路径输入3.关键词输入 三、数据处理模块1.基本架构2.如果是docx文档2.1.读取当前文档内容2.2.遍历匹配关键字2.3.触发匹配并记录日志 3.如果目录下还有…

ajax和Axios快速入门

什么是ajax 概念&#xff1a; Asynchronous JavaScript And XML&#xff0c;异步的JavaScrip和XML&#xff0c;重点在异步。 作用&#xff1a; 1&#xff0c;数据交互&#xff0c;可以通过ajax给服务器发送请求&#xff0c;并获取服务器响应的数据。 2&#xff0c;异步交互&am…

SSD Wear Leveling磨损均衡,并不是一直有效,甚至有负面作用!-part1

1.引言 上一篇WL基础文章中&#xff0c;我们介绍了SSD为何需要Wear Leveling磨损均衡的基本原理和分类&#xff0c;阅读本文之前&#xff0c;建议先了解WL磨损均衡的相关背景&#xff1a; 扩展阅读&#xff1a;深入解析SSD Wear Leveling磨损均衡技术&#xff1a;如何让你的硬…

什么是循环依赖,如何解决

目录 什么是循环依赖&#xff1f; 循环依赖的原因&#xff1a; 如何解决循环依赖问题&#xff1f; 最佳实践和注意事项&#xff1a; 结论&#xff1a; 当在使用 Spring Boot 进行开发时&#xff0c;循环依赖&#xff08;Circular Dependency&#xff09;可能会成为一个常见…

C语言之数组精讲(1)

目录 数组 数组的声明&#xff08;使用数组前的准备&#xff09; 访问数组&#xff08;数组的使用方法&#xff09; 数组的遍历 数组初始化 1.在声明变量时&#xff0c;除了必要的情况下&#xff0c;都需要对变量进行初始化。 2.我们还可以像下面在声明数组时不指定元素…

mitm抓包实践---可用于投票、日常类任务运用

文章目录 一、安装mitm二、证书导入三、抓包三、后话补充 一、安装mitm 第一种方式: 官网下载 https://mitmproxy.org/downloads/ 第二种方式: py库安装 pip install mitmproxy我是第一种&#xff0c;不熟悉py 二、证书导入 下载证书: http://mitm.it/ 首先你要开启代理&am…

【MySQL】MySQL库的操作

MySQL库的操作 一、创建数据库创建数据库案例字符集和校验规则校验规则对数据库的影响 二、操纵数据库1、查看数据库2、查看当前正在使用的数据库3、使用数据库4、显示创建语句5、数据库删除6、数据库的修改7、备份和恢复8、查看连接情况 一、创建数据库 创建数据库的语法如下…

HarmonyOS第一课ArkTS开发语言(TypeScript快速入门)

编程语言介绍 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。要了解什么是ArkTS&…

C语言:高精度乘法

P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 第一次画图&#xff0c;略显简陋。 由图可以看出c的小标与x,y下标的关系为x的下标加上y的下标再减一。 由此得到&#xff1a; c [ i j - 1 ] x [ i ] * y [ j ]x #include<stdio.h> #include<st…

(第67天)RMAN Duplicate 克隆 PDB

介绍 在之前 NONCDB 版本我们经常使用 RMAN Duplicate 方式来在线搭建 DataGuard,非常方便快捷。从 12C 开始 Oracle 推出了 CDB 架构后,自然也就支持使用 Duplicate 的方式来复制 CDB,但是 12C 时还没有那么智能。 从 18C 开始进行了升级,可以支持使用 RMAN Duplicate 方…

react-webApp--响应式布局

rem响应式布局 移动端响应式布局 1.自己实现&#xff0c;需要设计好初始换算比&#xff0c;设为100px方便计算 <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, minimum-scale1.0, user-scalableno"/> <…

爬虫学习日记第九篇(爬取seebug)

目标&#xff1a;https://www.seebug.org/vuldb/vulnerabilities 需求&#xff1a;爬取cve_id及影响组件 单线程 cookie是有时效的(过一段时间就不行了&#xff0c;大概半小时左右)&#xff0c;但是并不需要登录(直接抓包拿到的请求头) import base64 import json import ur…

持续集成交付CICD:通过API方式上传Nexus制品

目录 一、实验 1.通过API方式上传Nexus制品 二、问题 1.如何通过API方式上传PNG图片 2.如何通过API方式上传tar.gz 与 ZIP文件 3.如何通过API方式上传Jar file文件 4.如何通过API方式上传制品&#xff08;maven类型的制品&#xff09;文件 5.如何下载制品 一、实验 1.通…

flink找不到隐式项

增加 import org.apache.flink.streaming.api.scala._ 即可

C语言 联合体验证 主机字节序 +枚举

联合体应用&#xff1a;验证当前主机的大小端&#xff08;字节序&#xff09; //验证当前主机的大小端 #include <stdio.h>union MyData {unsigned int data;struct{unsigned char byte0;unsigned char byte1;unsigned char byte2;unsigned char byte3;}byte; };int main…

在Vue2中使用MarkDown编辑器输入(mavonEditor)

在开发一些需求如博客系统时&#xff0c;原始的文本框不满足我们的需求&#xff0c;展示word文档的格式又太麻烦吗&#xff0c;不难想到使用markdown的格式来输入和展示内容。本文介绍了在Vue2中怎么使用markdown格式的输入框和展示框。 先看一下实现的效果 官方文档 我们使用…

投资3-5万元的小本生意有什么?

现在想做点生意&#xff0c;真的好难。随便开个小店&#xff0c;房租、水电、装修这些加起来&#xff0c;就投资10w往上了。 我这还没开始赚钱呢&#xff0c;就已经投进去这么多钱了&#xff0c;万一生意不好亏本了&#xff0c;可该怎么办&#xff1f; 其实这是很多人面临的问…

PP材料粘接ABS材料使用UV胶的好处?

跟随着现阶段材料的不断发展更迭&#xff0c;PP材料应用越来越广&#xff0c;生产效率要求越来越高&#xff0c;为了加快生产&#xff0c;提高效率&#xff0c;PP材料的粘接上使用UV胶粘接PP&#xff08;聚丙烯&#xff09;和ABS&#xff08;丙烯腈-丁二烯-苯乙烯共聚物&#x…