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

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

MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程:
在这里插入图片描述
前边讲了4个例程,今天接着讲2个例程,通过DMA进行进行ADC转换结果的传输,其中一个例程是12位的分辨率,另一个例程是8位的分辨率。 两个例子的简单比较如下:

  1. 在AD的工作模式都选择了单通道 多次转换的工作模式,选择adc通道2(PA25),这个可以根据实际需要进行修改的;
  2. 参考电压的选择上,都直接使用了电源电压作为基准电压。 要特别注意,如果使用内部参考电压源,那么ADC的时钟上限为4MHz。
  3. 有个采样保持时间,通过定时计数器0或者1来设置。这个跟ADC的分辨率有关,具体可以查看手册,里边有个公式计算。12位分辨率,例程里是250ns;8位分辨率,例程设置的是62.5ns。
  4. 启用了FIFO寄存器,是一个32位的寄存器,将从这个寄存器读取ADC的转换结果。因为是32位的,所以会将两次的转换结果存放在一起。所以,如果转换了1000次,实际上只要读500次,因为每次能读取两个结果。目前是这么理解的,有错的话,后续再回来更正:)
  5. 需要重点理解的是,DMA触发的相关配置。
    a. DMA Samples Count,一次DMA触发要传输的ADC转换结果数;
    b. Enable DMA Triggers, 配置可以触发DMA进行传输的触发源。

第1个例程的注解如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
下边这一页的配置要重点理解下,总感觉例程有不是很合理的地方~
在这里插入图片描述
在这里插入图片描述
代码简单注释如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_max_freq_dma.c
 * 描述:
 *   ADC转换使用DMA来传输结果,12位分辨率。
 *   1、单通道、多次转换、自动采样模式、软件触发;
 *   2、启用FIFO,选择ADC输入通道2(PA25)
 *   3、直接使用电源电压做参考电压
 *   4、转换ADC_SAMPLE_SIZE=1024次,将通过DMA存放到数组gADCSamples[]中;
 *   5、代码中设有断点语句__BKPT(0),会自动进入断点,查看数据;
 *
 * 操作描述:
 *   1、下载程序;
 *   2、添加观察变量gADCSamples,全速运行;
 *   3、系统会自动停在断点处,查看ADC的采样结果值;
 *
 * 注意事项:
 *   1、注意系统时钟的配置,ADC的时钟为32MHz
 *   2、在SYSCONFIG图形配置工具中并没有完成所有的参数配置;
 *     部分的参数配置,在主程序通过调用库函数的形式进行重新配置;
 *   3、不能使用内部参考电压源VREF,启用内部电压,ADC时钟限制为4MHz;
 *
 * 思考:
 *   1、程序只跑一遍,如果想要不断的执行,while(1)循环应该怎么修改?
 *   2、如果没有外部电压接入PA25, 把ADC的通道换成A15,内部源监控通道,VDD/3,数据比较规律?
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

//宏定义了ADC的转换次数
#define ADC_SAMPLE_SIZE (1024)

//当启用FIFO时,2个转换结果会被压缩为一个32位存放在FIFODATA寄存器
//所以,读取FIFO的次数要减半,右移一位
#define ADC_FIFO_SAMPLES (ADC_SAMPLE_SIZE >> 1)

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

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

int main(void)
{
    //器件初始化
    SYSCFG_DL_init();

    //DMA的基本工作模式在SYSCONFIG里已经配置;
    //此处配置DMA的传输通道信息,一般要配置3个参数,从哪搬到哪,搬多少
    //1、源地址, FIFODATA寄存器的地址,从这个寄存器读取数据往外搬
    //2、目的地址, 存档转换结果的数组的起始地址, 直接将数据搬到数组中
    //3、传输大小,要搬运的次数
    DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t) DL_ADC12_getFIFOAddress(ADC12_0_INST));
    DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);
    DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);

    DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);

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

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

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

    //等待ADC12的转换完成标志位变为true,该标志在中断里设置
    while (false == gCheckADC)
    {
        __WFE();
    }

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


    while (1)
    {
        __WFI();
    }
}

/*
 * ADC12中断处理函数
 * 通过DMA传输完成中断来判断ADC转换结束
 *
 */

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

第2个例程的注解如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码简单注释如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_max_freq_dma_8bit.c
 * 描述:
 *   ADC转换使用DMA来传输结果,8位分辨率
 *   1、单通道、多次转换、自动采样模式、软件触发;
 *   2、启用FIFO,选择ADC输入通道2(PA25)
 *   3、直接使用电源电压做参考电压
 *   4、转换ADC_SAMPLE_SIZE=1024次,将通过DMA存放到数组gADCSamples[]中;
 *   5、代码中设有断点语句__BKPT(0),会自动进入断点,查看数据;
 *
 * 操作描述:
 *   1、下载程序;
 *   2、添加观察变量gADCSamples,全速运行;
 *   3、系统会自动停在断点处,查看ADC的采样结果值;
 *
 * 注意事项:
 *   1、注意ADC的时钟选择SYSOSC,工作在32MHz
 *   2、在SYSCONFIG图形配置工具中并没有完成所有的参数配置;
 *     部分的参数配置,在主程序通过调用库函数的形式进行重新配置;
 *   3、不能使用内部参考电压源VREF,启用内部电压,ADC时钟限制为4MHz;
 *
 * 思考:
 *   1、代码有一定的优化空间.例如,两个中断里的标志没有具体区分开来
 *
 * 修改:
 *   基于官方的sdk例程增加注释,xie_sx@126.com
 */

#include "ti_msp_dl_config.h"

#define ADC_SAMPLE_SIZE (1024)

//当启用FIFO时,2个转换结果会被压缩为一个32位的数据存放在FIFODATA寄存器
#define ADC_FIFO_SAMPLES (ADC_SAMPLE_SIZE >> 1)

uint16_t gADCSamples[ADC_SAMPLE_SIZE];

volatile bool gCheckADC;
volatile bool gADCError;

int main(void)
{
    //器件初始化
    SYSCFG_DL_init();

    //DMA的基本工作模式在SYSCONFIG里已经配置;
    //此处配置DMA的传输通道信息,一般要配置3个参数,从哪搬到哪,搬多少
    //1、源地址, FIFODATA寄存器的地址,从这个寄存器读取数据往外搬
    //2、目的地址, 存档转换结果的数组的起始地址, 直接将数据搬到数组中
    //3、传输大小,要搬运的次数。 放到了while(1)循环中
    DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t) DL_ADC12_getFIFOAddress(ADC12_0_INST));
    DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);

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

    gCheckADC = false;
    gADCError = false;

    while (1)
    {
        DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);

        DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
        DL_ADC12_enableDMA(ADC12_0_INST);
        DL_ADC12_startConversion(ADC12_0_INST);

        //查询ADC是否处于忙状态。
        //在单通道多次转换的模式下,一旦ADC被触发,无论转换是否停止,ADC将继续采样,直到完成相应次数的转换
        //??需要进一步探讨下,这个语句的具体作用
        if (DL_ADC12_STATUS_CONVERSION_ACTIVE == DL_ADC12_getStatus(ADC12_0_INST))
        {
            DL_ADC12_stopConversion(ADC12_0_INST);
        }

        while ((false == gCheckADC) && (false == gADCError))
        {
            //只有两个条件都满足,才在这里等待
            __WFE();
        }

        //为什么要先禁用,有启用? 感觉没必要??
        DL_ADC12_disableConversions(ADC12_0_INST);
        DL_ADC12_enableConversions(ADC12_0_INST);

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

        gCheckADC = false;
        gADCError = false;
    }
}

/*
 * ADC12中断处理函数
 *
 */

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

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

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

相关文章

透明加密 | 半透明加密 \ 智能加密的区别

透明加密、半透明加密和智能加密都是数据加密技术,但它们在应用方式、加密效果和使用场景上存在一些区别。 PC端访问地址: www.drhchina.com 透明加密: 透明加密是一种强制加密技术,它通过文件过滤驱动透明加解密技术进行文件加…

Ubuntu 常用命令之 unzip 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 unzip命令在Ubuntu系统中用于解压缩.zip文件。它可以解压缩一个或多个.zip文件,并将文件解压缩到当前目录或指定的目录。 unzip命令的一般格式 unzip [选项] zipfile [file...]其中,zipfile是要解压的.zi…

运动器材设备企业官网的效果如何

运动器材在生活中的应用非常广泛,比如健身馆、公司休闲、学校、小区公园等场景中看到,运动器材设施品牌与种类多而齐全,在市场中占据着一定份额,同时该行业设备一般属于低价多量批发及高价零售形式,覆盖的行业较广。 1…

基于WEB的开放性实验室管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本开放性实验室管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

独立搭建UI自动化测试框架分享

今天给大家分享一个seleniumtestngmavenant的UI自动化,可以用于功能测试,也可按复杂的业务流程编写测试用例,今天此篇文章不过多讲解如何实现CI/CD,只讲解自己能独立搭建UI框架,如果有其他好的框架也可以联系我&#x…

easyexcel复杂表头导出

easyexcel复杂表头导出 /*** ClassName ColumnWidthStyleStrategy* Description: excel导出列长度**/ public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {private static final int MAX_COLUMN_WIDTH 200;private final Map<Integer, Map…

[每周一更]-(第34期):Go泛型的理解和使用

泛型的实现方式有很多种&#xff0c;Go 1.18版本引入的泛型实现方式是通过type参数实现的。 在之前的Go版本中&#xff0c;由于语言本身的限制&#xff0c;泛型一直是Go语言的一个痛点和缺陷。程序员通常会使用接口和类型断言来实现泛型&#xff0c;但这种方法有时会导致代码难…

哪些行业装配柔性线路板 (FPC)时用到UV胶水?

柔性线路板&#xff08;FPC&#xff09;因其可弯曲和轻薄的特性&#xff0c;在多种行业和应用中都有广泛的应用。以下是一些常见的行业和场景&#xff0c;它们在装配FPC时可能使用UV胶水&#xff1a; 1.电子产品制造&#xff1a; 移动设备&#xff1a;如智能手机、平板电脑和可…

在线短信变量批量编辑工具

1.打开网站 短信编辑工具 2.点击:下载模板 3.编辑后 导入表格 4.点击合成短信 5.选中后复制 ctrlc 初衷&#xff1a; 短信变量批量编辑工具是一种用于批量编辑短信变量的工具。短信变量指的是短信中的可变部分&#xff0c;比如姓名、日期、金额等内容。 使用这个工具&…

python学习笔记--异常捕获

异常场景 numinput("input you number:") n9000 try:resultn/int(num)print({} 除以num 结果为{}.format(n,result)) except ZeroDivisionError as err:print("0不可以作为除数&#xff0c;出现报错{}".format(err)) except ValueError as err:print(&quo…

基于物联网云平台的大棚温湿度监控系统

我国是农业大国&#xff0c;农业生产的质量对我国具有非常重要的意义&#xff0c;受到数字化技术的重点支持&#xff0c;但仍未完全实现智能化&#xff0c;农业生产效率仍有提升空间。 將物联网云服务应用到农业环境的监控中来&#xff0c;可以更高效地管理环境状况。贝尔智能…

Jmeter压力测试简单教程(包括服务器状态监控)

前段时间公司需要对服务器进行压力测试&#xff0c;包括登录前的页面和登录后的页面&#xff0c;主要目的是测试负载均衡的实现效果。不知道是不是因为Jmeter不如loadRunner火爆还是什么&#xff0c;网上关于Jmeter的资料有很多但是大多千篇一律&#xff0c;要么简单弄个页面测…

数据结构学习 leetcode64最小路径和

动态规划 题目&#xff1a; 建议看这里&#xff0c;有这道题详细的解析。我觉得写的挺好。 这是我在学动态规划的时候&#xff0c;动手做的一道题。 虽然我在学动态规划&#xff0c;但是我之前学了dps&#xff0c;所以我就想先用dps试着做&#xff0c;结果发现不行&#xf…

百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心&#xff0c;体验不错&#xff0c;有小伙伴也对搭建自己的对话机器人比较兴趣&#xff0c;今天通过Python来简单介绍下&#xff0c;如何调用百川大模型的API来构建自己的小产品。 在开发环境中安装Python&#xff0c;如何安装&#xff1f;参照网…

全网最细,Jmeter性能测试-入门级接口压测思路,一文打通...

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

Nodejs 第三十章(防盗链)

防盗链&#xff08;Hotlinking&#xff09;是指在网页或其他网络资源中&#xff0c;通过直接链接到其他网站上的图片、视频或其他媒体文件&#xff0c;从而显示在自己的网页上。这种行为通常会给被链接的网站带来额外的带宽消耗和资源浪费&#xff0c;而且可能侵犯了原始网站的…

整数比较1 C语言xdoj93

描述&#xff1a; 编写程序&#xff0c;对于从键盘输入的2个整数&#xff0c;先输出较大者的个位数字&#xff0c;然后输出较小者的平方值。 输入说明&#xff1a; 输入的两个整数之间以一个空格分隔。 输出说明&#xff1a; 在一行上输出两个整数&#xff0c;整数之间以一个空…

将qt程序注册成服务

将qt程序注册成服务 1、qt服务模块管理下载 qt-solutions 2、QtService项目 2.1、将qtservice拷贝到项目代码路径 2.2、实现服务管理 PS&#xff1a;响应服务的启停 CustomService.h #include <QCoreApplication> #include "qtservice.h"class CustomSer…

上市公司-客户、供应商集中度(2000-2022年)

参考《中国工业经济》中吴安兵&#xff08;2023&#xff09;、《上海财经大学学报》中邱保印&#xff08;2023&#xff09;的做法&#xff0c;以客户集中度和供应商集中度之和衡量企业供应链集中度 其中客户集中度以前五名客户产生的营业收入占比衡量&#xff0c;供应商集中度…

好物设计- 实现区域图片变化自动截图

工具–Py即可 重点怎么获取窗口句柄? 使用 spyxx 可以获得句柄 (相当一个窗口的ID,无论窗口怎么变化ID不变我们都可以找到该窗口的详细信息) 替换句柄就可以,也可以不用句柄之间改截图区域 实战图片 import pygetwindow as gw import pyautogui import time import numpy a…