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

news2024/11/23 9:04:57

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

MSPM0L1306例程学习

使用的TI的官方例程,即SDK里边包含的例程代码。

MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程:
mspm0sdk中的ADC例程

例程理解

ADC的转换有多种工作模式,从最简单的单通道单次转换开始入手,即对特定的某个输入通道,进行一次电压的采样,并且读取ADC的转换结果。

标黑的三个例程,代码结构几乎相同,所使用的参考电压源不同而已。都是对ADC转换的结果,与参考电压的一半进行比较,根据判断结果点亮对应的LED灯。

  • adc12_single_conversion :单通道单次转换,直接使用AVCC作为参考电压源;
  • adc12_single_conversion_vref_internal:单通道单次转换,使用内部参考电压源,配置VREF为2.5V;
  • adc12_single_conversion_vref_external:单通道单次转换,使用外部参考电压源,需要外接参考电压到VREF+引脚;

从这三个例程入手,代码结构如下:
在这里插入图片描述
在这里插入图片描述

详细代码注释如下,因为代码都涉及到sysconfig图形配置工具,所以把对应的内容也一并截图上传。

  • GPIO部分,相同的配置,配置了一个GPIO口,用于点亮LED灯操作;
  • ADC部分,也基本相同的配置,时钟,分频;单通道单次转换,使用MEM0,自动采样,软件触发;
  • 在参考电压的选择上,是最大的区别,3个例程分别选择了不同的参考电压,如果选择了vref,还需要在vref模块中对电压进行配置。

adc12_single_conversion

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
详细代码如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_single_conversion.c
 *
 * 描述:
 *   1、单通道单次转换、自动采样模式、软件触发;
 *   2、使用MEM0,通道0(PA27),直接用电源电压作为参考电压
 *   3、PA0引脚连接有LED灯;
 *   4、对通道0进行AD采样和转换,根据转换结果进行LED的指示操作:
 *     a.当转换结果小于0x7ff时,LED灭; 否则,点亮LED
 *
 * 操作描述:
 *   1、下载程序,全速运行;
 *   2、引脚PA27通过杜邦线连接VCC或GND
 *     a. 连接到VCC时,红色LED点亮;
 *     b. 连接到GND时,红色LED熄灭.
 * 注意事项:
 *   1、如果使用的是LP-MSPM0L1306, PA27引脚默认通过跳线帽连接三色LED2;
 *
 * 思考:
 *   给输入引脚上施加一个电压,看测量值是否符合预取结果。
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

//ADC转换完成的标识,在ADC的中断里设为有效;
volatile bool gCheckADC;

volatile uint16_t gAdcResult;

int main(void)
{
    //初始化配置
    SYSCFG_DL_init();

    //使能中断
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

    //标志位清零
    gCheckADC = false;

    while (1)
    {
        //软件开启ADC转换,SC=1
        DL_ADC12_startConversion(ADC12_0_INST);

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


        //读取ADC12的转换结果
        gAdcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);

        //对ADC12的转换结果进行处理
        if (gAdcResult > 0x7ff)
        {
            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 = false;

        //使能ADC转换,即ENC=1,等待触发信号
        DL_ADC12_enableConversions(ADC12_0_INST);
    }
}


/*
 * 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;
    }
}

adc12_single_conversion_vref_internal

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
详细代码如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_single_conversion_vref_internal.c
 * 描述:
 *   1、单通道单次转换、自动采样模式、软件触发;
 *   2、使用MEM0,通道2(PA25),使用内部参考电压,2.5V
 *   3、PA0引脚连接有LED灯;
 *   4、对通道0进行AD采样和转换,根据转换结果进行LED的指示操作:
 *     a.当转换结果小于0x7ff时,LED灭; 否则,点亮LED
 *
 * 操作描述:
 *   1、下载程序,全速运行;
 *   2、引脚PA25通过杜邦线连接VCC或GND
 *     a. 连接到VCC时,红色LED点亮;
 *     b. 连接到GND时,红色LED熄灭.
 * 注意事项:
 *   1、如果使用的是LP-MSPM0L1306, PA25引脚默认接有跳线帽J4;
 *
 * 思考:
 *   给输入引脚上施加一个电压,看测量值是否符合预取结果。
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

volatile bool gCheckADC;
volatile uint16_t adcResult;

int main(void)
{
    //初始化配置
    SYSCFG_DL_init();

    //使能中断
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

    gCheckADC = false;

    //在启动ADC12转换之前,先确认参考电压VREF已稳定
    while (DL_VREF_CTL1_READY_NOTRDY == DL_VREF_getStatus(VREF));

    while (1)
    {
        //软件开启ADC转换,SC=1
        DL_ADC12_startConversion(ADC12_0_INST);

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

        //读取ADC12的转换结果
        adcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);

        //对ADC12的转换结果进行处理
        if (adcResult > 0x7ff)
        {
            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 = false;

        //使能ADC转换,即ENC=1,等待触发信号
        DL_ADC12_enableConversions(ADC12_0_INST);
    }
}



/*
 * 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;
    }
}

adc12_single_conversion_vref_external

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
详细代码如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_single_conversion_vref_external.c
 * 描述:
 *   1、单通道单次转换、自动采样模式、软件触发;
 *   2、使用MEM0,通道2(PA25),使用内部参考电压,2.5V
 *   3、PA0引脚连接有LED灯;
 *   4、对通道0进行AD采样和转换,根据转换结果进行LED的指示操作:
 *     a.当转换结果小于0x7ff时,LED灭; 否则,点亮LED
 *
 * 操作描述:
 *   1、下载程序,全速运行;
 *   2、引脚PA25通过杜邦线连接VCC或GND
 *     a. 连接到VCC时,红色LED点亮;
 *     b. 连接到GND时,红色LED熄灭.
 * 注意事项:
 *   1、如果使用的是LP-MSPM0L1306, PA25引脚默认接有跳线帽J4;
 *   2、需要VREF+引脚外接参考电压
 *
 * 思考:
 *   给输入引脚上施加一个电压,看测量值是否符合预取结果。
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

/* 宏定义配置
 * 先定义了外部参考电压ADC12_EXTERNAL_REF_VOLTAGE, 取参考电压的一半为监测比较的电压ADC12_MONITOR_VOLTAGE
 * 因为ADC位数为12位,通过宏定义的方式计算出了参考电压的一半值所对应的ADC转换结果ADC12_MONITOR_VALUE
 *
 * 实际上ADC12_MONITOR_VALUE,可以直接计算出来的。 2的12次方的一半,2048,即12位ADC满量程的一半;
 * 如果是10位AD,一半为512
 */
/* clang-format off */
#define ADC12_BIT_RESOLUTION          (12)
#define ADC12_EXTERNAL_REF_VOLTAGE    (3.3)
#define ADC12_MONITOR_VOLTAGE         (ADC12_EXTERNAL_REF_VOLTAGE / 2)
#define ADC12_MONITOR_VALUE           ((1 << ADC12_BIT_RESOLUTION) * (ADC12_MONITOR_VOLTAGE / (ADC12_EXTERNAL_REF_VOLTAGE)))
/* clang-format on */

volatile bool gCheckADC;

int main(void)
{
    uint16_t adcResult;

    //初始化配置
    SYSCFG_DL_init();

    //使能中断
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

    gCheckADC = false;

    while (1)
    {
        //软件开启ADC转换,SC=1
        DL_ADC12_startConversion(ADC12_0_INST);

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

        //读取ADC12的转换结果
        adcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);

        //对ADC12的转换结果进行处理
        if (adcResult > ADC12_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);
        }

        //?这一句没太必要,多余的
        DL_ADC12_stopConversion(ADC12_0_INST);

        //ADC12的转换标志位清零
        gCheckADC = false;

        //使能ADC转换,即ENC=1,等待触发信号
        DL_ADC12_enableConversions(ADC12_0_INST);
    }
}


/*
 * 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.coloradmin.cn/o/1305282.html

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

相关文章

C++共享和保护——(1)作用域

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;要想平衡就…

Java - Spring中Bean的循环依赖问题

什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Spring解决循环依赖的机理 Spring为什么可以解决set s…

ubuntu如何远程ssh登录Windows环境并执行测试命令

ubuntu如何远程ssh登录Windows环境并执行测试命令 1 paramiko模块简介1.1 安装paramiko1.2 paramiko基本用法1.2.1 创建SSHClient实例1.2.2 设置主机密钥策略1.2.3 连接SSH服务器1.2.4 执行命令1.2.5 关闭SSH连接1.2.6 异常处理 2 windows的配置2.1 启动OpenSSH服务2.2 配置防火…

【Qt开发流程】之2D绘图1:概述及基本绘制与填充和渐变填充

概述 Qt的绘图系统可以使用相同的API在屏幕和打印设备上进行绘图&#xff0c;并且主要基于QPainter, QPaintDevice和QPaintEngine类。 QPainter用于执行绘图操作&#xff0c;QPaintDevice是一个二维空间的抽象&#xff0c;可以使用QPainter在其上绘制&#xff0c;QPaintEngine…

Android : XUI- SimpleImageBanner+BannerItem带标题的轮播图-简单应用

示例图&#xff1a; 1.导入XUI http://t.csdnimg.cn/qgGaN 2.MainActivity.java package com.example.viewpagerbanne;import android.os.Bundle; import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.xu…

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

Linux--操作系统

1. 常见的操作系统 Windowsmac OSLinuxiOSAndroid 2. 操作系统的定义 操作系统直接运行在计算机上的系统软件&#xff0c; 它是控制硬件和支持软件运行的计算机程序。 3. 操作系统的作用 向下控制硬件向上支持软件的运行&#xff0c;具有承上启下的作用。 4.总结 操作系统…

Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 is available

记录一次服务调用中的错误 背景&#xff1a;我使用了nacos2.x的版本&#xff0c;同时在同一台服务器的三个docker容器中部署了nacos1、2、3&#xff0c;并将它们连接到了同一个docker网络 错误&#xff1a;Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 …

事件驱动架构 vs. RESTful架构:通信模式对比与选择

1. 通信风格 事件驱动架构&#xff08;EDA&#xff09; 是一种异步通信风格&#xff0c;组件之间通过产生和消费事件进行通信。 事件是表示系统中重大变化或事件的消息&#xff0c;并分发给感兴趣的组件。这种通信模型允许系统的不同部分之间进行解耦和动态交互。 组件充当事件…

MTK Android P Sensor架构(一)

需求场景&#xff1a; 本来如果只是给传感器写个驱动并提供能读取温湿度数据的节点&#xff0c;是一件比较轻松的事情&#xff0c;但是最近上层应用的同事要求我们按照安卓标准的流程来&#xff0c;这样他们就能通过注册一个服务直接读取传感器事件数据了。这样做的好处就是第…

从手工测试进阶中高级测试?如何突破职业瓶颈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、手工测试如何进…

【教3妹学编程-算法题】需要添加的硬币的最小数量

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到新闻&#xff0c; 有人中了2.2亿彩票大奖&#xff01; 2哥 : 看到了&#xff0c;2.2亿啊&#xff0c; 一生一世也花不完。 3妹&#xff1a;为啥我就中不了呢&#xff0c;不开心呀不开心。 2哥 : 得了吧&#xff0c;你又不买彩票&…

Vue 双向绑定:让数据与视图互动的魔法!(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

人体关键点检测3:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测

目录 1. 前言 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1a; 3.人体关键点检测模型训练 4.人体关键点检测模型Android部署 &#xff08;1&#xff09; 将Pytorch模型转换ONNX模型 &#xff08;2&#xff09; 将ONNX模型转换…

【JVM从入门到实战】(一) 字节码文件

一、什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。 JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 二、JVM的功能 解释和运行 对字节码文件中的指令&#xff0c;实时的解释成机器码&#xff0c;让计算机…

图论——二分图

图论——二分图 二分图通俗解释 有一个图&#xff0c;将顶点分成两类&#xff0c;边只存在不同类顶点之间&#xff0c;同类顶点之间设有边。称图 G 为二部图&#xff0c;或称二分图&#xff0c;也称欧图。 性质 二分图不含有奇数环图中没有奇数环&#xff0c;一定可以转换为二…

005、Softmax损失

之——softmax与交叉熵 杂谈 我们常用到softmax函数与交叉熵的结合作为损失函数以监督学习&#xff0c;这里做一个小小的总结。 正文 1.softmax的基本改进 所谓softmax就是在对接全连接层输出时候把输出概率归一化&#xff0c;最基础的就是这样&#xff1a; 效果就是这样&…

图文教程:stable-diffusion的基本使用教程 txt2img(多图)

之前我介绍了SD的安装过程&#xff0c;那么这篇将介绍怎么使用SD 使用模型 SD安装好之后&#xff0c;我们只有一个默认的模型。这个模型很难满足我们的绘图需求&#xff0c;那么有2种方法。 1是自己训练一个模型&#xff08;有门槛&#xff09;2是去网站上找一个别人练好的模…

算法通关村第四关—表达式问题(黄金)

表达式问题 一、计算器问题 计算器也是非常常见的问题&#xff0c;我们看一个中等问题。LeetCode227.给你一个字符串表达式s&#xff0c;请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。  你可以假设给定的表达式总是有效的。所有中间结果将在[-231,231…

关于Anaconda的安装和环境部署(此章专为新手制定)

目录 Anaconda简介 一、软件下载&#xff08;地址&#x1f447;&#xff09; 2&#xff1a;点击下载 3&#xff1a;版本选择&#xff1a; 4&#xff1a;Anaconda的安装包就下载完成了 2&#xff1a;恭喜你&#xff0c;看到这里已经完成安装了 三、部署环境 1&#xff1…