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

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

MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程:
MSPM0L1306例程学习-ADC部分(6)_第1张图片
今天讲的例程是adc12_window_comparator。这是ADC模块附带的一个功能,窗口比较器。在一些应用场景下,用户要在代码中对adc的转换结果进行判断,每次转换完成都与某个特定的值进行比较。窗口比较器把这个功能通过硬件进行了实现,不需要用户软件代码的参与,在条件满足时,直接生成相应的中断信号。简化了系统的设计,还可以降低功耗(用中断事件去驱动)。

例程的分析如下:

  1. AD的工作模式选择单通道 多次转换,使用MEM0,选择adc通道2 (PA25),这个可以根据实际需要进行修改的;
  2. 参考电压的选择上,直接使用了电源电压作为基准电压。
  3. 窗口比较器的设置,12位AD的转换结果满量程为4095. 上限值和下限值都设置为转换结果的一半,2047。
  4. PA0引脚连接有LED灯。
  5. 实验结果的观察。对通道2进行AD采样和转换,系统会自动根据转换结果进行LED的指示操作:
    a. 当转换结果小于2047时,触发窗口比较器下限中断,输出高电平,关闭LED;
    b. 当转换结果大于2047时,触发窗口比较器上限中断,输出低电平,点亮LED。

例程的配置如下:
MSPM0L1306例程学习-ADC部分(6)_第2张图片
MSPM0L1306例程学习-ADC部分(6)_第3张图片
MSPM0L1306例程学习-ADC部分(6)_第4张图片
MSPM0L1306例程学习-ADC部分(6)_第5张图片
MSPM0L1306例程学习-ADC部分(6)_第6张图片
MSPM0L1306例程学习-ADC部分(6)_第7张图片

代码的简单注释如下:

/*
 * ADC转换的SDK例程
 * 文件名:adc12_window_comparator.c
 * 描述:
 *   ADC模块的窗口比较器的功能演示。
 *   1、单通道、多次转换、自动采样模式、软件触发;
 *   2、使用MEM0,选择ADC通道2(PA25),直接使用电源电压作参考电压
 *   3、12位AD的转换结果满量程为4095. 上限值和下限值都设置为转换结果的一半,2047
 *   4、PA0引脚连接有LED灯;
 *   5、对通道2进行AD采样和转换,系统会自动根据转换结果进行LED的指示操作:
 *     a.当转换结果小于2047时,触发窗口比较器下限中断,输出高电平,关闭LED
 *     b.当转换结果大于2047时,触发窗口比较器上限中断,输出低电平,点亮LED
 *
 * 操作描述:
 *   1、下载程序,全速运行;
 *   2、测量通道2(PA25)的输入电压,偷懒点,输入可直接接3.3V或者Gnd;
 *   3、查看板卡上LED灯的状态
 * 注意事项:
 *   1、AD输入的引脚不要错接5V电压,会烧坏引脚;
 *
 * 思考:
 *   暂无。
 *
 * 修改:
 *   基于官方的sdk例程增加注释,[email protected]
 *
 */

#include "ti_msp_dl_config.h"

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

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

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

    //允许从SLEEP模式中退出
    DL_SYSCTL_enableSleepOnExit();

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

你可能感兴趣的:(MSPM0L1306,TI,MSPM0,MCU,学习,单片机,嵌入式硬件)