MSPMOG3507学习记录(个人记录5)
ADC学习
目的:参加电赛,学习记录,创作者的视角来学习。
使用芯片:LP-MSPM0G3507
工具:ccs
学习例程:adc12_single_conversion
-
在syscfg中配置
(ADC2的配置)
(1)名称和预设
(2)基础设置:
时钟选择:一般选ULPCLK
时钟频率:
分频:
分频后得到的时钟频率:
转换模式:一个是Single,为单一转换,只测量一个引脚的值
一个 Sequence,序列转换。多个通道的测量时。
从那一个开始测量(测量哪一个)
重复模式:(一般不需要用)
自动或手动模式
开始转换(以软件开始还是事件开始)
保存在那一个Memory内存中:
关系绑定
选择参考电压
选择时钟源:
(3)高级进一步设置:
精度选择:
采样启动模式选择:Manual为手动开启
采样采样时间:
(4)中断配置:
(5)引脚配置:
可以选择
-
补充:在多路采样中的配置:
由于是多路测量:选择Sequence,从0开始到3测量4个引脚。
相应的设置4个存储,并设置每一个存储。
由于采样到最后一个结束,所以只需要开启中断3就可以。
由于采样如果同时用到ADC0和ADC1。要加一个组再配置。
-
主程序代码编写
-
- DL_ADC12_startConversion();//启动ADC12转换
-
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;
}
}
作者:桂三岁