基于MSP430单片机的数字电压表的设计0300V.docx
《基于MSP430单片机的数字电压表的设计0300V.docx》由会员分享,可在线阅读,更多相关《基于MSP430单片机的数字电压表的设计0300V.docx(14页珍藏版)》请在冰豆网上搜索。
基于MSP430单片机的数字电压表的设计0300V
测控技术与仪器专业课程设计
报告
题目:
基于430单片机的数字电压表
的设计(交直流电压0—300V)
班级:
XXXXXX班
姓名:
XXX
学号:
XXXXXX
起始时间:
2014年3月6日至3月20日
一、对题目的认识和理解
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
最近的几十年来,随着半导体技术、集成电路和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。
数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化,另一方面,精度也从0.01%-0.005%。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上都满足了电压测量精度的要求,而一款功耗低设计精巧的电压表将越来越收人们的青睐,因此,对于设计低功耗,设计精巧的数字式电压表也是电压设计的一个重要研究方向。
二、方案论证与比较
数字电压表有多种的设计方法,方案是多种多样的,由于大规模集成电路数字芯片的高速发展,各种数字芯片品种多样,导致对模拟数据的采集部分的不一致性,进而又使对数据的处理及显示的方式的多样性。
又由于在现实的工作生活中,电压表的测量测程范围是比较大的,所以必须要对输入电压作分压处理,而各个数据处理芯片的处理电压范围不同,则各种方案的分段也不同。
下面介绍三种数字电压表的设计方案。
方案一:
这种设计方案是由模拟电路与数字电路两大部分组成,模拟部分包括输入放大器、A/D转换器和基准电压源;数字部分包括计数器、译码器、逻辑控制器、振荡器和显示器。
其中,A/D转换器是它的核心器件,它将输入的模拟量转换成数字量。
模拟电路和数字电路是相互联系的,由逻辑控制电路产生控制信号,按规定的时序将A/D转换器中个组模拟开关接通或断开,保证A/D转换正常进行。
A/D转换结果通过计数译码电路变换成段码,最后驱动显示器显示出相应的数值。
此方案设计其优点是,设计成本低,能够满足一般的电压测量。
但设计不灵活,都是采用纯硬件电路。
很难将其在原有的基础上进行扩展。
方案二:
这种方案是利用单片机系统与模数转换芯片、显示模块等的结合构建数字电压表。
由于单片机的发展已经成熟,利用单片机系统的软硬件结合,可以组装出许多的应用电路来。
此方案的原理是模数(A/D)转换芯片的基准电压端,被测量电压输入端分别输入基准电压和被测电压。
模数(A/D)转换芯片将被测量电压输入端所采集到的模拟电压信号转换成相应的数字信号,然后通过对单片机系统进行软件编程,使单片机系统能按规定的时序来采集这些数字信号,通过一定的算法计算出被测量电压的值。
最后单片机系统将计算好了的被测电压值按一定的时序送入显示电路模块加以显示。
此方案不仅能够继承上一种方案的各种优点,还能改进上一种设计方案设计不灵活,难与在原基础上进行功能扩展等不足。
方案三:
基于MSP430G2553单片机为主控芯片,12位A/D转换器在单片机内部集成。
通过程序来控制模拟开关选择适当的电压取样电路,将输入的电压取样,取到的电压通过430单片机内部集成的A/D转换器实现模拟量向数字量的转换,然后再经过单片机程序的处理计算最终通过低功耗高亮度数码管来将电压值显示出来。
方案用模拟开关替代继电器减少了硬件的负担和准确快速性,通过程序来控制和计算电压值并显示可以达到稳定和可操作性强的目的,所以最终选择方案三。
模拟电压信号经过档位切换到不同的分压电路衰减后,经隔离干扰通过转换开关控制,若测量直流电压直接送到单片机进行A/D转换,若测量交流电压有效值经真有效值转换器后送单片机进行A/D转换,然后进行数据处理,处理后的数据送到LED中显示。
结合以上几种方案分析与比较,本设计选用第三种设计方案。
三、单元电路(含传感器选型和电路)的设计与说明
1、单片机最小系统
如上图所示,最小系统由MSP430G2553,复位电路,震荡电路组成。
MSP430G2553是系统设计的核心器件。
通过程序控制,由自带的10位AD转换电路完成电压的采集,对采集信息处理换算后,采用模拟SPI模式把电压发信息至LED显示。
单片机最小系统端端口定义如下表。
引脚号
引脚名
接口说明
备注
1
VCC
电源正端
3.3V
2
P10
OLEDSCL
OLED串行通信时钟
4
P11
OLEDSDA
OLED串行数据
5
P12
OLEDRST
OLED复位
6
P13
OLEDDC
11
P14
按键
16
RST
复位
20
GND
电源地
2、输入电路部分
输入电路部分的作用是把不同量程的被测的电压规范到测量所要求的电压值0-
±0.2V。
9M、900K、90K、和10K电阻构成1/10、1/100、1/1000的衰减器。
输入衰减电路可由开关来选择不同的衰减率,从而切换档位。
在输入电路中当信号衰减后还应该通过直流、交流档位控制开关,控制被测信号接入相应测量通道。
交流信号经过有效值转换电路送入A/D转换电路,直流信号直接送入A/D转换电路。
3、真有效值转换电路
真有效值转换器AD736,AD736是经过激光修正的单片精密真有效值AC/DC转换器。
其主要特点是准确度高、灵敏性好(满量程为200mVRMS)、测量速率快、频率特性好(工作频率范围可达0~460kHz)、输入阻抗高、输出阻抗低、电源范围宽且功耗低最大的电源工作电流为200μA.用它来测量正弦波电压的综合误差不超过±3%。
4、模拟开关自动切换参考电压电路
程序中通过判断不同的电压量程来决定模拟开关CD4052的通道和选通位置,然后自动切换到相应的档位,实现了0-300V的数字电压表的自动切换量程的功能。
5、电源电路
电源电路电压从P2端口输入。
通过拨动开关s控制电路的供电与断电。
MSP430G2553单片机和LED显示模块工作电压均为3.3V,所以使用1117A系列3.3V的稳压芯片进行稳压输出。
1117A33稳压芯片输入电压范围4.75~15V,输入调整率0.2%,负载调整率0.4%,最大输出电流1A.满足了本设计要求。
LED1为电源指示灯,可通过灯的亮灭来判断电源电路是否正常工作。
6、自动切换量程部分
通过计算电阻分压,将输入电压永远通过分压后得到2v的标准电压可供真有效值模块工作,然后通过模拟开关来切继电器来达到量程的自动选择。
7、LED显示接口电路
LED显示模块接口与单片机通信采用模拟SPI方式,减少了单片机I/O口的消耗,同时使电路变的更简单。
四、监控软件设计与说明
监控软件通过IAR_EW430环境来编写,主要模块程序设计思路如下。
1、主函数
主函数的流程框图如图1所示。
主函数主要是调用系统初始化函数和循环开启ADC转换,这是由于ADC10采用单通道单次转换模式,每次采样后需要重新开启ADC,才会进行下一次信号采样转换。
另外,信号的采样与处理以及电压值的显示都是通过中断来完成。
2、系统初始化函数
系统初始化的流程框图如图2所示。
该函数对看门狗的工作模式、所需的I/O口以及ADC10和OLED显示进行定义或初始化配置。
3、ADC初始化函数
ADC初始化的流程框图如图3所示。
该函数的任务是对转换控制寄存器ADC10CTL0和ADC10CTL1的初始化配置。
其中,ADC10CTL0需要配置的是ADC10的开关、采样周期、参考电压、ADC10中断使能;而ADC10CTL1则只需要对外部采样通道和ADC的工作模式进行选择。
4、LED屏初始化
LED显示屏初始化的流程框图如图4所示。
完成对LED写命令和LED显示屏界面的初始化。
五、其它需要说明的问题
对于本电压数字智能表,测量直流和交流的时候分别对应的硬件电路略微有所不同,需要注意。
六、附录(包括电路原理图、程序流程图、程序清单、参考资料清单等)
1、整体电路原理图
2、程序流程图:
3、程序代码
/******************************************************************/
/*数字式交直流电压表*/
/******************************************************************/
#include"io430.h"
#include"codetab.h"
#include"LQ12864.h"
#defineXLevelL0x00
#defineXLevelH0x10
#defineXLevel((XLevelH&0x0F)*16+XLevelL)
#defineMax_Column128
#defineMax_Row64
#defineBrightness0xCF
#defineX_WIDTH128
#defineY_WIDTH64
#defineuintunsignedint
#defineucharunsignedchar
#defineBIT(x)(1<<(x))
voidSystem_Init(void);
voidADC_Init(void);
voidDelay_nms(uintn);
longintVoltage1,Voltage2;//全局变量Voltage1,Voltage2
uintVoltage_Range;
unsignedchar*table[]={"0","1","2","3","4","5","6","7","8","9"};
/***********************延时函数*************************/
voidDelayms(uintn)
{
uchari;
while(n--)
for(i=0;i<115;i++);
}
/*********************************************************
函数功能:
系统初始化
入口参数:
无
出口参数:
无
函数说明:
无
*********************************************************/
voidSystem_Init(void)
{
WDTCTL=WDTPW+WDTHOLD;
BCSCTL1&=~XT2OFF;
BCSCTL3+=XT2S_2;
do
{
for(inti=0xff;i>0;i--);
IFG1&=~OFIFG;
}
while((IFG1&OFIFG)!
=0);
BCSCTL2=0X00;
BCSCTL2+=SELM1;
BCSCTL2+=SELS;
WDTCTL=WDT_ADLY_250;//看门狗工作在定时器模式,1s中断一次
IE1|=WDTIE;//使能看门狗中断
P1DIR|=BIT0+BIT1+BIT2+BIT3;//相应的位端口设置为输出
P1SEL|=BIT4;//P1.4为A4通道
Delayms(40);
LCD_Init();//oled初始化
ADC_Init();//ADC初始化;
}
/*********************************************************
函数功能:
ADC初始化
入口参数:
无
出口参数:
无
函数说明:
无
*********************************************************/
voidADC_Init(void)
{
ADC10CTL0&=~ENC;//复位转换允许位
ADC10CTL0|=ADC10ON+ADC10SHT_0+SREF_0+ADC10IE;
//设置转换控制寄存器ADC10CTL0,ADC10ON=0x010,使ADC10内核工作
//ADC10SHT_0=0*0x800u,确定采样周期为4xADC10CLKs
//SREF_0=0*0x2000u,选择参考电压为VR+=AVCC,VR-=AVSS
//ADC10IE=0x00使对应通道转换后产生中断
ADC10CTL1|=INCH_4+CONSEQ_0;
//设置AD转换控制寄存器ADC10CTL1,INCH_0=0*0x1000u,选择通道A4
//CONSEQ_1=1*2u,设置工作模式为单通道、单次转换模式
ADC10CTL0|=ENC+ADC10SC;
//设置转换控制寄存器ADC12CTL0,ENC=0x002使转换允许位为1
//ADC12SC=0x001使采样/转换控制位为1
_EINT();//总中断使能
}
/***************************ADC中断函数****************************/
#pragmavector=ADC10_VECTOR
__interruptvoidADC10_Interrupt(void)
{
uintdata;
data=ADC10MEM;//将AD采样值存入data
Voltage1=(uint)(33.3*data/10.23);//V(实际)=(VR+-VR-)*data/1023+VR-Voltage是实际电压值的1000倍
Voltage2=(uint)(33.3*data/10.23*4.0);
P1OUT|=BIT5;
Delayms(400);
P1OUT&=~BIT5;
}
/***************************WDT中断函数****************************/
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
longintnum1,num2;
uintge1,fen1,bfen1,qfen1;
uintshi2,ge2,fen2,bfen2,qfen2;
num1=Voltage1;
num2=Voltage2;
ge1=(num1/1000)%10;//个位
fen1=(num1/100)%10;//十分位
bfen1=num1/10%10;//百分位
qfen1=num1%10;//千分位
//LCD_P8x16Str(60,2,table[shi1]);
LCD_P8x16Str(68,2,table[ge1]);
LCD_P8x16Str(84,2,table[fen1]);
LCD_P8x16Str(92,2,table[bfen1]);
LCD_P8x16Str(100,2,table[qfen1]);
shi2=(num2/10000)%10;//十位
ge2=(num2/1000)%10;//个位
fen2=(num2/100)%10;//十分位
bfen2=num2/10%10;//百分位
qfen2=num2%10;//千分位
LCD_P8x16Str(60,4,table[shi2]);
LCD_P8x16Str(68,4,table[ge2]);
LCD_P8x16Str(84,4,table[fen2]);
LCD_P8x16Str(92,4,table[bfen2]);
LCD_P8x16Str(100,4,table[qfen2]);
}
voidmain(void)
{
inti;
System_Init();
for(i=0;i<8;i++)//显示“桂林电子科技大学”
{
LCD_P16x16Ch(i*16,0,i);
}
for(i=10;i<12;i++)//显示“电压”
{
LCD_P16x16Ch((i-10)*16,2,i);
}
for(i=10;i<12;i++)//显示“电压”
{
LCD_P16x16Ch((i-10)*16,4,i);
}
LCD_P8x16Str(32,2,"1.V");//初始化电压显示格式
LCD_P8x16Str(32,4,"2.V");
while
(1)
{
ADC10CTL0|=ENC+ADC10SC;//开启ADC转换
}
}
4、参考资料
[1]孙肖子.模拟电子电路及技术基础.西安电子科技大学出版社
[2]MSP430系列单片机系统工程设计与实践谢凯赵建编著
[3]洪利.MSP430单片机原理与应用实例详解.北京航空航天大学出版社
[4]王晓亮.基于MS430单片机的数字电压表的设计.科学出版社