MSPMOG3507学习记录(个人记录5)

ADC学习

目的:参加电赛,学习记录,创作者的视角来学习。

使用芯片:LP-MSPM0G3507

工具:ccs

学习例程:adc12_single_conversion

  1. 在syscfg中配置

(ADC2的配置)

(1)名称和预设

(2)基础设置:

时钟选择:一般选ULPCLK

时钟频率:

分频:

分频后得到的时钟频率:

转换模式:一个是Single,为单一转换,只测量一个引脚的值

一个 Sequence,序列转换。多个通道的测量时。

从那一个开始测量(测量哪一个)

重复模式:(一般不需要用)

自动或手动模式

开始转换(以软件开始还是事件开始)

保存在那一个Memory内存中:

关系绑定

选择参考电压

选择时钟源:

(3)高级进一步设置:

精度选择:

采样启动模式选择:Manual为手动开启

采样采样时间:

(4)中断配置:

(5)引脚配置:

可以选择

  1. 补充:在多路采样中的配置:

    由于是多路测量:选择Sequence,从0开始到3测量4个引脚。

    相应的设置4个存储,并设置每一个存储。

    由于采样到最后一个结束,所以只需要开启中断3就可以。

    由于采样如果同时用到ADC0和ADC1。要加一个组再配置。

  2. 主程序代码编写

  3. DL_ADC12_startConversion();//启动ADC12转换
  4. DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_3); 返回所选内存索引的转换结果

所给例程代码的个人解读: 

单路读取:

#include "ti_msp_dl_config.h"//头文件
volatile bool gCheckADC;//定义全局变量,bool布尔类型。
volatile uint16_t gAdcResult;//定义全局变量。uint16_t为16位无符号整数型。
//volatile 防止变量被优化编译。
int main(void)
{
    SYSCFG_DL_init();//初始化

    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);//  NVIC_EnableIRQ()使能中断
    gCheckADC = false;//赋值

    while (1) {
        DL_ADC12_startConversion(ADC12_0_INST);//开始ADC转换

        while (false == gCheckADC) {
          //  __WFE();//等待事件。该语句一般不用
        }

        gAdcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);//

        if (gAdcResult > 0x7ff) //判断
        {
            DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            //DL_GPIO_clearPins()清零引脚
            
        } 
        else
         {
            DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);

            //DL_GPIO_setPins()置1引脚
        }
        gCheckADC = false;//保证循环
        DL_ADC12_enableConversions(ADC12_0_INST);//开启转换,保证循环
    }
}

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

 多路读取代码

#include "ti_msp_dl_config.h"

volatile bool gCheckADC;//定义全局变量,为布尔类型

#define RESULT_SIZE (64)
volatile uint16_t gAdcResult0[RESULT_SIZE];
volatile uint16_t gAdcResult1[RESULT_SIZE];
volatile uint16_t gAdcResult2[RESULT_SIZE];
volatile uint16_t gAdcResult3[RESULT_SIZE];
//定义16位的无符号
int main(void)
{
  
    SYSCFG_DL_init();//syscfg初始化配置
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);//使能中断

    gCheckADC  = false;
    uint16_t i = 0;

    while (1) {
        DL_ADC12_startConversion(ADC12_0_INST);//启动ADC12转换
        while (gCheckADC == false) {
            __WFE();//等待事件
        }

       
        gAdcResult0[i] =
            DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
        gAdcResult1[i] =
            DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_1);
        gAdcResult2[i] =
            DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_2);
        gAdcResult3[i] =
            DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_3);
//DL_ADC12_getMemResult()返回所选内存索引的转换结果,并赋值
//多路同时读取
        i++;
        gCheckADC = false;
       
        if (i >= RESULT_SIZE) {
            __BKPT(0);//程序断点
            i = 0;
        }
        else{

        }
        DL_ADC12_enableConversions(ADC12_0_INST);
    }
}


void ADC12_0_INST_IRQHandler(void)//中断服务函数
{
    switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
    //获得最高优先级的待处理 ADC12 中断。
//检查是否有任何 ADC12 中断处于挂起状态。不必事先启用中断。
     {
        case DL_ADC12_IIDX_MEM3_RESULT_LOADED:
            gCheckADC = true;
            break;
        default:
            break;
    }
}

 

自己编写代码

读取一个引脚数据:single

#include "ti_msp_dl_config.h"//头文件
volatile bool ADC_Flag;//定义全局变量,布尔类型
volatile uint16_t ADC_Val;//定义全局变量,16位无符号整数型

int main(void)
{
    SYSCFG_DL_init();//syscfg初始化配置
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);//中断使能开启


    while (1) {
        ADC_Flag=false;
        DL_ADC12_startConversion(ADC12_0_INST);//开启转换
        while(ADC_Flag==false);//等待,空循环
        ADC_Val= DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
        // DL_ADC12_getMemResult返回所选内存索引的转换结果。并赋值给ADC_Val
        DL_ADC12_enableConversions(ADC12_0_INST);
        //启用 ADC12 转换,便于循环
    }
}

void ADC12_0_INST_IRQHandler (void)//中断服务函数程序
{
     switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) 
    {
        case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
          ADC_Flag  = true;
            break;
        default:
            break;
    }
}

 读取两路数据在同一组ADC0中:

#include "ti_msp_dl_config.h"

volatile bool ADC_Flag;
volatile uint16_t ADC_Val0;
volatile uint16_t ADC_Val1;


int main(void)
{
    SYSCFG_DL_init();
   NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN );
    while (1) {
        ADC_Flag=false;
        DL_ADC12_startConversion(ADC12_0_INST);//启动ADC12转换
       while (ADC_Flag == false) ;
       ADC_Val0=DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
       ADC_Val1=DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_1);
       DL_ADC12_enableConversions(ADC12_0_INST);
        }

    
}
void ADC12_0_INST_IRQHandler (void)
{
 switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST ))
    //获得最高优先级的待处理 ADC12 中断。
     {
        case DL_ADC12_IIDX_MEM1_RESULT_LOADED:
          ADC_Flag= true;
        
            break;
        default:
            break;
    }

}

 

作者:桂三岁

物联沃分享整理
物联沃-IOTWORD物联网 » MSPMOG3507学习记录(个人记录5)

发表回复