MSP430单片机AD转换实验学习资料

合集下载

MSP430单片机之ADC

MSP430单片机之ADC

一张图看懂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模数转换ADC

MSP430模数转换ADC

SREF2 SREF1 SREF0 0 0 1
#SREF_1
17
举例 :ADC12 通道 0 使用内部 1.5V 参考电压源
BIS #REFON , &ADC12CTL0 ; turn on 2.5V ref ; Vr+=Vref+ BIS.B #SREF_1 , &ADC12MCTL0
SREF2 SREF1 SREF0 0 0 1
#SREF_1
18
举例:VR+ 使用外部正参考电压源 VeREF+ or BIS.B #SREF_2 , &ADC12MCTL0 BIS.B #SREF_3 , &ADC12MCTL0
SREF2 SREF1 SREF0 0 1 x
#SREF_2 or #SREF_3
19
ADC12工作时钟(ADC12CLK)编程设置
ADC12模块是一个转换速度高达 200ksps、采样时间可编程 的12-bit逐次逼近型模数转换器。由12-bit的SAR核、采样保 持电路、模拟开关、参考电压产生与选择电路、 ADC 时钟 选择电路、采样与转换控制电路、16个转换结果存储缓冲器 及其对应的16个存储控制寄存器、中断系统、片上集成温度 传感器等组成。 ADC12可以在没有CPU的参与下,独立实 现多达 16 次的采样、转换和存储操作。 ADC12 模块可以独 立断电,以便于低功耗设计。 MSP430X13X,MSP430X14X,MSP43015X 和 MSP430X16X 等 芯片中均有ADC12模块。
采样保持输入信号的宽度
0~1×ADC12CLK
tsample = 采样定时器输出信号的宽度 4×ADC12CLK≤tsample ≤1024×ADC12CLK

MSP430单片机构成ΣΔ型AD转换器原理及实现方法

MSP430单片机构成ΣΔ型AD转换器原理及实现方法

* !$$(+,A,%)/#$)
(0)
在一定的误差范围内,有 !>?@ * !’(,则:
!’( *(+,A,(%)+%()/#$)
* !$$(+,A,%)/#$)
(/)
虽然 %)+ * %)! *’’’和 %(+ * %(!
*’’’不一定成立,但总体效果上看,可以认为它
们是等宽的’由- 个高电平和. ,- B!型 /E转换器原理及实现方法
刘 刚,刘风 ,于 军
(吉林化工学院 自动化系,吉林 吉林 ?"!(!!)
摘要:主要介绍 83D*"(微功耗单片机构成 !B!型 /E转换器的原理,给出了对应的电路图和程序框
图&83D*"(单片机主要特点是功耗极低、片内含有比较器,可以使用很少的零件构成 !B!型 /E 转换
器即增加了成本,又存在单片机与 /E 转换器连
字值&对含有比较器的单片机可以使用很少的零 件构成 !B!型 /E转换器,得较高的分辨率&
(")83D*"(系列单片机是美国德州仪器公 司?AA)年以后逐步开发出来的?)位微功耗单片 机(86-)&主要特点是功耗极低、开发方便、产品 系列化,可随使用要求不同选择相应产品&本文介 绍的 !B! 型 /E 转换电路由 83D*"(1*?" 单片 机构成,其片内结构如图?所示&
相似文献(9条)
1.期刊论文 崔明.佟刚.吴志勇.CUI MING.TONG GANG.WU ZHIYONG 基于MSP430的纸张耐压强度检测系统 -微计
算机信息2007,23(29)
基于MSP430单片机开发了一种新型的纸张耐压强度检测系统.采集的微弱信号通过两级放大器放大,测量时自动变换量程,提高了检测结果的精 度和稳定性.利用MSP430单片机片上外围部件集成度高的特性,使系统结构紧凑,节约了成本.增强的用户接口界面,使操作简便.

msp430ADDA实验

msp430ADDA实验
caltmp = number; caltmp = (caltmp << 5) + number; //caltmp = Hex_Val * 33 // caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10 caltmp = (caltmp << 6) + (caltmp << 5) + (caltmp << 1); //caltmp = caltmp * 100 Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n=4096
P7SEL (BIT2+BIT3)
// LCD segment definitions. #define d 0x01 #define c 0x20 #define b 0x40 #define a 0x80 #define dp 0x10 #define g 0x04 #define f 0x08 #define e 0x02 uint8_t con[10] , trans_v[10]; const char char_gen[] = {
const char char_gen_dp[] = { board
a+b+c+d+e+f+dp, b+c+dp, a+b+d+e+g+dp, a+b+c+d+g+dp, b+c+f+g+dp, a+c+d+f+g+dp, a+c+d+e+f+g+dp, a+b+c+dp, a+b+c+d+e+f+g+dp, a+b+c+d+f+g+dp, a+b+c+e+f+g, c+d+e+f+g, a+d+e+f, b+c+d+e+g, a+d+e+f+g, a+e+f+g, a+b+c+d+f+g, c+e+f+g, b+c, b+c+d, b+c+e+f+g, d+e+f, a+b+c+e+f,

MSP430单片机AD转换实验

MSP430单片机AD转换实验

AD转换实验一、转换原理MSP430F149勺A/D转换器原理请参考相关书籍。

实验板上与AD相关的硬件电路:RV310K------------ 3-3\J6P61SI?2Al)输入电路RV4III-10K f > 2 ;|||二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。

“ main 、c ”主程序与中断程序:/*********************************************************程序功能:将ADC 对P6、0端口电压的转换结果按转换数据与对应的 模拟电压的形式通过串口发送到PC 机屏幕上显示通信格式 :N 、 8、 1, 9600测试说明 :打开串口调试精灵 ,正确设置通信格式 ,观察接收数据 **********************************************************/ #include <msp430 、 h> #include "allfunc 、 h" #include "UART0_Func 、 c" #include "ADC_Func 、 c" #define Num_of_Results 32 uint results[Num_of_Results]; // 保存 ADC 转换结果的数组uint average; uchar tcnt = 0; /*********************** void main( void ){uchar i; uchar buffer[5];WDTCTL = WDTPW + WDTHOLD; // 关狗 /* 下面六行程序关闭所有的 IO 口 */ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT=0XFF;P3DIR = 0XFF;P3OUT=0XFF;P4DIR = 0XFF;P4OUT=0XFF;P5DIR = 0XFF;P5OUT=0XFF;P6DIR = 0XFF;P6OUT = 0XFF; P6DIR |= BIT2;P6OUT |= BIT2; // P6DIR|=BIT6;P6OUT&=~BIT6; //InitUART(); Init_ADC(); _EINT(); buffer[4] = '\0';主函数 *********************关闭电平转换关闭数码管显示while(1){LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i++) buffer[i] += 0x30;PutString0("The digital value is: ");PutString(buffer);Trans_val(average,buffer); buffer[3] = buffer[2]; buffer[2] = buffer[1];buffer[1] = 0x2e - 0x30; for(i = 0; i < 4; i++) buffer[i] += 0x30;PutString0("The analog value is: "); PutString(buffer);}}/******************************************* 函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6、0 口的模拟电压数值参数: 无返回值: 无********************************************/ #pragmavector=ADC_VECTOR __interrupt void ADC12ISR (void) { static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results) {uchar i;average = 0;for(i = 0; i < Num_of_Results; i++){ average += results[i];average >>= 5; // 除以 32index = 0; tcnt++;if(tcnt == 250) // 主要就是降低串口发送速度 { LPM1_EXIT; tcnt = 0; } }}“ADC_Func 、 c ” A/D 转换相关程序 : #include <msp430 、 h> typedef unsigned int uint; /******************************************** 函数名称 :Init_ADC 功 能: 初始化 ADC 参 数: 无 返回值 : 无********************************************/ void Init_ADC(void) {P6SEL |= 0x01; // ADC12CTL0 =ADC12ON+SHT0_15+MSC; // ADC12CTL1 =SHP+CONSEQ_2; // ADC12IE = 0x01; // ADC12CTL0 |= ENC; // ADC12CTL0 |= ADC12SC; //}/******************************************** 函数名称 :Hex2Dec功 能:将16进制ADC 专换数据变换成十进制表示形式参数:Hex_Val--16 进制数据 ptr--指向存放专换结果的指针返回值 : 无 ********************************************/ void Hex2Dec(uint Hex_val,uchar *ptr) { ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100; ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;使能ADC 通道打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能专换 开始专换、 41ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);}/******************************************* 函数名称 :Trans_val功 能:将16进制ADC 专换数据变换成三位 10进制真实的模拟电压数据 , 并在液晶上显示参数:Hex_Val--16 进制数据返回值 : 无********************************************/ void Trans_val(uint Hex_Val,uchar *ptr){unsigned long caltmp; uint Curr_Volt; uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; 〃Curr_Volt = caltmp / 25 ptr[0] = Curr_Volt / 100;//Hex->Dect1 = Curr_Volt - (ptr[0] * 100); ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“UARTO_Func c ”串口程序: #include <msp430 、h> typedef unsigned char uchar;/******************************************* 函数名称 :InitUART 功 能:初始化UART 端 口参 数: 无 返回值 : 无********************************************// P3 、 4,5 =// Enable USART0 T/RXD// 8-bit character// UCLK = ACLK// 32k/9600 - 3 // // Modulationvoid InitUART(void){P3SEL |= 0x30; ME1 |= URXE0 + UTXE0;UCTL0 |= CHAR; UTCTL0 |= SSEL0; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A;变换USART0 TXD/RXD// Initialize USART state machine}/*******************************************函数名称:Send1Char功能:向PC机发送一个字符参数:se ndchar--要发送的字符返回值:无********************************************void Send1Char(uchar sendchar){while (!(IFG1 & UTXIFG0)); //TXBUF0 = sendchar;等待发送寄存器为空} /******************************************* 函数名称:PutSting功能:向PC机发送字符串并换行指令参数:ptr--指向发送字符串的指针返回值: 无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); //}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; //} /******************************************* 函数名称:PutSting0功能:向PC机发送字符串,无换行参数:ptr--指向发送字符串的指针返回值: 无********************************************/ void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // }}发送数据发送换行指令发送数据2、程序2: 转换结果显示在1602 显示模块上UCTL0 &= ~SWRST;“ main、c” 程序#include <msp430x14x 、h> #include "cry1602 、h" typedef unsigned char uchar; typedef unsigned int uint;/************** 宏定义***************/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = P6 、3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = P6 、4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = P6 、5#define SET_EN P6OUT|=BIT5;/*******************************************函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数: x-- 位置的列坐标y-- 位置的行坐标n-- 字符个数ptr-- 指向字符存放位置的指针返回值: 无******************************************void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能: 向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值: 无******************************************void LocateXY(uchar x,uchar y) {uchar temp;temp = x&0x0f; y &=0x01;如果在第 2 行if(y) temp |= 0x40; //temp |= 0x80;LcdWriteCommand(temp,1);}/******************************************* 函数名称:Disp1Char功能: 在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值: 无********************************************/ voidDisp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );} /******************************************* 函数名称:LcdReset功能: 对1602 液晶模块进行复位操作参数: 无返回值: 无********************************************/ voidLcdReset(void){CtrlDir |= 0x07; //DataDir = 0xFF; //控制线端口设为输出状态数据端口设为输出状态// 规定的复位操作LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); LcdWriteCommand(0x08, 1); LcdWriteCommand(0x01, 1); LcdWriteCommand(0x06, 1); LcdWriteCommand(0x0c, 1);}/******************************************* 函数名称 :LcdWriteCommand 功 能: 向液晶模块写入命令 参数 :cmd-- 命令 , chk-- 就是否判忙的标志返回值 : 无********************************************/void LcdWriteCommand(uchar cmd,uchar chk) {/******************************************* 函数名称 :LcdWriteData 功 能: 向液晶显示的当前地址写入显示数据 参数 :data-- 显示字符数据返回值 : 无 ********************************************/ void LcdWriteData( uchar data ) {WaitForEnable(); // 等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort = data;// 将显示数据写入数据端口CLR_RS;CLR_RW; _NOP();DataPort = cmd; _NOP();//将命令字写入数据端口SET_EN; _NOP(); _NOP(); CLR_EN;}//产生使能脉冲信号检测忙信号 ?// 显示模式设置 // 显示关闭 // 显示清屏// 写字符时整体不移动 // 显示开 , 不开游标 , 不闪烁,1: 判忙 ,0: 不判if (chk) WaitForEnable(); //_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602 液晶完成内部操作参数: 无返回值: 无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/*******************************************函数名称:Delay5ms功能: 延时约5ms参数: 无返回值: 无******************************************** void Delay5ms(void){uint i=40000;while (i != 0)y-- 位置的行坐标i--;}}/******************************************* 函数名称 :Delay400ms 功 能: 延时约 400ms参 数: 无 返回值 : 无 ******************************************** void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}“ cry1602、c ” 程序#include <msp430x14x 、 h> #include "cry1602 、 h" typedef unsigned char uchar; typedef unsigned int uint; 宏定义 ***************/P2DIRP2OUT0x80P6DIRn--字符个数 ptr--指向字符存放位置的指针 返回值 : 无********************************************/ void DispNChar(uchar x,uchar y, ucharn,uchar *ptr) { uchar i; for (i=0;i<n;i++) /************** #define DataDir #define DataPort #define Busy#define CtrlDir//RS = P6#define CLR_RS P6OUT&=~BIT3; #define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4;#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5;#define SET_EN P6OUT|=BIT5;/******************************************* 函数名称 :DispNchar功 能:让液晶从某个位置起连续显示 N 个字符 参 数:X--位置的列坐标//RW = P6 、//EN = P6 、{Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能: 向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值: 无********************************************/void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; // 如果在第2 行temp |= 0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功能: 在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值: 无******************************************void Disp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );} /******************************************* 函数名称:LcdReset 功能: 对1602 液晶模块进行复位操作参数: 无返回值: 无******************************************void LcdReset(void){CtrlDir |= 0x07; //DataDir = 0xFF; //********************************************/void LcdWriteCommand(uchar cmd,uchar chk) { if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW; _NOP(); 控制线端口设为输出状态数据端口设为输出状态LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);}/******************************************* 函数名称:LcdWriteCommand 功能: 向液晶模块写入命令参数:cmd-- 命令,chk-- 就是否判忙的标志返回值: 无// 规定的复位操作// 显示模式设置// 显示关闭// 显示清屏// 写字符时整体不移动// 显示开, 不开游标, 不闪烁,1: 判忙,0: 不判SET_EN; //_NOP();_NOP();CLR_EN;}/******************************************* 函数名称 :LcdWriteData功能: 向液晶显示的当前地址写入显示数据 参 数 :data-- 显示字符数据返回值 : 无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW; _NOP();SET_EN; //_NOP();_NOP();CLR_EN; }***************************************** 函数名称 :WaitForEnable功 能:等待 1602 液晶完成内部操作 参 数: 无返回值 : 无********************************************/ void WaitForEnable(void){P2DIR &= 0x00; // 将 P4 口切换为输入状态 CLR_RS;SET_RW;_NOP(); SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志 DataPort = cmd;_NOP();// 将命令字写入数据端口 产生使能脉冲信号 DataPort = data;// _NOP();将显示数据写入数据端口产生使能脉冲信号CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/*******************************************函数名称:Delay5ms 功能: 延时约5ms参数: 无返回值: 无********************************************/void Delay5ms(void){uint i=40000; while (i != 0){i--;}}/*******************************************函数名称:Delay400ms 功能: 延时约400ms参数: 无返回值: 无********************************************/void Delay400ms(void){uchar i=50; uint j;while(i--) {j=7269; while(j--);。

MSP430之一 关于AD转换

MSP430之一  关于AD转换

之一关于AD转换
l 首先应明确Msp4301X里的各系列中的ADC模块大凡是12位的转换精度。

下图即为其功能模块图。

其实这个图感觉大概看哈就行了,真有时间和精力细细结合书渗透还是可以的,不过就是刚开始看有点花花绿绿吧。

l 熟悉并能使用一个模块,必然要熟悉其各个寄存器的作用。

下面我们来看下ADC12模块中各个模块寄存器的作用,
转换控制寄存器 ADC12CTL0
ADC12CTL0
1. ENC=1时才能正常的AD转换
2. ADCSC是其采集/转换控制位,启动AD必须要用一条指令来配置ENC 和ADCSC。

3. ADCIVIE 转换时间溢出中断。

转换未完成时,继续采样则会溢出。

4. ADC0VIE 溢出中断允许位。

即ADC12MEMx。

MSP430教程14MSP430单片机ADC12模块

MSP430教程14MSP430单片机ADC12模块

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

MSP430单片机教学综合实训一例共4页word资料

MSP430单片机教学综合实训一例共4页word资料

MSP430单片机教学综合实训一例1 概述单片机应用广泛,成本低,种类多,功耗低,能够方便地组装成各种智能的控制设备,能够完成相对比较复杂的控制任务,环境适应性较强,可以很方便的实现多机和分布式控制,已成为微型计算机的一个重要分支,发展速度极快。

单片应用人才需求广泛,高职院校在计算机应用类职业人才培养中大多开设单片机应用类课程。

专业实训是高职人才培养中的重要一环,包括了从知识准备到实训器材选择、从程序设计到电路设计等环节,对提高学生实践能力起到了重要作用。

2 实训设计与要求本实训采用现技术已比较成熟且难度适中的“数字温度计”制作作为实训内容。

根据系统的设计要求,选择DS18B20作为温度传感器,可以省去采样/保持电路、运放、数/模转换电路以及串/并转换电路,可以有效简化电路,缩短系统的工作时间,降低了实训难度。

选择MSP430单片机为测控系统的核心来完成数据采集、处理、显示、报警等功能。

本实训采用MSP430单片机作为核心部件,MSP430系列单片机是一种16位的单片机,相对于8位的51单片机来说,它具有功能丰富、较大的内部RAM和程序存储空间,适合开发较复杂的系统。

采用C语言开发,程序更容易编写和较好的可读性,可以大大提高软件开发的工作效率。

温度传感器DS18B20把所测得的温度发送到MSP430单片机上,经过单片机处理,将温度在LED数码管以动态扫描法实现显示。

系统由主控制器、测温电路和显示电路3个模块组成。

对学生实训具体要求如下:(1)熟悉各元器件原理与使用方法,编写程序,实现以单片机为核心器件,使用温度传感器采集温度,通过LED数码管显示器显示温度值。

(2)编写程序,通过液晶显示模块实现汉字和温度值输出显示,实现温度报警功能。

(3)设计制作独立完整实验电路。

3 实训器材采用MSP430-DEMO16X开发试验板,单片机的所有引脚都已经引出,便于学生进行扩展试验,并对实验的原理、实验环境配置和源程序都进行了详细的说明。

实验二 AD转换实验

实验二 AD转换实验

实验二 AD转换实验实验预习要求1、学习 MSP430F6638 单片机中ADC12的配置方法。

2、了解ADC转换原理。

一、实验目的1、了解AD转换原理及LED灯的控制方法。

2、掌握MSP430F6638 中ADC12的配置使用方法。

3、结合电位器与ADC12模块实现对LED灯的控制。

二、实验器材PC 机,MSP430F6638 EVM,USB数据线,万用表,信号发生器。

三、实验内容1、验证性实验:利用MSP430F6638开发板上的拨盘电位器,控制改变AD转换的输入电压值,转换后的数字量显示在段式液晶上面。

使用万用表测得当前输入电压,通过计算得到转换后的理想的数字量与液晶显示的数字量进行比较。

2、设计性实验:AD转换结束会产生中断,编写AD中断服务程序。

利用信号发生器输出信号(例如正弦波、三角波信号)作为AD转换的输入,根据输入电压的大小控制LED灯的亮灭(例如随着输入电压值的增大,LED1到LED5按顺序点亮;随着输入电压值减小,LED灯按顺序熄灭),LED和单片机IO口连接如下图所示。

图2.1 LED灯电路原理图四、实验原理模数转换器(ADC)是指将连续的模拟信号转换为离散的数字信号的器件。

真实世界 的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数 字形式。

在A/D 转换中,因为输入的模拟信号在时间上是连续的,而输出的数字信号是离 散量,所以进行转换时只能按一定的时间间隔对输入的模拟信号进行采样,然后再把采样值 转换为输出的数字量。

通常A/D 转换需要经过采样、保持量化、编码几个步骤。

ADC12 电 路如下图所示。

图2.2 ADC12 模块结构框图ADC12 模块中由以下部分组成:输入的16 路模拟开关,ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/触发源部分,ADC 数据输出部分,ADC 控制寄存器等组成。

ADC12 的模块内核是共用的,通过前端的模拟开关来分别完成采集输入。

MSP430F149的ADC操作

MSP430F149的ADC操作

MSP430F149的ADC操作1)ADC图解图1 ADC的原理图理解:1.ADC的时钟来源可以有四个(ACLK/MCLK/SMCLK/ADC12SO)由ADC12SSELx来选择。

并且可以由ADC12DIVx控制选择分频。

2.ADC的采样参考电压可以由SREF0,SREF1来选择四种参考电压。

3.INCHx控制选择模拟电压输入口。

4.SHSx选择控制方式。

2)ADC的内核1.ADC的转换公式当采样最高电压高过或等于参考电压的时候,是最大值0FFFH。

当采样最低电压低于或是等于参考电压的时候,是最小值000H。

2.控制ADC12的内核可以通过ADC12CTL0和ADC12CTL1两个寄存器来控制。

当不使用的时候可以通过ADC12ON位来控制关闭内核以达到低功耗的目的。

当修改转换使能标志ENC的时候,要先判断ADC12内核是否在进行转换工作,如果在转换工作期间关闭ENC(置零)那么最终得到错误的结果。

3)ADC的时钟来源ADC可以有四种时钟来源。

而ADC12OSC是ADC内置的一个时钟源,大概频率在5MHZ左右,不过该时钟源由个人设备、供电电压和外部温度的影响很大。

4)ADC的参考电压发生器ADC内部可以提供一个可以产生1.5V或是2.5V的产考电压发生器。

当设计使用的时候,需要将一个10uF的电容和一个0.1uF的电容并联到它的输出端。

而且使用的时候,打开发生器至少需要等待17ms以让参考电压达到一个稳定的值。

5)ADC的低功耗当ADC内核不适用的时候,它会自动进入关闭模式,在使用的时候自动苏醒。

而它的参考电压却不会自动关闭,要用手通过REFON手动关闭。

6)ADC的采样保持触发源它的触发源由四种选择。

1.ADC12SC位控制。

2.定时器A输出控制3.定时器B输出控制4.定时器B输出控制7)ADC的采样保持时间ADC的采样保持时间有两种模式。

1.拓展型采样时钟模式。

这个时候,采样的时间由SHI决定,也就是当SHI上升沿的时候开始采样,下降沿的时候结束采样。

ad转换(430单片机)

ad转换(430单片机)

ADC12采样保持时间与采样频率【采样与转换】ADC12完成对一个模拟信号模数转换过程由两部分组成:采样保持和转换.完成采样转换周期时间= 采样保持时间 +转换时间采样保持时间:由产生SAMPCON信号开始到结束所需时间,这期间ADC进行对模拟信号采样保持。

在脉冲采样模式时(SHP=1),采样时间: Tsample = 4 x ADC12CLK x N。

式中,Tsample为采样保持时间,ADC12CLK为ADC12内核时钟周期,N则由SHT1(SHT0)的4位二进制码决定。

采样保持时间与ADC12模块的等效输入电路有关。

从ADC12模块输入看ADC内部等效为一个电阻(2K)与一个电容(30pf)相串联.这个内部RC 常数直接影响着最小的采样保持时间参数.所以,在采样转换中有一个最小采样保持时间值概念.这个最小采样保持时间值从上式中可以看出是由ADC12CLK时间周期决定(N=1时),也就是说ADC12CLK的最高频率;这个频率不能超出MSP430芯片手册中所指定的最高频率(最小采样保持时间值)。

关于脉冲采样模式(SHP=1)这个最小采样保持时间值因芯片不同,详情可以查看相应的芯片手册。

转换时间:ADC12核将采样保持的模拟信号转换成数字所需要的时间,这个转换时间在脉冲采样模式和扩展采样模式都是相同的。

转换时间=13 x (ADC12CLK/Fadc12clk)在脉冲采样模式时完成一个模拟信号采样转换周期时间计数公式为:= (4 x ADC12CLK x N) + ( 13 xADC12CLK/Fadc12clk))以上内容来自微控论坛,因为要使用最高采样频率,对输入时钟以及采样保持时间不清楚,1611头文件中并未指出SHTx_x对应的分频因子具体是多少,所以自己亲自实验测量。

输入信号为1kHz,ADC输入时钟为SMCLK,时钟频率为8MHz。

#define SHT0_0 (0*0x100u)//分频因子为N=0(此时无保持时间,无法运行)#define SHT0_1 (1*0x100u)//分频因子为N=8.8(对应采样频率为166k)#define SHT0_2 (2*0x100u)//分频因子为N=8.8 (对应采样频率为166k)#define SHT0_3 (3*0x100u)//分频因子为N=9 (对应采样频率为162k)#define SHT0_4 (4*0x100u)//分频因子为N=16 (对应采样频率为104k)#define SHT0_5 (5*0x100u)//分频因子为N=24 (对应采样频率为73k)#define SHT0_6 (6*0x100u)//分频因子为N=32 (对应采样频率为57k)#define SHT0_7 (7*0x100u)//分频因子为N=48 (对应采样频率为39k)#define SHT0_8 (8*0x100u)//分频因子为N=64 (对应采样频率为30k)可见ADC12的最高采样频率为165KHz,实验数据没有进行数据统计,内容仅供参考。

单片机原理及应用_第九讲_MSP430单片机液晶控制器和ADC

单片机原理及应用_第九讲_MSP430单片机液晶控制器和ADC

单片机原理及应用第九讲 MSP430单片机液晶控制器和ADC报告人:实验内容实验一:段码LCD循环显示0到6实验二:DAC输出正弦波实验三:基础:使DAC0输出正弦波频率为300Hz,在LCD上显示频率。

提高:用按键控制DAC0输出正弦波频率为在100Hz—1000Hz循环输出,步进值为100Hz,并在LCD上显示频率。

实验步骤步骤:(1) 将PC 和板载仿真器通过USB 线相连;(2) 打开CCS 集成开发工具,选择样例工程或自己新建一个工程,修改代码;(3) 选择对该工程进行编译链接,生成.out 文件。

然后选择,将程序下载到实验板中。

程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择F3 查看具体函数。

也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。

再按下实验板的复位键,运行程序。

(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。

关键代码:实验一:int main(){int i,j;WDTCTL = WDTPW + WDTHOLD;// Stop WDTInit_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2 Init_lcd(); // LCD初始化Backlight_Enable(); // 打开背光LcdGo(1); // 打开液晶模块LCD_Clear(); // 清屏while(1){for (i=0; i<6; i++) // Display "0123456"{for(j=0;j<6;j++){LCDMEM[j] = char_gen[i];}delay_ms(1000);}}}实验二:#include<msp430f6638.h>#include<math.h>#define PI 3.1415926int sin_table[360];int *sin_data_pr;double i=0;int j;void main(void){WDTCTL = WDT_MDLY_0_064; // WDT ~61us interval timer SFRIE1 = WDTIE; // Enable WDT interruptfor(j=0;j<360;j++){i+=PI/180;sin_table[j]=(int)((sin(i)+1)*2048);}sin_data_pr=&sin_table[0];DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 + DAC12ENC +DAC12CALON+DAC12OPS;P5DIR=BIT1;//打开扬声器的运放P5OUT&=~BIT1;for (;;){__bis_SR_register(CPUOFF + GIE); // Enter LPM0DAC12_0DAT=*sin_data_pr++;if (sin_data_pr >= &sin_table[360]){sin_data_pr = &sin_table[0];}// Positive rampDAC12_0DAT &= 0xFFF; // Modulo 4096}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR) }实验三:基础:int main(void) {WDTCTL = WDT_MDLY_0_064; // WDT ~61us interval timerInit_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2Init_lcd(); // LCD初始化Backlight_Enable(); // 打开背光LcdGo(1); // 打开液晶模块LCD_Clear(); // 清屏LCDMEM[0] = char_gen[3];LCDMEM[1] = char_gen[0];LCDMEM[2] = char_gen[0];SFRIE1 = WDTIE; // Enable WDT interruptfor(j=0;j<52;j++){i+=PI/26;sin_table[j]=(int)((sin(i)+1)*2048);}sin_data_pr=&sin_table[0];DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 + DAC12ENC + DAC12CALON+DAC12OPS;P5DIR=BIT1;//打开扬声器的运放P5OUT&=~BIT1;for (;;){__bis_SR_register(CPUOFF + GIE); // Enter LPM0DAC12_0DAT=*sin_data_pr++;if (sin_data_pr >= &sin_table[52]){sin_data_pr = &sin_table[0];}// Positive rampDAC12_0DAT &= 0xFFF; // Modulo 4096}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR)}提高:#define circnt100 1388#define circnt200 694#define circnt300 462#define circnt400 348#define circnt500 278#define circnt600 232#define circnt700 198#define circnt800 174#define circnt900 154#define circnt1000 138int sin_table[180];int *sin_data_pr;double i=0;int j;const int cnt_table[] ={circnt100,circnt200,circnt300,circnt400,circnt500,circnt600,circnt700,circ nt800,circnt900,circnt1000};int cnt_flg = 0;void SetVcoreUp (unsigned int);void main(void){WDTCTL = WDTPW + WDTHOLD; // close watchdog//---------p2.6--------------P2REN |= BIT6; // Enable P2.6 internal resistanceP2OUT |= BIT6; // Set P2.6 as pull‐Up resistanceP2IES |= BIT6; // P2.6 Hi/Lo edgeP2IFG &= ~BIT6; // P2.6 IFG clearedP2IE |= BIT6; // P P2.6 interrupt enabled/*P2REN |= BIT7; // Enable P2.6 internal resistanceP2OUT |= BIT7; // Set P2.6 as pull‐Up resistanceP2IES |= BIT7; // P2.6 Hi/Lo edgeP2IFG &= ~BIT7; // P2.6 IFG clearedP2IE |= BIT7; // P P2.6 interrupt enabled*///---------enable LCD------------Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2Init_lcd(); // LCD初始化Backlight_Enable(); // 打开背光LcdGo(1); // 打开液晶模块LCD_Clear(); // 清屏LCDMEM[5] = char_gen[0];LCDMEM[4] = char_gen[0];LCDMEM[3] = char_gen[1];//----------config sine list------------for(j=0;j<180;j++){i+=PI/90;sin_table[j]=(int)((sin(i)+1)*2000);}sin_data_pr=&sin_table[0];DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 + DAC12ENC +DAC12CALON+DAC12OPS;//---------- enable SMCLK as 8MHz--------------P4DIR |= BIT1; // P4.1 outputP1DIR |= BIT0; // ACLK set out to pinsP1SEL |= BIT0;P3DIR |= BIT4; // SMCLK set out to pinsP3SEL |= BIT4;// Increase Vcore setting to level3 to support fsystem=25MHz// NOTE: Change core voltage one level at a time..SetVcoreUp (0x01);SetVcoreUp (0x02);SetVcoreUp (0x03);UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFOUCSCTL4 |= SELA_2; // Set ACLK = REFO__bis_SR_register(SCG0); // Disable the FLL control loopUCSCTL0 = 0x0000; // Set lowest possible DCOx, MODxUCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operationUCSCTL2 = FLLD_1 + 762; // Set DCO Multiplier for 25MHz// (N + 1) * FLLRef = Fdco// (762 + 1) * 32768 = 25MHz// Set FLL Div = fDCOCLK/2__bic_SR_register(SCG0); // Enable the FLL control loop// Worst‐case settling time for the DCO when the DCO ran ge bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in5xx// UG for optimization.// 32 x 32 x 25 MHz / 32,768 Hz ~ 780k MCLK cycles for DCO to settle __delay_cycles(782000);// Loop until XT1,XT2 & DCO stabilizes ‐ In this case only DCO has to stabilize do{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG; // Clear fault flags}while (SFRIFG1&OFIFG); // Test oscillator fault flag//-----------enable timerA CCR0 us SMCLK--------------TA0CCTL0 = CCIE; // CCR0 interrupt enabledTA0CCR0 = cnt_table[0];TA0CTL = TASSEL_2 + MC_1 + TACLR; //use SMCLk as setting 25MHzfor (;;){__bis_SR_register(CPUOFF + GIE); // Enter LPM0DAC12_0DAT=*sin_data_pr++;if (sin_data_pr >= &sin_table[180]){sin_data_pr = &sin_table[0];}// Positive rampDAC12_0DAT &= 0xFFF; // Modulo 4096}}void SetVcoreUp (unsigned int level){PMMCTL0_H = PMMPW_H; // Open PMM registers for write// Set SVS/SVM high side new levelSVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;// Set SVM low side to new levelSVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;while ((PMMIFG & SVSMLDLYIFG) == 0); // Wait till SVM is settledPMMIFG &= ~(SVMLVLRIFG + SVMLIFG); // Clear already set flagsPMMCTL0_L = PMMCOREV0 * level; // Set VCore to new levelif ((PMMIFG & SVMLIFG))while ((PMMIFG & SVMLVLRIFG) == 0); // Wait till new level reached// Set SVS/SVM low side to new levelSVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;// Lock PMM registers for write accessPMMCTL0_H = 0x00;}//--------timerA interruption---------#pragma vector=TIMER0_A0_VECTOR__interrupt void TIMER0_A0_ISR(void){__bic_SR_register_on_exit(CPUOFF);}//-------bottom interruption----------#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){__bic_SR_register_on_exit(CPUOFF);cnt_flg++;if (cnt_flg >= 10) cnt_flg = 0;LCD_Clear(); // 清屏LCDMEM[5] = char_gen[0];LCDMEM[4] = char_gen[0];if (cnt_flg == 9){LCDMEM[3] = char_gen[0];LCDMEM[2] = char_gen[1];}else LCDMEM[3] = char_gen[cnt_flg + 1];TA0CCR0 = cnt_table[cnt_flg];P2IFG &= ~BIT6;__bis_SR_register(CPUOFF + GIE);}实验现象分析:实验一:LCD显示屏上循环显示0到6,每次显示都为6个相同的数字,现象对应的代码为:实验二:实验板上扬声器放出周期为64us*360=0.023s的正弦波信号。

MSP430单片机AD转换

MSP430单片机AD转换

MSP430 单片机AD 转换
一。

简单介绍MSP430 ADC12 模块中是由以下部分组成:输入的16 路模拟开关(外部8 路,内部4 路),ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/触发源部分,ADC 数据输出部分,ADC 控制寄存
器等组成。

四种采样模式:
一。

简单介绍:
ADC12 模块中是由以下部分组成:输入的16 路模拟开关(外部8 路,内部4 路),ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/ 触发源部分,ADC 数据输出部分,ADC 控制寄存器等组成。

四种采样模式:
(1)单通道单次转换模式
(2)序列通道单词转换模式
(3)单通道多次转换模式。

MSP430AD转换

MSP430AD转换

MSP430AD转换对AD 转换的理解对SHI 加一个上升沿的信号则初始化AD 转换,An analog-to-digital conversion is initiatedwith a rising edge of the sampleinput signal SHI. The source for SHI is selected with the SHSx bits andincludes the following:The ADC12SC bit The Timer_A Output Unit 1The Timer_B OutputUnit 0The Timer_B Output Unit 1The polarity of the SHI signal source can be inverted with the ISSH bit. TheSAMPCON signal controls the sample period and start of conversion. WhenSAMPCON is high, sampling is active. The high-to-low SAMPCON transitionstarts the analog-to-digital conversion, which requires13 ADC12CLKcycles.Two different sample-timing methods are defined by control bit SHP, extendedsample mode and pulse mode其中扩展采样模式(SHP=0):即SHI 信号直接决定采样时间,参看DATASHEET 和时序图脉冲采样模式时,SHI 只负责输入一个上升沿信号来触发采样,而采样时间由ADC12CLK 及SH0_X 或SHT1_X 决定,转换存储器:MSP430 有16 个转换存储器,对应16 个8 位的存储控制寄存器,在储存控制寄存器ADC12MCTLX 中涉及到EOS, INCH,SREF。

MSP430ADDA转换器的应用

MSP430ADDA转换器的应用

第6章 A/D 、D/A 转换器的应用6.1 A/D 、D/A 转换器的工作原理 6.1.1 D/A 转换器的工作原理D/A 转换器(Digital to Analog Converter )是一种能把数字量转换成模拟量的电子器件;A/D 转换器(Analog to Digital Converter )则相反,它能把模拟量转换成相应的数字量。

在微机控制系统中,经常要用到A/D 和D/A 转换器。

D/A 转换器从工作原理分为T 型电阻网络、倒T 型电阻网络、权电阻网络几种形式。

倒T 型电阻网络的工作原理如图6.1所示。

图6.1 倒T 型电阻网络型D/A 转换器输出电压 的大小与数字量具有对应的关系。

D/A 转换器的主要性能指标:1) 分辨率是指输入数字量的最低有效位(LSB )发生变化时,所对应的输出模拟量(电压或电流)的变化量。

它反映了输出模拟量的最小变化值。

分辨率与输入数字量的位数有确定的关系,可以表示成FS/2n 。

FS 表示满量程输入值,n 为二进制位数。

对于5V 的满量程,采用8位的DAC 时,分辨率为5V/256=19.5mV ;当采用12位的DAC 时,分辨率则为5V/4096=1.22mV 。

显然,位数越多分辨率就越高。

765432102)线性度(也称非线性误差)是实际转换特性曲线与理想直线特性之间的最大偏差。

常以相对于满量程的百分数表示。

如±1%是指实际输出值与理论值之差在满刻度的±1%以内。

3)绝对精度(简称精度)是指在整个刻度范围内,任一输入数码所对应的模拟量实际输出值与理论值之间的最大误差。

绝对精度是由DAC的增益误差(当输入数码为全1时,实际输出值与理想输出值之差)、零点误差(数码输入为全0时,DAC的非零输出值)、非线性误差和噪声等引起的。

绝对精度(即最大误差)应小于1个LSB。

4)建立时间是指输入的数字量发生满刻度变化时,输出模拟信号达到满刻度值的±1/2LSB所需的时间。

【MSP430趣谈】MSP430第十二讲之ADC(上)

【MSP430趣谈】MSP430第十二讲之ADC(上)

【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_AD转换

MSP430_AD转换
12
ADC12 的功能模块( 6/ 11)
13
ADC12 的功能模块( 7/ 11)
4. 采样及转换所需的时序控制
采样和转换所需要的各种时钟信号: ADC12CLK转换时钟、 SAMPCON采样及转换信
号、SHT控制的采样周期 、 SHS控制的采样触发来源选 择 、ADC12SSEL选择的内核时钟源 及 ADC12DIV选择 的分频系数……
ADC12CTL1=SHP;
ADC12CTL0 |= ENC;
While(1)
{
ADC12CTL0 |=ADC12SC;
while((ADC12IFG&BIT0)==0)
_NOP( );
}
}
35
谢谢观看!!
36
控制寄存器 ADC12MEM0 ~
ADC12MEM15
寄存器的含义 转换控制寄存器0 转换控制寄存器1 中断标志寄存器 中断使能寄存器 中断向量寄存器 存储控制寄存器0~15
存储寄存器0~15
18
ADC12的相关寄存器(2 / 15)
1. 转换控制寄存器
① ADC12CTL0
转换控制寄存器0
19
ADC12的相关寄存器( 3/ 15)
VR+(有3种):A VCC (模拟电源正端) V REF+ (A/D转换器内部参考电源的输出正端) V eREF+ (外部参考电源的正输入端)
V R-(有2种):A VSS (模拟电源负端) V REF- 或 V eREF- (A/D转换器内部或者外
部参考电源负端)
8
ADC12 的功能模块( 2/ 11)
应的中断标志; • ADC12MCTLx寄
存器中定义了通道 和参考电压。

第9章MSP430模数转换ADC

第9章MSP430模数转换ADC

模拟



1

1






n
n





1

1
多 路
采 样 保







器ห้องสมุดไป่ตู้

n
n

A/D


音频、视频信号
数字通信
3
第二节 模/数转换器
一、A/D 转换器的基本原理 二、MSP430 ADC12介绍
4
一、A/D 转换器的基本原理
数字输出量
A/D转换器
模拟输入量
数字输出量 011 010 001
单通道单次转换方式
通道序列单轮转换方式 单通道重复转换方式
通道序列重复转换方式
45
常用转换方式——通道序列单轮转换方式
每一轮通道序列中第一通道的采样和转换都由定时器 (TA1/TB0/TB1)启动,然后由采样定时器自动启动后续 通道的快速采样和转换,直到EOS=1的通道转换完毕,完 成第一轮。
采样间隔
.10~11
ADC12CTL0
ADC12CTL1
29
采样方式选择
SHP=0 , SAMPCON=SHI ,非采样定时器采样方式
(Extended Sample Mode) SHP=1 , SAMPCON=采样定时器输出,采样定时器采样方式
(Pulse Sample Mode)
30
非采样定时器采样方式(Extended Sample Mode)
0
0
0
1
1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

M S P430单片机A D转换实验A/D转换实验一、转换原理MSP430F149的A/D转换器原理请参考相关书籍。

实验板上与AD相关的硬件电路:编程工作实际就是对以下寄存器的操作:寄存器类型寄存器缩写寄存器的含义转换控制寄存器ADC12CTL0 转换控制寄存器0 ADC12CTL1 转换控制寄存器1中断控制寄存器ADC12IFG 中断标志寄存器ADC12IE 中断使能寄存器ADC12IV 中断向量寄存器存储及其控制寄存器ADC12MCTL0 ~ADC12MCTL15存储控制寄存器0~15ADC12MEM0 ~ADC12MEM15存储寄存器0~15设计主程序和中断服务程序。

二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。

“main.c”主程序与中断程序:/*********************************************************程序功能:将ADC对P6.0端口电压的转换结果按转换数据和对应的模拟电压的形式通过串口发送到PC机屏幕上显示-----------------------------------------------------------通信格式:N.8.1, 9600-----------------------------------------------------------测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据**********************************************************/#include <msp430.h>#include "allfunc.h"#include "UART0_Func.c"#include "ADC_Func.c"#define Num_of_Results 32uint results[Num_of_Results]; //保存ADC转换结果的数组uint average;uchar tcnt = 0;/***********************主函数***********************/void main( void ){uchar i;uchar buffer[5];WDTCTL = WDTPW + WDTHOLD; //关狗/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换P6DIR|=BIT6;P6OUT&=~BIT6; //关闭数码管显示 InitUART();Init_ADC();_EINT();buffer[4] = '\0';while(1){LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The digital value is: ");PutString(buffer);Trans_val(average,buffer);buffer[3] = buffer[2];buffer[2] = buffer[1];buffer[1] = 0x2e - 0x30;for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The analog value is: ");PutString(buffer);}}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6.0口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results){uchar i;average = 0;for(i = 0; i < Num_of_Results; i++){average += results[i];}average >>= 5; //除以32index = 0;tcnt++;if(tcnt == 250) //主要是降低串口发送速度{LPM1_EXIT;tcnt = 0;}}}“ADC_Func.c” A/D转换相关程序:#include <msp430.h>typedef unsigned int uint;/********************************************函数名称:Init_ADC功能:初始化ADC参数:无返回值:无********************************************/void Init_ADC(void){P6SEL |= 0x01; // 使能ADC通道ADC12CTL0 = ADC12ON+SHT0_15+MSC; // 打开ADC,设置采样时间 ADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器ADC12IE = 0x01; // 使能ADC中断ADC12CTL0 |= ENC; // 使能转换ADC12CTL0 |= ADC12SC; // 开始转换}/********************************************函数名称:Hex2Dec功能:将16进制ADC转换数据变换成十进制表示形式参数:Hex_Val--16进制数据ptr--指向存放转换结果的指针返回值:无********************************************/void Hex2Dec(uint Hex_val,uchar *ptr){ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100;ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);}/*******************************************函数名称:Trans_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_Val--16进制数据返回值:无********************************************/void Trans_val(uint Hex_Val,uchar *ptr){unsigned long caltmp;uint Curr_Volt;uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n ptr[0] = Curr_Volt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“UART0_Func.c”串口程序:#include <msp430.h>typedef unsigned char uchar;/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= URXE0 + UTXE0; // Enable USART0 T/RXD UCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 - 3.41UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machine }/*******************************************函数名称:Send1Char功能:向PC机发送一个字符参数:sendchar--要发送的字符返回值:无********************************************/void Send1Char(uchar sendchar){while (!(IFG1 & UTXIFG0)); //等待发送寄存器为空TXBUF0 = sendchar;}/*******************************************函数名称:PutSting功能:向PC机发送字符串并换行指令参数:ptr--指向发送字符串的指针返回值:无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; //发送换行指令}/******************************************* 函数名称:PutSting0功能:向PC机发送字符串,无换行参数:ptr--指向发送字符串的指针返回值:无********************************************/ void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据}}2、程序2:转换结果显示在1602显示模块上“main.c”程序#include <msp430x14x.h>#include "cry1602.h"typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = P6.3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = P6.4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = P6.5#define SET_EN P6OUT|=BIT5;/******************************************* 函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数:x--位置的列坐标y--位置的行坐标n--字符个数ptr--指向字符存放位置的指针返回值:无********************************************/ void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y ^= 1;}}}/******************************************* 函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x--位置的列坐标y--位置的行坐标返回值:无********************************************/ void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; //如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);}/******************************************* 函数名称:Disp1Char功能:在某个位置显示一个字符参数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data){LocateXY( x, y );LcdWriteData( data );}/******************************************* 函数名称:LcdReset功能:对1602液晶模块进行复位操作参数:无返回值:无********************************************/ void LcdReset(void){CtrlDir |= 0x07; //控制线端口设为输出状态DataDir = 0xFF; //数据端口设为输出状态LcdWriteCommand(0x38, 0); //规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); //显示模式设置LcdWriteCommand(0x08, 1); //显示关闭LcdWriteCommand(0x01, 1); //显示清屏LcdWriteCommand(0x06, 1); //写字符时整体不移动LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁}/*******************************************函数名称:LcdWriteCommand功能:向液晶模块写入命令参数:cmd--命令,chk--是否判忙的标志,1:判忙,0:不判返回值:无********************************************/void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data--显示字符数据返回值:无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602液晶完成内部操作参数:无返回值:无********************************************/ void WaitForEnable(void){P2DIR &= 0x00; //将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); //检测忙标志CLR_EN;P2DIR |= 0xFF; //将P4口切换为输出状态}/******************************************* 函数名称:Delay5ms功能:延时约5ms参数:无返回值:无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms功能:延时约400ms参数:无返回值:无********************************************/ void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}“cry1602.c”程序#include <msp430x14x.h>#include "cry1602.h"typedef unsigned char uchar;typedef unsigned int uint;/**************宏定义***************/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3; //RS = P6.3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = P6.4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = P6.5#define SET_EN P6OUT|=BIT5;/*******************************************函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参数:x--位置的列坐标y--位置的行坐标n--字符个数ptr--指向字符存放位置的指针返回值:无********************************************/ void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y ^= 1;}}}/******************************************* 函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x--位置的列坐标y--位置的行坐标返回值:无********************************************/ void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; //如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功能:在某个位置显示一个字符参数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data){LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功能:对1602液晶模块进行复位操作参数:无返回值:无********************************************/ void LcdReset(void){CtrlDir |= 0x07; //控制线端口设为输出状态 DataDir = 0xFF; //数据端口设为输出状态LcdWriteCommand(0x38, 0); //规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); //显示模式设置LcdWriteCommand(0x08, 1); //显示关闭LcdWriteCommand(0x01, 1); //显示清屏LcdWriteCommand(0x06, 1); //写字符时整体不移动LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁}/*******************************************函数名称:LcdWriteCommand功能:向液晶模块写入命令参数:cmd--命令,chk--是否判忙的标志,1:判忙,0:不判返回值:无********************************************/void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/******************************************* 函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data--显示字符数据返回值:无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/******************************************* 函数名称:WaitForEnable功能:等待1602液晶完成内部操作参数:无返回值:无********************************************/ void WaitForEnable(void){P2DIR &= 0x00; //将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); //检测忙标志CLR_EN;P2DIR |= 0xFF; //将P4口切换为输出状态}/******************************************* 函数名称:Delay5ms功能:延时约5ms参数:无返回值:无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms精品资料功能:延时约400ms参数:无返回值:无********************************************/ void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}仅供学习与交流,如有侵权请联系网站删除谢谢21。

相关文档
最新文档