数字电压表.docx
- 文档编号:18227960
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:25
- 大小:532.84KB
数字电压表.docx
《数字电压表.docx》由会员分享,可在线阅读,更多相关《数字电压表.docx(25页珍藏版)》请在冰点文库上搜索。
数字电压表
数
字
电
压
表
目录
一、基本功能4
二、方案论证与比较4
二、MSP430F149单片机介绍6
1.简单概述6
2、MSP430F149主要特点6
3、MSP430F149芯片引脚功能介绍7
三、单元电路8
1、单片机最小系统8
2、电源电路9
3、RS232串行通迅电路图9
4、ADC输入电路图10
5、液晶接口10
四、软件设计与说明11
1、主函数11
2、系统初始化函数11
3、ADC初始化函数11
4、LED屏初始化11
五、软件设计总体流程图12
六、程序代码13
七、软件调试20
八、谢辞20
九、附件21
1、MSP430开发板整体原理图21
2、实物图22
十、参考文献23
摘要
数字电压表是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表,它是诸多数字化仪表的核心与基础。
以数字电压表为核心扩展成的各种数字化仪表几乎覆盖了电子电工测量、工业测量、自动化系统等各个领域。
本文介绍了一种基于TI公司生产的16位超低功耗单片机MSP430F149的数字电压表系统,系统利用单片机内嵌的12位A/D模块采集测量的电压信号,经过A/D转换、软件滤波和标度转换处理后,将测量的电压值实时显示在LCD显示器上。
文中详细介绍了系统软件模块的程序设计,包括A/D转换模块,数据处理模块及显示模块的设计。
本文设计的数字电压表系统可以测量0-3.3V的1路模拟直流输入电压值,并通过LCD显示器实时显示。
系统具有体积小、成本低,电路简单,安全性好,可扩展性强等特点。
关键词:
数字电压表;MSP430F149;LCD显示器;A/D转换
一、基本功能
1、测量直流电压(范围外测0~20V,内测0~3.3V)
2、能进行串口通讯
3、能够在液晶(LCD12864)显示屏上显示
二、方案论证与比较
数字电压表有多种的设计方法,方案是多种多样的,由于大规模集成电路数字芯片的高速发展,各种数字芯片品种多样,导致对模拟数据的采集部分的不一致性,进而又使对数据的处理及显示的方式的多样性。
又由于在现实的工作生活中,电压表的测量测程范围是比较大的,所以必须要对输入电压作分压处理,而各个数据处理芯片的处理电压范围不同,则各种方案的分段也不同。
下面介绍三种数字电压表的设计方案。
方案一:
这种设计方案是由模拟电路与数字电路两大部分组成,模拟部分包括输入放大器、A/D转换器和基准电压源;数字部分包括计数器、译码器、逻辑控制器、振荡器和显示器。
其中,A/D转换器是它的核心器件,它将输入的模拟量转换成数字量。
模拟电路和数字电路是相互联系的,由逻辑控制电路产生控制信号,按规定的时序将A/D转换器中个组模拟开关接通或断开,保证A/转换正常进行。
A/D转换结果通过计数译码电路变换成段码,最后驱动显示器显示出相应的数值。
此方案设计其优点是,设计成本低,能够满足一般的电压测量。
但设计不灵活,都是采用纯硬件电路。
很难将其在原有的基础上进行扩展。
方案二:
这种方案是利用单片机系统与模数转换芯片、显示模块等的结合构建数字电压表。
由于单片机的发展已经成熟,利用单片机系统的软硬件结合,可以组装出许多的应用电路来。
此方案的原理是模数(A/D)转换芯片的基准电压端,被测量电压输入端分别输入基准电压和被测电压。
模数(A/D)转换芯片将被测量电压输入端所采集到的模拟电压信号转换成相应的数字信号,然后通过对单片机系统进行软件编程,使单片机系统能按规定的时序来采集这些数字信号,通过一定的算法计算出被测量电压的值。
最后单片
机系统将计算好了的被测电压值按一定的时序送入显示电路模块加以显示。
此方案不仅能够继承上一种方案的各种优点,还能改进上一种设计方案设计不灵活,难与在原基础
上进行功能扩展等不足。
方案三:
基于MSP430F149单片机为主控芯片,12位A/D转换器在单片机内部集成。
通过程序来控制模拟开关选择适当的电压取样电路,将输入的电压取样,取到的电压通过单片机内部集成的A/D转换器实现模拟量向数字量的转换,然后再经过单片机程序的处理计算最终通过低功耗可调节亮度的LCD12864来将电压值显示出来。
方案用模拟开关替代继电器减少了硬件的负担和准确快速性,通过程序来控制和计算电压值并显示可以达到稳定和可操作性强的目的,所以最终选择方案三。
模拟电压信号经过档位切换到不同的分压电路衰减后,经隔离干扰通过转换开关控制,若测量直流电压直接送到单片机进行A/D 转换,若测量交流电压有效值经真有效值转换器后送单片机进行A/D 转换,然后进行数据处理,处理后的数据送到LED 中显示。
结合以上几种方案分析与比较,本设计选用第三种设计方案。
二、MSP430F149单片机介绍
1.简单概述
MSP430F149芯片是美国TI公司推出的超低功耗微处理器,有60KB+256字节FLASH,2KBRAM,包括基本时钟模块、看门狗定时器、带3个捕获/比较寄存器和PWM输出的16位定时器、带7个捕获/比较寄存器和PWM输出的l6位定时器、2个具有中断功能的8位并行端口、4个8位并行端口、模拟比较器、12位A/D转换器、2个串行通信接口等模块。
2、MSP430F149主要特点
1)低功耗:
电压1.8~3.6V低电压,RAM数据保持方式下耗电仅0.1pA,活动模式下耗电250pA/MIPS(MIPS:
每秒百万条指令数),I/O输入端口的漏电流最大仅50nA。
2)强大的处理能力:
MSP430系列单片机采用了目前流行的精简指令集(RISC)结构,一个时钟周期可以执行一条指令,因此在8MHz晶振工作时,指令速度可达到8MIPS。
3)丰富的片上外围模块:
MSP430系列单片机结合TI的高性能模拟技术,各成员都集成了较丰富的片内外设,具体到MSP430F149单片机有以下功能模块:
看门狗(WDT),模拟比较器A,定时器A(TimerA),定时器B(TimerB),串口,1(USART0,1),硬件乘法器,液晶驱动器,12位ADC,直接数据存取(DMA),端口l-6(P1~P6),基本定时器。
4)系统工作稳定:
MSP430系列单片机均为工业级器件,运行环境温度为-40一+85℃,运行稳定、可靠性高,所设计的产品适用于各种民用和工业环境。
5)方便高效的开发环境:
因为器件片内有JTAG调试接口,还有可电擦写的FLASH存储器,因此采用先通过JTAG接口下载程序到FLASH内,再由JTAG接口控制程序运行、读取片内CPU状态,以及存储器内容等信息供设计者调试,整个开发(编译、调试)都可以在同一个软件集成环境中进行。
3、MSP430F149芯片引脚功能介绍
MSP430F149芯片设计时的封装方式为贴片式封装,64个引脚,引脚间距为0.5mm,单片机面积很小很难手工焊接,所以够买的是带有转接板的单片机,贴片式的单片机转接成4列2*8排针的引脚,排针脚间距约为2.54mm,能与万能板匹配。
三、单元电路
1、单片机最小系统
如图所示,最小系统由 MSP430F149,复位电路,震荡电路组MSP430F149是系统设计的核心器件。
通过程序控制,由自带的10位AD转换电路完成电压的采集,对采集信息处理换算后,采用模拟SPI模式把电压发信息至LED显示。
2、电源电路
3、RS232串行通迅电路图
4、ADC输入电路图
通过滑动变阻器VR1改变电阻值,通过电阻值从而改变电压值测量内部直流电压范围在0~3.3V。
5、液晶接口
LED显示接口电路LED显示模块接口与单片机通信采用模拟SPI方式,减少了单片机I/O口的消耗,同时使电路变的更简单。
四、软件设计与说明
1、主函数
主函数主要是调用系统初始化函数和循环开启ADC转换,这是由于ADC10采用单通道单次转换模式,每次采样后需要重新开启ADC,才会进行下一次信号采样转换。
另外,信号的采样与处理以及电压值的显示都是通过中断来完成。
2、系统初始化函数
该函数对看门狗的工作模式、所需的I/O口以及ADC10和OLED显示进行定义或初始化配置。
3、ADC初始化函数
该函数的任务是对转换控制寄存器ADC10CTL0和ADC10CTL1的初始化配置。
其中,ADC10CTL0需要配置的是ADC10的开关、采样周期、参考电压、ADC10中断使能;而ADC10CTL1则只需要对外部采样通道和ADC的工作模式进行选择。
4、LED屏初始化
LED显示屏初始化完成对LED写命令和LED显示屏界面的初始化。
五、软件设计总体流程图
根据模块划分原则,将改程序划分为初始化模块、A/D转换子程序、LCD显示子程序,这三个程序模块构成了整个系统软件的主程序,软件设计总体流程图如图
总体流程图
六、程序代码
/*
ADC实验
说明:
1路AD单次采集(采用串口调试助手显示)
用串口调试助手向单片机发送AD命令,单片机
接收到命令后将读取ADC0的电压值返回给计算
机在串口调试助手上显示.
注意事项:
使用串口调试助手发送AD命令时要设置为十六进制发送
在发送框内输入AD然后点击发送
*/
#include
#defineuintunsignedint
#defineucharunsignedchar
externconstunsignedcharshuzi_table[];
#defineLCD_DataInP5DIR=0x00//数据口方向设置为输入
#defineLCD_DataOutP5DIR=0xff//数据口方向设置为输出
#defineLCD2MCU_DataP5IN
#defineMCU2LCD_DataP5OUT
#defineLCD_CMDOutP4DIR|=0x0F//P3口的低三位设置为输出
#defineLCD_RS_HP4OUT|=BIT0//P3.0
#defineLCD_RS_LP4OUT&=~BIT0//P3.0
#defineLCD_RW_HP4OUT|=BIT1//P3.1
#defineLCD_RW_LP4OUT&=~BIT1//P3.1
#defineLCD_EN_HP4OUT|=BIT2//P3.2
#defineLCD_EN_LP4OUT&=~BIT2//P3.2
#defineLCD_PSB_PP4OUT|=BIT3
#defineLCD_PSB_SP4OUT&=~BIT3
voidDelay_1ms(void);
voidDelay_Nms(uintn);
voidDelay(unsignedintn);
voidWrite_Cmd(unsignedcharcod);
voidWrite_Data(unsignedchardat);
voidIni_Lcd(void);
voidDisp_HZ(unsignedcharaddr,constunsignedchar*pt,unsignedcharnum);
voidDisp_HZ1(ucharaddr1,constuchar*pt1,ucharnum1);
voidDisp_ND(unsignedcharaddr,unsignedintthickness);
voidDraw_TX(unsignedcharYaddr,unsignedcharXaddr,constunsignedchar*dp);
voidDraw_PM(constunsignedchar*ptr);
voidDisp_HZs(void);
uchartemp=0,s=0,gw,sw,gw1,sw1,gw2,sw2;
ucharhang1[]={"电压:
0.0v"};
constucharhang2[]={""};
constucharhang3[]={"LCD12864TEST"};
constucharhang4[]={""};
constucharhang5[]={'0','1','2','3','4','5','6','7'};
//,'8','9','a','b','c','d','e','f'};
ucharad0[]="电压:
0.0V";
ucharflag=1;
uinttemp0;
/*
函数名称:
Delay_1ms
功能:
延时约1ms的时间
参数:
无
返回值:
无
*/
voidDelay_1ms(void)
{
uchari;
for(i=150;i>0;i--)_NOP();
}
/*
函数名称:
Delay_Nms
功能:
延时N个1ms的时间
参数:
n--延时长度
返回值:
无
*/
voidDelay_Nms(uintn)
{
uinti;
for(i=n;i>0;i--)Delay_1ms();
}
/*函数名称:
delay
功能:
延时
参数:
无
返回值:
无
*/
voiddelay(unsignedintx)
{
while(x--);
}
/*函数名称:
Init_UART
功能:
初始化UART
参数:
无
返回值:
无
*/
voidInit_UART(void)
{
P3SEL|=0x30;//P3.4,5=USART0TXD/RXD
P3DIR|=BIT4;
UCTL0&=~SWRST;//InitializeUSARTstatemachine
ME1|=UTXE0+URXE0;//EnableUSART0TXD/RXD
UCTL0|=CHAR;//8-bitcharacter
UTCTL0|=SSEL1;//UCLK=SMCLK
UBR00=0X41;//8M时波特率9600
UBR10=0X03;
UMCTL0=0xC0;
IE1|=URXIE0;//EnableUSART0RXinterrupt
_BIS_SR(GIE);//Enterinterrupt
}
/*函数名称:
Init_Clk
功能:
初始化系统钟为XT2外部8M
参数:
无
返回值:
无
*/
voidInit_Clk(void)
{
uchari;
BCSCTL1&=~XT2OFF;//打开XT振荡器
do
{
IFG1&=~OFIFG;//清除振荡错误标志
for(i=0;i<100;i++)
_NOP();//延时等待
}
while((IFG1&OFIFG)!
=0);//如果标志为1继续循环等待
IFG1&=~OFIFG;
BCSCTL2|=SELM1+SELS;//MCLK8MandSMCLK1M
}
/*
函数名称:
Trans_val
功能:
将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参数:
Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值:
无
*/
voidInit_ADC()
{
P6SEL|=0X01;//信号采集端口选择第二功能
ADC12CTL0=ADC12ON+SHT0_8+MSC;//打开ADC+设置采样时间
ADC12CTL1=SHP+CONSEQ_1;//使用采样时序电路信号+单路多次模式
//上面的寄存器配置采样保持触发源选择时ADC12SC,采集信号使用采样时序电路产生的信号
//转换模式为单路单次转换上面的设置必须在ENC=0的情况下设置
//参考电压默认为AVCC3.3V
ADC12MCTL0=INCH_0;
ADC12IE=BIT7;//使能ADC中断
ADC12CTL0|=ENC;//使能转换
}
/*函数名称:
Trans_val
功能:
将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在接收到AD查询命令时送回串口调试助手上显示
参数:
Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值:
无
*/
voidTrans_val(ucharptr[10],uintHex_Val)
{unsignedlongcaltmp;
uintCurr_Volt;
caltmp=Hex_Val;
caltmp=(caltmp<<5)+Hex_Val;
Curr_Volt=caltmp>>12;
//参考电压为3.3V,所以计算公式应该为Hex_val*3.3/2^n
//乘除计算通过移位来进行可以有效的提高程序运行效率
ptr[6]=(Curr_Volt/10)+0x30;//ADC电压值个位
ptr[8]=(Curr_Volt%10)+0x30;//ADC电压值小数位
hang1[8]=(Curr_Volt/10)+0x30;//ADC电压值个位
hang1[10]=(Curr_Volt%10)+0x30;//ADC电压值小数位
Disp_HZ1(0x80,hang1,16);
}
/*
函数名称:
Write_Cmd
功能:
向液晶中写控制命令
参数:
cmd--控制命令
返回值:
无
*/
voidWrite_Cmd(ucharcmd)
{ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data=cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*
函数名称:
Write_Data
功能:
向液晶中写显示数据
参数:
dat--显示数据
返回值:
无
*/
voidWrite_Data(uchardat)
{ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data=dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*
函数名称:
Ini_Lcd
功能:
初始化液晶模块
参数:
无
返回值:
无
*/
voidIni_Lcd(void)
{
LCD_CMDOut;//液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30);//基本指令集
Delay_1ms();
Write_Cmd(0x02);//地址归位
Delay_1ms();
Write_Cmd(0x0c);//整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01);//清除显示
Delay_1ms();
Write_Cmd(0x06);//游标右移
Delay_1ms();
Write_Cmd(0x80);//设定显示的起始地址}
/*
函数名称:
Disp_HZ
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值:
无
*/
voidDisp_HZ(ucharaddr,constuchar*pt,ucharnum)
{uchari;
Write_Cmd(addr);
for(i=0;i<(num*2);i++)
Write_Data(*(pt++));
}
/*
函数名称:
Disp_HZ
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值:
无
*/
voidDisp_HZ1(ucharaddr1,constuchar*pt1,ucharnum1)
{uchari;
Write_Cmd(addr1);
for(i=0;i<(num1*1);i++)
Write_Data(*(pt1++));}
/*
函数名称:
main
功能:
主函数
参数:
无
返回值:
无
*/
voidmain(void)
{WDTCTL=WDTPW+WDTHOLD;
Init_Clk();//初始化系统时钟
Init_ADC();//设置ADC相关寄存器
Init_UART();//设置UART
LCD_PSB_P;
Ini_Lcd();//初始化液晶
_EINT();
//开启全局中断
P5DIR|=BIT5;
P3OUT|=~BIT5;
Disp_HZ1(0x80,hang1,16);
Disp_HZ(0x90,hang2,8);
Disp_HZ1(0x88,hang3,16);
Disp_HZ(0x98,hang4,8);
while
(1)
{ADC12CTL0|=ADC12SC;//软件控制的采样启动位
_NOP();
}}
/*
函数名称:
usart0_rx
功能:
UART接收中断服务函数
当接收到AD命令时返回读取到的ADC电压值
注意:
在用串口调试助手发送AD命令时要设置为十六进制发送
参数:
无
返回值:
无
*/
#pragmavector=UART0RX_VECTOR
__interruptvoidusart0_rx(void)
{
unsignedcharRX_DATA,j;
RX_DATA=U0RXBUF;
if(RX_DATA==0XAD)
for(j=0;j<10;j++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 电压表