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

news2025/1/23 7:08:15

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

MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程:
在这里插入图片描述
今天接着讲2个例程,adc12_triggered_by_timer_event和adc12_triggered_by_timer_event_stop,这两个例程都是使用定时器事件去触发ADC转换。两个例程的概述如下:

第一个例程:adc12_triggered_by_timer_event

  1. LFCLK=32kHz,MCLK=ULPCLK=CPUCLK=ADCCLK=32MHz
  2. ADC工作在序列通道、单次转换模式、自动采样、事件触发(定时器);
  3. 使用MEM0~MEM4,都选择ADC通道2(PA25),直接使用电源电压作参考电压;
  4. 采样时长分别采用采样定时器0和采样定时器1 ,采样定时器0设置为25us,采样定时器1设置为12.5us;
  5. 定义订阅定时器事件; 定时器0触发ADC
  6. 定时器工作在单次模式下,周期为1.125s,并定义发布事件1; *
  7. 只转换1回,结果存放到数组gADCResult[]中;
  8. 代码中设有断点语句__BKPT(0),会自动进入断点,查看数据;

第二个例程:adc12_triggered_by_timer_event_stop

  1. LFCLK=32kHz,MCLK=ULPCLK=CPUCLK=ADCCLK=32MHz
  2. ADC工作在单通道、多次转换模式、自动采样、事件触发(定时器);
  3. 使用MEM0,选择ADC通道2(PA25),直接使用电源电压作参考电压;
  4. 采样时长采用采样定时器1,设置为25us;
  5. 启用窗口比较器的功能: 12位AD的转换结果满量程为4095。上限值和下限值都设置为1.5v对应的转换结果ADC12_MONITOR_VALUE 这些值是在代码中设定的,没有在sysconfig图形配置工具中完成;
  6. 定义订阅定时器事件; 定时器0触发ADC
  7. 定时器工作在周期模式下,周期为1s,并定义发布事件1;
  8. PA0引脚连接有LED灯;
  9. 对通道2进行AD采样和转换,系统会自动根据转换结果进行LED的指示操作:
    a.当转换结果小于ADC12_MONITOR_VALUE时,触发窗口比较器下限中断,输出高电平,关闭LED
    b.当转换结果大于ADC12_MONITOR_VALUE时,触发窗口比较器上限中断,输出低电平,点亮LED

第1个例程具体的配置和分析如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第1个例程的注解如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_triggered_by_timer_event.c
 * 描述:
 *   ADC模块的事件触发功能演示。
 *   1、LFCLK=32kHz,MCLK=ULPCLK=CPUCLK=ADCCLK=32MHz
 *   2、ADC工作在序列通道、单次转换模式、自动采样、事件触发(定时器);
 *     使用MEM0~MEM4,都选择ADC通道2(PA25),直接使用电源电压作参考电压;
 *   3、采样时长分别采用采样定时器0和采样定时器1
 *     采样定时器0设置为25us,采样定时器1设置为12.5us;
 *   4、定义订阅定时器事件; 定时器0触发ADC
 *   5、定时器工作在单次模式下,周期为1.125s,并定义发布事件1;
 *   6、只转换1回,结果存放到数组gADCResult[]中;
 *   7、代码中设有断点语句__BKPT(0),会自动进入断点,查看数据;
 *
 * 操作描述:
 *   1、下载程序;
 *   2、添加观察变量gADCResult,全速运行;
 *   3、系统会自动停在断点处,查看ADC的采样结果值;
 *
 * 注意事项:
 *   1、ADC的结果的读取就一次,没有在while(1)循环里
 *
 * 思考:
 *   1、为什么要区分采样定时器0和采样定时器1?有特别的意义吗?还是,只是想演示下功能配置
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */
#include "ti_msp_dl_config.h"

//标志变量,ADC的转换结果是否已经传输完成;
volatile bool gCheckADC;

//定义16位的数组来存放ADC的转换结果.
volatile uint16_t gADCResult[4];

int main(void)
{
    //SysConfig图形配置工具初始化配置函数
    SYSCFG_DL_init();

    //使能ADC12的中断
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

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

    //启动定时器
    DL_TimerG_startCounter(TIMER_0_INST);

    while (false == gCheckADC)
    {
        //等待结果存储寄存器MEM3加载新数据
        __WFE();
    }

    //读取结果存储寄存器MEM0、MEM1、MEM2、MEM3的数据,存放到数组中
    gADCResult[0] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
    gADCResult[1] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_1);
    gADCResult[2] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_2);
    gADCResult[3] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_3);

    //断点语句,程序运行到此处会自动进入断点,可查看ADC的转换结果
    __BKPT(0);

    while (1)
    {
        __WFI();
    }
}

/*
 * ADC12中断处理函数
 * 通过转换结果存储寄存器MEM3加载新数据中断来判断ADC转换结束
 *
 */
void ADC12_0_INST_IRQHandler(void)
{
    switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
    {
        case DL_ADC12_IIDX_MEM3_RESULT_LOADED:
            gCheckADC = true;
            break;
        default:
            break;
    }
}

第2个例程具体的配置和分析如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第2个例程的注解如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_triggered_by_timer_event_stop.c
 * 描述:
 *   ADC模块的事件触发功能演示。
 *   1、LFCLK=32kHz,MCLK=ULPCLK=CPUCLK=ADCCLK=32MHz
 *   2、ADC工作在单通道、多次转换模式、自动采样、事件触发(定时器);
 *     使用MEM0,选择ADC通道2(PA25),直接使用电源电压作参考电压;
 *     采样时长采用采样定时器1,设置为25us;
 *   4、启用窗口比较器的功能:
 *     12位AD的转换结果满量程为4095. 上限值和下限值都设置为1.5v对应的转换结果ADC12_MONITOR_VALUE
 *     这些值是在代码中设定的,没有在sysconfig图形配置工具中完成;
 *   3、定义订阅定时器事件; 定时器0触发ADC
 *   4、定时器工作在周期模式下,周期为1s,并定义发布事件1;
 *   5、PA0引脚连接有LED灯;
 *   6、对通道2进行AD采样和转换,系统会自动根据转换结果进行LED的指示操作:
 *     a.当转换结果小于ADC12_MONITOR_VALUE时,触发窗口比较器下限中断,输出高电平,关闭LED
 *     b.当转换结果大于ADC12_MONITOR_VALUE时,触发窗口比较器上限中断,输出低电平,点亮LED
 *
 * 操作描述:
 *   1、下载程序,全速运行;
 *   2、测量通道2(PA25)的输入电压,偷懒点,输入可直接接3.3V或者Gnd;
 *   3、查看板卡上LED灯的状态
 * 注意事项:
 *   1、AD输入的引脚不要错接5V电压,会烧坏引脚;
 *
 * 思考:
 *   1、暂无
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

/*
 * 下边这段宏定义的作用:
 * 通过宏定义的方式,自动计算出某个电压值对应的ADC转换结果计算式ADC12_MONITOR_VALUE
 * 即根据目标电压,反算ADC转换的结果数值;
 *
 * ADC12_BIT_RESOLUTION位AD的最大量程值:  (1 << ADC12_BIT_RESOLUTION) --》12位的AD,2的12次方;
 * ADC12_MONITOR_VOLTAGE / ADC12_REF_VOLTAGE : 目标电压和参考电压的比值
 * 两者相乘,就自动计算出 目标电压对应的ADC转换的结果数值;
 */
#define ADC12_BIT_RESOLUTION (12)
#define ADC12_REF_VOLTAGE (3.3)
#define ADC12_MONITOR_VOLTAGE (1.5)
#define ADC12_MONITOR_VALUE \
    ((1 << ADC12_BIT_RESOLUTION) * (ADC12_MONITOR_VOLTAGE / ADC12_REF_VOLTAGE))

int main(void)
{
    //SysConfig图形配置工具初始化配置函数
    SYSCFG_DL_init();

    //配置窗口比较器的限值,上下限都设置为ADC12_MONITOR_VALUE
    DL_ADC12_configWinCompHighThld(ADC12_0_INST, (uint16_t) ADC12_MONITOR_VALUE);
    DL_ADC12_configWinCompLowThld(ADC12_0_INST, (uint16_t) ADC12_MONITOR_VALUE);

    //使能ADC12的中断
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
    //启动定时器
    DL_TimerG_startCounter(TIMER_0_INST);

    while (1)
    {
        __WFI();
    }
}

/*
 * ADC12中断处理函数
 * 窗口比较器的上限、下限中断
 * --高于上限值,输出低电平,点亮LED;
 * --低于下限值,输出高电平,关闭LED
 *
 */
void ADC12_0_INST_IRQHandler(void)
{
    switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
    {
        case DL_ADC12_IIDX_WINDOW_COMP_HIGH:
            DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            break;
        case DL_ADC12_IIDX_WINDOW_COMP_LOW:
            DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            break;
        default:
            break;
    }
}

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

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

相关文章

qt中信号槽第五个参数

文章目录 connent函数第五个参数的作用自动连接(Qt::AutoConnection)直接连接(Qt::DirectConnection - 同步)同线程不同线程 队列连接(Qt::QueuedConnection - 异步)同一线程不同线程 锁定队列连接(Qt::BlockingQueuedConnection) connent函数第五个参数的作用 connect(const …

软件开发新手用哪个IDE比较好?软件开发最好的IDE都在这!

目录 IDES 的优点 最佳编程 IDE 列表 Java 开发的流行集成开发环境 JetBrains 的 IntelliJ IDEA NetBeans 适用于 C/ C、C# 编程语言的最佳 IDE Visual Studio 和 Visual Studio 代码 Eclipse PHP 开发的最佳 IDE PHPStorm Sublime Text Atom JavaScript 的顶级 I…

线程数据共享和安全 -ThreadLocal

什么是 ThreadLocal ThreadLocal 的作用&#xff0c;可以实现在同一个线程数据共享, 从而解决多线程数据安全问题. 2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]ThreadLocal 可以像 Map 一样存取数据&#xff0c;key 为当前线程, get 方…

4.25 构建onnx结构模型-Split

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Slice 结点进行分析 方式 方法一…

DL Homework 13

目录 编程实现优化算法&#xff0c;并3D可视化 1. 函数3D可视化 2.加入优化算法&#xff0c;画出轨迹 3.复现CS231经典动画 4.结合3D动画&#xff0c;用自己的语言&#xff0c;从轨迹、速度等多个角度讲解各个算法优缺点 5.总结 编程实现优化算法&#xff0c;并3D可视化 …

语义分割的应用及发展

语义分割(Semantic Segmentation)是一种计算机视觉领域的任务&#xff0c;旨在将一张图像中的每一个像素都分配一个语义标签&#xff0c;即将图像中的每个物体区域进行精确的分类划分。例如&#xff0c;在一张街景图中&#xff0c;语义分割可以将人、车、路、天空等每个像素分别…

java方法(method)概述,计算机中的执行原理及案例

引言&#xff1a; 学习了方法&#xff08;method&#xff09;&#xff0c;整理下心得 概述&#xff1a; 1&#xff0c;什么是方法&#xff08;method&#xff09;: 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复利用 2&#xff0c;使用…

排序整形数组--------每日一题

大家好这是今年最后的一篇了&#xff0c;感谢大家的支持&#xff0c;新的一年我会更加努力地。 文章目录 目录 文章目录 题⽬描述&#xff1a; 输⼊10个整数&#xff0c;然后使⽤冒泡排序对数组内容进⾏升序排序&#xff0c;然后打印数组的内容 一、题目解读 冒泡排序是⼀种基础…

波特云 集装箱和 海恒蓝 集装箱 自动化集装箱下单方案

背景&#xff1a; 这几天 遇到了一个客户 是做外贸的 需要大量多的集装箱&#xff0c;了解后 他们是需要在平台上 下单集装箱 才有可能预约到集装箱使用&#xff0c;所以公司每天都需要都需要派个人 盯着电脑来 下单集装箱。 波特云 网站&#xff1a;https://www.eportyun.com…

react18框架笔记

React React 是 facebook 出的一款针对视图层的库(library)。它是基于单向数据流思想开发的&#xff0c;主要的一个功能就是针对视图显示&#xff0c;让我们把一个项目拆分成一个一个组件进行开发维护。 官网 目前我们讲的 react 是基于 18.2 的版本。react 每一个版本更新之…

Apollo自动驾驶:从概念到现实的里程碑

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo Client2. Apollo Server3. Apollo Federation4. Apollo Tracing5. Apollo Codegen6. Apollo Link7. 其他工具和框架结论 &#x1f680;&#x1f…

vue+ts element-plu是页码器根据屏幕宽度变化,解决刷新后初始化值问题

实现思路&#xff1a;组件挂载后执行初始化操作&#xff0c;初始化添加事件监听器&#xff0c;当浏览器窗口大小发生变化时会调用这个函数handleResize <el-pagination v-model:current-page"currentPage" background :total"total" layout"prev,…

vue3框架笔记

Vue Vue 是一个渐进式的前端开发框架&#xff0c;很容易上手。Vue 目前的版本是 3.x&#xff0c;但是公司中也有很多使用的是 Vue2。Vue3 的 API 可以向下兼容 2&#xff0c;Vue3 中新增了很多新的写法。我们课程主要以 Vue3 为主 官网 我们学习 Vue 需要转变思想&#xff0…

激光 GPS 卫星实现无边界精度

GPS 卫星领域已经发生了重大创新&#xff0c;将变得更加精确和强大。我们正在谈论激光后向反射器阵列&#xff08; LRA&#xff09;的发展。 这些可以精确跟踪地球的形状、自转和环境变化&#xff0c;从而扩展卫星的能力。 GPS卫星的主要用途是确定各种情况下的位置&#xff…

亚信安慧AntDB数据库两项目分别入选2023“星河”标杆、优秀案例

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织的第七届大数据“星河&#xff08;Galaxy&#xff09;”案例评选结果公示&#xff0c;亚信安慧AntDB数据库两项目入选&#xff0c;其中“基于Ant…

windows server 2022 启用SYN攻击保护

2023.12.28 SYN攻击是什么&#xff1a; SYN攻击是黑客攻击的常用手段&#xff0c;也是最容易被利用的一种攻击手法&#xff0c;属于DDoS攻击的一种。它利用TCP协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费CPU和内存资源。 SYN攻击包括大量TCP连接的第一个包&…

【Proteus仿真】【Arduino单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈…

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

新手快速上手掌握基础排序<二>快速排序快速入门

目录 引言 一&#xff1a;快速排序qsort的简介 1.qsort是一个库函数 2.库函数的查询了解方法 3.qsort的具体使用方法 4.qsort函数使用的一些注意点 5.qsort函数的特点 6.代码实现 (1)整数数组的快速排序 &#xff08;2&#xff09;结构体的快速排序&#xff08;学…

Java多线程的生命周期,同步互斥锁机制(Lock,synchronized)

目录 1.线程的生命周期2.线程的同步1.同步代码块2.同步方法 3.Lock锁4.生产者与消费者问题1.常见方法2.等待唤醒机制的代码实现 5.阻塞队列 1.线程的生命周期 Java虚拟机中线程分为六个状态&#xff0c;转换关系如下&#xff1a; ①新建 ②就绪 ③阻塞 ④终止 ⑤等待 ⑥计时等待…