MSP430_内部AD精讲
- 格式:ppt
- 大小:2.11 MB
- 文档页数:41
一张图看懂MSP430单片机之ADC原创一,基础知识ADC即Analog to Digital Converter模数转换,把模拟信号进行量化,转换为数字量。
对于软件工程师来说,ADC内部的转换原理可以忽略,只需要了解其对外呈现的接口。
AD输入与输出之间的关系为:MSP430的ADC12内核模块是12位的,其最大输出为2^12 – 1 = 4095。
以VR-为参考点,当VIN小于或者等于VR-时得到的AD码值为0,当VIN大于或者等于VR+时,得到的AD码值为4095,当VIN处于VR-和VR+之间时,按线性比例转换。
这样,从MCU中读出AD码值,即可根据公式倒推回去计算出输入的模拟量电压。
二,ADC总体框图再补一张中文版的:三,分块解释1,ADC内核先来看看ADC最核心的部分。
当然少不了电压参考源VR+和VR-,以及模拟量输入部分。
模拟量输入部分是和“采样保持”电路连在一起的,这一部分后面再细说。
除此之外,与ADC内核相关的,还有以下几个信号:1,ADC12CLK。
在MCU中,任何模块都少不了时钟,ADC模块也不例外,必须有时钟信号它才能工作。
它有4个时钟源可以选择,并且可以1~8分频。
2,ADC12ON,这个是ADC内核的总开关,只有当ADC12ON这一位为1时,ADC内核模块才工作。
如果想要关闭ADC内核以降低功耗,可以将ADC12ON置为0.3,SAMPCON,采样控制信号。
该信号接至Convert,当SAMPCON为低电平时,ADC内核进行AD转换。
4,BUSY,用于指示内核模块是否正处于AD转换过程中。
2,采样保持。
【MSP430趣谈】MSP430第十二讲之ADC(上)首先我们需要明白一个问题是什么是ADC,中文翻译过来就是模数转换器,从他的英文名的话我们会更加好记,Analog-to-Digital Converter。
简而言之就是将模拟量转换为数字量。
在我们的生活中大部分是模拟量,比如说温度、压力、声音、或者图像等等。
现在大部分的传感器都将一些模拟量转化为电压量来进行测量,这里不再举例,因为太多了,大家在学会这一讲之后,可以试着去读一个土壤湿度传感器的值(前提是你有的话)。
现在大家应该可以明白是什么了吧!一句话,就是把电压值转化成数字量(会不会有点笼统,暂且可以这么理解)。
我们现在看下ADC有一些什么性能指标?1.采样率这是一个什么概念呢?因为对于模拟量来说,在时域上面是连续的(时域是指x轴为时间t的一个坐标域,比如你用示波器看到的波形就是指在时域上面的波形),而对于我们的数字量来说它就是一个离散的量,也就是说它必然是会产生一个时间间隔,没有办法做到连续,做到连续的话数据量就是无穷大(会不会说的有点玄乎,希望大家可以明白。
)所以就引出采样率这样的一个东西,简单说就是多久采集一次信号,又可以称之为采样频率。
2. 分辨率大家如果去查ADC的芯片,都会说到该芯片是几位的ADC,那么这个是用来干嘛的呢?比如说我们介绍的FR5969提供了一个12位的ADC,改怎么理解呢,12位的ADC第一个寄存器来说,那么他可以存储多少个数呢?就是212个数,假设我们现在给一个2.5V的电压值,那么我们可以得到他的分辨率就是2.5/212 = 0.0006也就是说它可以测量到0.0006V的电压。
3.转化时间这个比较复杂,因为涉及到ADC的构成以及工作原理,所以下面我们需要专门来讲一讲ADC的电路工作原理。
首先第一个我们需要知道的是采样定理,对于现在大部分的规模电路乃至超大规模电路,都基本的是以数字为主的,但是实际的大部分参量是模拟的,所以就需要解决这之间的桥梁问题。
MSP430-AD12 的个人深入了解一:msp430 内部AD 是否稳定?
答:从网上查看了很多资料,说msp430 的内部AD 不怎幺稳定。
第一种方式:我把AD 通道上加上1.25V 的基准源,作为被测源(430 用内部时钟,内部基准源2.5V,参考源外部引脚加了一个1000p 的滤波电容),它的波动为1。
第二种方式:AD 的输入端对地短路,转换值为0 或者1 从结果来看,它自身有1 个数的波动。
也就是msp430 内部的AD 性能比较优越。
二:采样周期的选择?
答:1:这个问题始终找不到准确的答案,经过我测时候发现,选用不同的周期值,采样出来的值有所变化,但同时采样出来的AD 波动也有所变化,建议采用AD 的值波动比较小的那个采样周期,最后用理想值做一个修正。
2:网上还有一种说法,就是根据被测信号的质量来选择,在信号源质量不好的情况下,周期选择相应的比较长一点,相当于有一定的RC 滤波的效果。
三:msp430 的AD12 的一致性?。
基于msp430g2553内部ADC10单通道详解基于msp430g2553内部ADC10单通道详解/采用数码管显示转换结果#include "delay.h"#define Num_of_Results 32static uint results[Num_of_Results];uchard[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchard1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar a[5]={0xdf,0xef,0xf7,0xfb,0xff};void main(){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//主系统时钟切换为外部高速晶振if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF){while(1); // If calibration constants erased, trap CPU!!}// Configure Basic ClockBCSCTL1 = CALBC1_8MHZ; // Set rangeDCOCTL = CALDCO_8MHZ; // Set DCO step + modulation*/P1SEL |= BIT1+BIT0; // p1.0为A0P1DIR&=~(BIT1+BIT0);// p1.0为输入P2SEL=0X00;// p2为普通io口ADC10CTL0=ADC10ON+ADC10SHT_2+MSC+ADC10IE+SREF_2;// ADC12ON打开ADC;//ADC10SHT_3设置采样时间,合适即可//MSC设置多次采样// 中断允许,IFG置位后会进入中断服务程序ADC10CTL1= CONSEQ_2+INCH_0;//CONSEQ_2单通道多次转换// INCH_0选择通道A0,可以不写,默认为A0ADC10AE0|=0X03;ADC10SA=0X200;ADC10CTL0 |= ENC+ADC10SC; // 使能转换并且开始转换ADC10CTL0&=~ADC10IFG;//清除中断标志位_EINT();//打开中断while(1);}//ADC中断服务函数,在这里用多次平均的#pragma vector=ADC10_VECTOR__interrupt void ADC10ISR (void){uchar i;uchar ptr[4];P1DIR=0XFC;//p4作为输出P2DIR=0XFF;static uint index = 0;results[index++] = ADC10MEM;if(index == Num_of_Results){unsigned long sum = 0,real;index = 0;for(i = 0; i < Num_of_Results; i++){sum += results;}sum >>= 5; //除以32求得平均值real=3300*sum/1023;//扩大1000倍ptr[3] = real / 1000;ptr[2] = (real - ptr[3]*1000)/100;ptr[1] = (real - ptr[3]*1000 - ptr[2]*100)/10;ptr[0] = (real - ptr[3]*1000 - ptr[2]*100 - ptr[1]*10); for(i=0;i<4;i++){P1OUT=a;if(i==3)P2OUT=d1[ptr];elseP2OUT=d[ptr];__delay_cycles(30000);P1OUT=a[4];P2OUT=d[10];}}}。
MSP430教程之十二ADC(下)上次我们讲了相关的ADC知识,那么这次我们将这些知识实际应用于我们的实际使用中。
同样的建立工程和添加库的步骤我们就不在说明了,两份文档,数据手册和我们的库文件使用手册也是必不可少的了,有时候我们还会需要用到我们的Launchpad的开发板原理图来查看某些引脚,这些步骤也都是我们之前一直说到的,希望可以给大家一些学习方法上面的参考。
今天这一讲我们将进入代码的书写上面,同样我们还是以库函数的形式来进行编写,后续我们会更新寄存器的编写方式,同时大家可以进行参考MSP430Ware的示例代码来自行编写寄存器的配置代码。
Ksps的意思是每秒转换次数为多少。
这里插播一个细节的东西,德州仪器(TI)的官网不管对于库函数还是寄存器都给出了示例代码,我们通过我们CCS环境下面的TI Resource Explorer下面查看到的示例代码都是基于寄存器的形式进行编写的,那么这里我们将和大家说一下要如何查看官方的库函数参考例程。
首先我们需要确认你有安装了MSP430Ware,如果你可以打开上面的界面,那毫无疑问是已经安装好了。
然后我们需要找到这个MSP430Ware的存放位置。
一个方法就是通过windows的搜索,直接搜索MSPWare(注意这里是搜索MSPWare而不是MSP430Ware)。
其他方法没找到,需要你知道安装在哪里。
不过一般情况下都会在软件的安装目录附近,自己稍微找一下应该就可以找到。
(如图下面长这样的文件夹)进去之后会有很多分支,红色方框里面的是我们的库函数的集合,而黑色方框对应的example就是我们上面TI Resource Explorer里面呈现的寄存器C参考例程了。
进入driverlib这个文件夹之后我们得到下面这么多文件,很显然例程就在我们的example里面,而这里面的driverlib对应就是我们器件的库函数源代码。
其他的大家自己琢磨去看看了。
不在说明了。
【MSP430趣谈】MSP430第十二讲之ADC(下)Ksps的意思是每秒转换次数为多少。
这里插播一个细节的东西,德州仪器(TI)的官网不管对于库函数还是寄存器都给出了示例代码,我们通过我们CCS环境下面的TI Resource Explorer下面查看到的示例代码都是基于寄存器的形式进行编写的,那么这里我们将和大家说一下要如何查看官方的库函数参考例程。
首先我们需要确认你有安装了MSP430Ware,如果你可以打开上面的界面,那毫无疑问是已经安装好了。
然后我们需要找到这个MSP430Ware的存放位置。
一个方法就是通过windows的搜索,直接搜索MSPWare(注意这里是搜索MSPWare而不是MSP430Ware)。
其他方法没找到,需要你知道安装在哪里。
不过一般情况下都会在软件的安装目录附近,自己稍微找一下应该就可以找到。
(如图下面长这样的文件夹)进去之后会有很多分支,红色方框里面的是我们的库函数的集合,而黑色方框对应的example就是我们上面TI Resource Explorer里面呈现的寄存器C参考例程了。
进入driverlib这个文件夹之后我们得到下面这么多文件,很显然例程就在我们的example里面,而这里面的driverlib对应就是我们器件的库函数源代码。
其他的大家自己琢磨去看看了。
不在说明了。
进入example这个文件夹就是我们德州仪器所有的430产品的系列型号对应的不同的参考代码了。
我们进入FR5xx_6xx这个系列,对应我们的开发板芯片FR5969。
这里面就给出了我们所有的TI Resource Explorer对应的库函数参考代码。
大家可以参考学习官方提供的库函数,是官方提供的,写的也相对比较规范,但是官方的东西总一个有一个毛病亘古不变,就是难懂,一般官方给的东西要是很通熟易懂,那肯定火的不行了。
所以在静心去琢磨琢磨官方的东西,虽然难懂,但是多看,多模仿,对自己能力的提高有着很大的帮助。
MSP430教程14MSP430单片机ADC12模块MSP430单片机的ADC12模块是一个12位的模数转换器,用于将模拟电压转换为数字值,以供单片机内部处理。
ADC12模块是MSP430单片机中最常用的外设之一,可以用于各种应用,如模拟传感器读取、电量计算等。
ADC12模块的主要特点包括:1.12位的精度,可以将电压精确转换为4096个不同的数字值。
2.可以配置为单通道或多通道模式,允许同时转换多个模拟通道的电压。
3.支持多种转换触发方式,如手动触发、定时触发、比较触发等。
4.可以配置不同的参考电压源,以适应不同的应用场景。
5.内置温度传感器和内部参考电压源,方便温度和电压的测量。
在使用ADC12模块之前,需要进行一些初始化配置。
首先,需要设置参考电压源,可以选择使用外部引脚输入的参考电压,或者使用内部参考电压。
其次,需要选择转换触发源,可以选择手动触发或定时触发等。
还可以选择转换结果的存储位置,可以存储在内存中,也可以存储在DMA传输缓冲区中。
在实际使用中,可以通过编程设置ADC12的参数并启动转换。
转换完成后,可以通过查询标志位或中断方式来获取转换结果。
获取结果后,可以进行进一步的处理,如计算实际电压值或进行比较判断等。
以下是一个简单的示例代码,演示了如何使用ADC12模块进行模拟电压转换:```c#include <msp430.h>void init_ADC12//设置参考电压为内部2.5V参考源REFCTL0=REFMSTR,REFVSEL_2,REFON;//设置为单通道模式,使用A0通道ADC12CTL0=ADC12ON,ADC12SHT0_8,ADC12MSC;ADC12CTL1=ADC12SHP;//使用采样保持模式ADC12MCTL0=ADC12INCH_0,ADC12VRSEL_1;//设置输入通道为A0,使用2.5V参考电压//选择转换触发源为软件触发ADC12CTL0,=ADC12ENC,ADC12SC;void main(void)WDTCTL=WDTPW,WDTHOLD;//停用看门狗定时器while (1)while (ADC12CTL1 & ADC12BUSY);//等待转换完成unsigned int result = ADC12MEM0; // 获取转换结果//进一步处理转换结果,如计算实际电压值float voltage = (result / 4096.0) * 2.5;//处理完成后进行下一次转换ADC12CTL0,=ADC12SC;}```以上代码中,首先调用`init_ADC12(`函数进行ADC12模块的初始化配置,然后在主循环中进行转换和结果处理。
定时器A用到CCR0定时器A的中断可由定时器溢出引起,也可由捕获/比较器模块产生。
每个捕获/比较模块可以独立编程,由捕获/比较外部信号产生中断。
定时器A使用两个中断向量,一个单独分配给捕获/比较寄存器CCR0;另一个作为共用中断向量用于定时器和其他的捕获/比较寄存器。
捕获/比较寄存器CCR0中断向量具有最高优先级,因为CCR0主要用来定义定时器的工作模式,而这是定时器A其他功能的基础,需要最快速的服务。
开启定时器应该在修改定时器工作频率之前。
CCR1,CCR2和定时器共用另一个中断向量,属于多源中断。
由向量中断寄存器TAIV决定由哪个中断标志来触发中断。
中断标志产生数据表:中断优先级中断源缩写 TAIV 的内容最高捕获/比较器1 CCIFG1 2捕获/比较器2 CCIFG2 4定时器溢出 TAIFG 10最低没有中断将挂起 0PxDIR输入/输出方向寄存器0:I/O引脚切换成输入模式 PxIN1:I/O引脚切换成输出模式 PxOUTPxIE中断使能寄存器0:禁止该中断 1:允许该中断PxIES中断触发沿选择寄存器如果允许Px口的某个引脚中断,还需要定义该引脚的中断触发沿。
0:上升沿使相应标志置位 1:下降沿使相应标志置位PxSEL功能选择寄存器0:选择引脚为I/O端口 1:选择引脚为外围模块功能上电复位信号:POR(power-on reset)上电清除复位信号:PUC(power-up clear)POR信号的产生总会产生PUC信号,但是PUC信号的发生不一定会产生POR信号。
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
TACTL是最为主要的控制寄存器,它决定了TA的输入时钟信号、TA的工作模式、TA的开启与停止、中断的申请等工作。
之一关于AD转换
l 首先应明确Msp4301X里的各系列中的ADC模块大凡是12位的转换精度。
下图即为其功能模块图。
其实这个图感觉大概看哈就行了,真有时间和精力细细结合书渗透还是可以的,不过就是刚开始看有点花花绿绿吧。
l 熟悉并能使用一个模块,必然要熟悉其各个寄存器的作用。
下面我们来看下ADC12模块中各个模块寄存器的作用,
转换控制寄存器 ADC12CTL0
ADC12CTL0
1. ENC=1时才能正常的AD转换
2. ADCSC是其采集/转换控制位,启动AD必须要用一条指令来配置ENC 和ADCSC。
3. ADCIVIE 转换时间溢出中断。
转换未完成时,继续采样则会溢出。
4. ADC0VIE 溢出中断允许位。
即ADC12MEMx。
MSP430单片机拥有内置的ADC功能,在一些高级单片机系列上是ADC12,在低级单片机系列上是ADC10,两者的主要区别是分辨率的不同,我们的G2553内置的就是ADC10,所以Cloud就在这里和大家一起学习ADC10。
一、ADC10特性我们先来了解一下这个ADC10的特性,官方给出的:·高达200ksps的转换速率;·固定的10位转换;·具有采样保持功能,并可选采样周期;·可以通过软件代码或TimerA初始化转换;·可选的片内(1.5V或2.5V)或片外参考电压;·支持8个外部输入通道;·内部输入通道支持温度检测,VCC和外部参考(+、—);·可选的转换时钟源;·单通道单次/多次、序列通道单次/多次,共4种转换模式;·ADC内核和参考电压都可单独关闭;·具有一个支持自动存储转换结果的数据转换控制器(DTC);二、ADC10结构OK,我们来引入ADC10的内部结构图来初步认识这个ADC10的内部结构。
为了方便大家学习,Cloud将各部分用不同颜色区分开:1、ADC10内核-SAR和采样保持电路:首先我们看到中间两块橙色的区域,右边五边形的是一个“10-bit SAR”,翻译过来就是一个10位精度的逐次逼近比较型的ADC内核,也就是说,我们的ADC转换就是在这里完成的。
那么它的信号来源是哪里呢?就是左边橙色矩形区域的“Sample and Hold”即采样保持电路,它将外部或者内部的模拟信号进行保持以实现ADC转换过程中的信号稳定。
2、ADC10信号通道和转换模式:我们的采样保持电路可以将左边选择器(红色梯形区域)内的信号进行保持。
由于我们的SAR只有一个,要对里里外外这么多信号都进行AD转换就必须按顺序来,一个一个选择性地输入,这个选择器就是用来选择要输入的外部或者内部模拟信号。
上面绿色矩形框控制着选择器选择哪个信号以及是否自动按序列选择。
msp430 AD初始化流程msp430 AD初始化流程:单片机ADC编程的流程如下:1初始化,void Adc12int(){ADC12CTL0 &= ~ADC12ENC; //使AD模块处于初始状态ADC12CTL0 = ADC12MSC+ADC12SHT0_15+ADC12SHT1_15;//使用外部部3.3V参考电压,使用采样保持器。
}//#define ADC12ENC (0x0002u)#define ADC12MSC (0x0080u)#define ADC12SHT0_15 (15*0x100u)#define ADC12SHT1_15 (15*0x1000u)//一、寄存器ADC12CTL0:SHT1 SHT0 MSC 2.5V REFON ADC120NADC12TOVIE ADC12TVIE ENC ADC12SC15-12 11-8 7 6 5 4 3 21 0ADC120SC :ADC12内部时钟源(启动)ENC 位为转换允许,1允许AD转换,0时为不允许转换,即复位状态;由于ADC12CTL0和ADC12CTL1的一些位和ADCMCTILX的所有位必须在ENC位复位时才能修改。
因而初始过程为:ENC复位——设置转换启动方式——打开参考电压——选择采样保持器时间SHT1 SHT0 采样保持定时器1和0,定义转换结果中转换时序与采样时钟ADC12CLK的关系。
程序设置都为1,MSC 多次采样、转换位。
有效条件:CONSE!=0,MSC=1表示仅首次转换同SHI信号的上升沿触发采定时器,采样转换在前一转换完成立即进行。
程序中设置为1MSC的作用是:在顺序转换或重复转换中,若MSC置1则只需最初有一个触发信号,随后都会在前一次转换完成后,自动进入下一次转换。
否则的话,每次转换完成都还需另个的触发信号。
-----------DATASHEET.2.5V 内部参考电压选择位:0——1.5V,1——2.5VREFON参考电压控制位 0内部参考电压关闭 1则为打开ADC12ON 内核控制位 0关闭 1打开ADC12TOVIE 转换时间溢出中断允许 0没发生转换时间溢出 1则表示发生ADC12TVIE 溢出中断允许位 0没有发生溢出 1表示发生溢出以上5个位都设置0。