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模块的初始化配置,然后在主循环中进行转换和结果处理。