基于MSP430G2553实现交流电压表
基于MSP430单片机的数字电压表的设计_王晓亮
道 A0, 并 用 SD16模 块 内 部 PGA 放 大 信 号 。转 换器由SMCLK计时,并启用连续转换模 式 。软 件 主 流 程 图 如 图 2 所 示 。
被测电压由精密的电阻分压器进行分 压得到满足系统要求的电压值,经 M S P 4 3 0 F 4 2 7 的 A 0 . 0 + 、A 0 . 0 - 两 个 端 口 连 接 至 主 控 芯 片 。M S P 4 3 0 F 4 2 7 内 置 有 1 . 2 V 参 考电压工作,如果采用内部参考电压,那么 测量结果就会随电池使用寿命中的变动而 发 生 差 异 。为 了 提 高 电 压 表 测 量 的 准 确 性 , 在本设计中采用美国德州仪器(TI)生产的 基 准 源 芯 片 TL431产 生 参 考 电 压 。TL431是 具 有 良 好 热 稳 定 性 能 的 、低 噪 声 的 三 端 可 调分流基准源,在本设计中由TL431产生 准确2.5V的参考电压。
4 结语
系统充分利用了GSM移动网络的资 源,尽可能减少用户室内终端的投入,采用 最直观的中文短消息形式,直接把多个方 面的报警内容反映到用户的手机屏幕上, 此外系统利用多传感器信息融合技术,对 预警信息的紧急程度进行区分,便于业主 根据情况采取措施,满足了业主对家居安 全 防 盗 的 要 求 。该 系 统 安 装 简 单 , 使 用 方 便,易于推广。
技 术 创 新
科技创新导报 2009 NO.01
Science and Technology Innovation Herald
电设工作小结之 MSP430G2553学习笔记―2
电设工作小结之 MSP430G2553学习笔记―2电设工作小结之-msp430g2553学习笔记―2电设工作小结之――msp430g2553学习笔记――2接通一篇:(四),adc101,adc10就是十位的ad,在g2553上加a0~a7八个可以外接的ad地下通道,a10收到片上的温度传感器上,其他的地下通道都直奔在内部的vcc或gnd上。
因为就是10为的ad所以计算公式如下:2,adc参考电压的选择:adc的参考电压可以为:由adc掌控寄存器0adc10ctl0掌控。
但是必须提升adc的精度的话,尽量不要用内部的参照电压,最出色外接一个比较稳定的电压做为参照电压,因为内部的产生的参照电压不是特别平衡或精度不是特别的高。
比如我在采用时碰到的情况如下:vref设为2.5v但实际的值大概为2.475v,选择vccvss作为参考,用电压表测得大概为3.58v还是不小的偏差的。
另外,在有可能的情况下,尽量使用很大的vr+和vr-,以增大纹波对取样结果的影响。
3,adc10的取样方式存有:单通道单次取样,单通道多次取样,多通道单次取样,多通道多次取样。
4,dtc:因为adc10只有一个采样结果存储寄存器adc10mem,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用dct,否则转换结果会不停地被新的结果给覆盖。
dtc是转换结果传送控制,也就是转换结果可以不用cpu的干预,就可以自动地存储在指定的存储空间内。
使用这种方式转换速度快,访问方便,适用于高速采样模式中。
dtc的使用可以从下面的例子中很容易看明白:#include#include\uchars1[]={\uchars2[]={\voidadc_init(){adc10ctl1=conseq_3+inch_1;//2通道多次转换,最大转换通道为a1adc10ctl0=adc10sht_2+msc+adc10on+adc10ie;//adc10on,interruptenabl参照电压选默认值vcc和vss//采样保持时间为16xadc10clks,adc内核开,中断使能msc多次转换选择开//如果msc置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行中断使能//采用dtc时,当一个块传输完结,产生中断//数据传送控制寄存器0adc10dtc0设置为默认模式:单传送块模式,单块传送完停止adc10dtc1=0x04;//数据传送控制寄存器14conversions定义在每块的传送数目一共采样4次所以单块传送4次//以后就暂停了传输因为就是两地下通道的,所以就是每个地下通道取样数据传输2次adc10ae0|=bit0+bit1;//p1.0p1.1adcoptionselect使能模拟输入脚a0a1//不晓得为什么,当p10p11都悬空时,取样值相同,用电压表测得悬空电压相同,但是当都接通取样源的时候,//取样就是相同的}voidmain(void){uintadc_sample[8]={0};//存储adc序列取样结果wdtctl=wdtpw+wdthold;bcsctl1=calbc1_12mhz;//设定cpu时钟dco频率为12mhzdcoctl=caldco_12mhz;p2dir|=bit3+bit4;//液晶的两条线init_lcd();adc_init();wr_string(0,0,s1);wr_string(0,3,s2);for(;;){adc10ctl0&=~enc;//adc不使能够其实这句话可以放到紧接着cpu唤起之后的,因为cpu唤起了,表明我们想的//转换数据传送完成了,如果adc继续转换,那么转换结果也不再传输,是无用的。
基于msp430g2553单片机ADC测量外部直流电压
#include<msp430g2553.h>#define uchar unsigned char#define uint unsigned int#define LCD_CON_DIR P2DIR#define LCD_CON_IN P2IN#define LCD_CON_OUT P2OUT#define LCD_RS BIT0 //p2.5接51 p2.5#define LCD_RW BIT1 //p2.0接51 p2.6#define LCD_EN BIT2 //p2.1接51 p2.7#define LCD_DATA_DIR P1DIR#define LCD_DATA_IN P1IN#define LCD_DATA_OUT P1OUT#define A 1000#define B 100#define X 10void InitOsc(void);void InitLCD(void);void write_command(uchar command);void write_data(uchar data);void Display_ZFC(uchar *s);void LCD_Set_xy(uchar x,uchar y);void Trans_val(uint Hex_Val);void Display_Volte(uint Hex_Val);void Measure_Volte(void);uchar num[]={"0123456789.v"};uchar volte[]={"Volt: "};uint index=0;int i;unsigned long sum=0;uint Hex_Val;#define Num_of_Results 32uint results[Num_of_Results]; //保存ADC转换结果的数组uint average;/**************************************************************************** ADC初始化*****************************************************************************/ void ADC_Init(void){ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled ADC10CTL1 = INCH_1; // input A1ADC10AE0 |= 0x02; //二次采集}/**************************************************************************** DCO时钟初始化设为1MHz*****************************************************************************/ void DCO_Init(void){if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF){while(1);}BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;BCSCTL2 = SELM_0 +DIVM_0;}/****************************************************************************向12864发送字节*****************************************************************************/ void SendByte(uchar Zdata){uint i;for(i=0; i<8; i++){if((Zdata << i) & 0x80){LCD_CON_OUT |= LCD_RW; //clk始终信号为高}else{LCD_CON_OUT &=~LCD_RW; //clk始终信号为低}LCD_CON_OUT &= ~LCD_EN;LCD_CON_OUT |= LCD_EN;}}/****************************************************************************向12864写命令*****************************************************************************/ void write_command(uchar command){LCD_CON_OUT |= LCD_RS;SendByte(0xF8);SendByte(command & 0xF0);SendByte((command<<4)&0xF0);_delay_cycles(200);}/****************************************************************************向12864写数据*****************************************************************************/ void write_data(uchar data){LCD_CON_OUT |= LCD_RS;SendByte(0xFA);SendByte(data & 0xF0);SendByte((data << 4) & 0xF0);_delay_cycles(200);}void Display_ZFC(uchar *s){while(*s > 0){write_data(*s);s++;_delay_cycles(5000);}}/****************************************************************************确定12864屏幕显示的坐标位置(x,y)*****************************************************************************/ void LCD_Set_xy( uchar x, uchar y ){uchar address;switch(x){case 0: address = 0x80 + y; break;case 1: address = 0x80 + y; break;case 2: address = 0x90 + y; break;case 3: address = 0x88 + y; break;case 4: address = 0x98 + y; break;default:address = 0x80 + y; break;}write_command(address); //写入地址命令}/**************************************************************************** lcd初始化*****************************************************************************/ void InitLCD(void){LCD_CON_DIR |= 0xFF; //p2口定义为输出write_command(0x01); //清屏write_command(0x30);_delay_cycles(5000);write_command(0x0c);_delay_cycles(5000);}/****************************************************************************采集到的数据转化成电压形式*****************************************************************************/ void Trans_val(uint Hex_Val){unsigned long caltmp;uint Curr_Volt,volt,max;uint a[50];caltmp = Hex_Val;caltmp = caltmp*34600; //caltmp = Hex_Val * 34600Curr_Volt = caltmp >> 10 ; //Curr_Volt = caltmp / 2^nvolt = Curr_Volt;for(i=0;i<50;i++){a[i]=volt;}for(max=a[0],i=0;i<50;i++){if(a[i]>max)max=a[i];}Curr_Volt = max;Display_Volte(Curr_Volt);}/****************************************************************************主函数*****************************************************************************/ void main(void){WDTCTL = WDTPW + WDTHOLD;ADC_Init(); //ADC初始化DCO_Init(); //DCO初始化InitLCD(); //12864液晶初始化while(1){Measure_Volte(); //测量直流电压值并且显示}}/****************************************************************************测量电压*****************************************************************************/ void Measure_Volte(void){ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE);results[index++] = ADC10MEM; // Move resultsif(index == Num_of_Results){index = 0;for(i = 0; i < Num_of_Results; i++){sum += results[i];}sum >>= 5; //除以32Trans_val(sum);sum=0;}}/****************************************************************************显示电压值*****************************************************************************/ void Display_Volte(uint Hex_Val){uint Curr_Volt;Curr_Volt = Hex_Val;write_command(0x90);for(i=0;i<16;i++){write_data(volte[i]);}write_command(0x93);write_data(num[Curr_Volt / 10000]);write_data(num[10]);write_data(num[Curr_Volt % 10000/1000]);write_data(num[Curr_Volt % 10000 % 1000 / 100]);write_data(num[Curr_Volt % 10000 % 1000 % 100 / 10]);write_data(' ');write_data(num[11]);}/****************************************************************************ADC中断,进入低功耗模式关闭CPU*****************************************************************************/ #pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR(void){__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)}。
msp430g2553测频率以及测峰值
msp430g2553测频率以及测峰值电子设计综合实验项目报告项目名称:MCU交流电压参数测量小组成员:林伊、武正浩学号:20111112、20111201项目要求题目:交流电压参数的测量 要求:用给定的MCU:msp430g2553,制作交流电压参数测试设备图表 1基本要求:一、 用给定运放LM324制作一放大器 a) 增益大于:20dBb) 带宽大于:100KHz二、 用指定MCU 和已制作的放大器制作频率计a) 测量范围:10Hz~100KHzb) 显示:3位以上信号放大 A/D比较器 指定MCUMSP430发挥部分:一、用A/D测量已给电压的幅度,信号由已制作的放大器输入a)测量范围:输入信号越小越好实现思路放大:首先分析题目要求,要实现放大20dB,频率1~100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大10倍必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。
通过数据手册得知其增益带宽积为6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为反向比例放大电路,见Figure 1Figure 1频率:实现频率的测量,这一块需使用到MCU,测量频率的方法有很多种,通过捕捉上升沿下降沿产生中断,也可以不产生中断,还可通过时钟计数。
其中通过捕捉上升沿下降沿的思路又分两种,1、检测上升沿后再检测下一个上升沿(检测下降沿后再检测下一个下降沿)2、检测上升沿后再检测下降沿(检测下降沿后再检测上升沿)。
这些思路对应不同的采集方法又可以细分,其中方案1对于测量高频信号有着较好的效果,方案2对于测低频的信号较好,前提是占空比为50%,若不为则变为测脉宽。
这次的题目我采用的是用时钟计数的方式,msp430g2553中含有2个时钟,timer0和timer1,每个时钟都有如下功能,选择时钟来源:1、外部时钟(即外部输入的方波信号)2、ACLK 3、smclk等。
基于MSP430G2553的电压表设计
数字式直流电压表一、整体说明在电子技术中,往往离不开对电压的测量,作为一种测量电压的仪器——电压表是近代电子技术领域的常用工具之一,在许多领域得到广泛应用。
本设计是基于TI单片机设计的数字式直流电压表,它主要由MSP430G2553、LCD12864和分压电路三部分组成。
分压电路先将输入的电压信号衰减一定的倍数,后通过控制双路选择开关设定测量的量程,分别有0~3V和0~15V两个档,以便实现精确读数;分压处理后的电压信号由MSP430G2553内部的ADC10模块转换成数字信号;再通过LCD12864液晶屏进行串行显示。
经多次测量实验得出误差范围在2%以内。
二、原理图基于MSP430G2553单片机设计的数字式直流电压表的电路图如图1所示。
由于MSP430开发板已具备单片机最小系统结构,只需添加显示电路和分压电路。
LCD12864通过串口方式显示,只需占用单片机2个I/O口;分压电路可以通过开关S1选择量程档位,只占用1个I/O口。
图1 直流电压表电路图三、接口定义MSP430G2553的接口说明如表1所示。
图1中的复位和晶振部分是MSP430开发板固有的部分,故不再说明。
P1.0接液晶屏的SID脚,作为串行的数据口用;P1.1则接液晶屏的SCLK脚,控制串行的同步时钟;P1.4接分压电路的输出端。
LCD12864的接口说明如表2所示。
当PSB脚接低电平时,串口模式被选择。
在该模式下,只用2根线(SID与SCLK)来完成数据传输。
RS接高电平,不使用片选功能。
注意:信号源与单片机之间要共地。
表1 MSP430G2553的接口说明表2 LCD12864的接口说明四、程序流程图(一)主函数主函数的流程框图如图1所示。
主函数主要是调用系统初始化函数和循环开启ADC 转换,这是由于ADC10采用单通道单次转换模式,每次采样后需要重新开启ADC ,才会进行下一次信号采样转换。
另外,信号的采样与处理以及电压值的显示都是通过中断来完成。
MSP430G2553的UART与SPI应用
UTXE不会因SWRST 而更改。
ME1 |= UTXE0 + URXE0 //使能 USART0 TXD/RXD模块USART中特有的
使能配置。
IE1 |= URXIE0 //使能USART0 接收中断
10 P2.2
通用I/O 口、Timer1_A捕获CCI1B输入比较Out1输出
11 P2.3
通用I/O 口、Timer1_A捕获CCI0B输入比较Out0输出
12 P2.4
通用I/O 口、Timer1_A捕获CCI2A输入比较Out2输出
U0CTL |= CHAR; // 配置控制寄存器数据类型为8位。
U0TCTL |= SSEL0 // 选择时钟UCLK= ACLK。
U0BR0 = 0x45 // 分频系数的高8位8MHz 时钟下波特率为115200
(CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保
证交换(Data Exchanges)
SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI
SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设
备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的.
3、 工作机制
3.1. 概述
上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个
测试数据输入或测试时钟输入
15 P1.7
通用I/O 口、ADC10模拟输入A7、Comparator_A+CA7输入、图
MSP430数字电压表0-20V资料
H_CLK;
_NOP();
L_CLK;
_NOP();
H_CLK;
_NOP();
L_CLK;
_NOP();
H_Conv;
_NOP();
ADCdata &= 0x0fff;
return (ADCdata);
}
While(1)函数部分
while(1)
{
//LCD_write_hanzi(1,1,0);
IrDA 编码器和解码器
同步 SPI
I2C™
Nokia5110
5110液晶显示屏(PCD8544芯片),是通过发送指令和写入数据RAM来控制和显示数据的。
指令格式分为两种模式:
1、如果D/C(模式选择)置为低(为0),即位变量 dc = 0,为发送指令模式,那么接下来发送的8位字节解释为命令字节。
2、如果D/C置为高,即dc = 1; 为写入数据RAM模式,接下来的字节将存储到显示数据RAM。
L_CLK;
_NOP();
H_CLK;
_NOP();
for(i=0; i<12; i++)
{
L_CLK;
_NOP();
H_CLK;
_NOP();
ADCdata <<= 1;
if(P2IN & 0x02)
{
ADCdata |= 0x0001;
}
else
{
ADCdata &= 0xfffe;
}
}
L_CLK;
01risc架构625ns指令周期时间高达16mhz的内部频率具有4种校准频率内部超低功耗低频lf振荡器32khz晶体个捕获比较寄存器的两个16多达24个支持触摸感测的增强型uart可支持自动波特率检测linirda编码器和解码器同步spii2cnokia51105110液晶显示屏pcd8544芯片是通过发送指令和写入数据ram来控制和显示数据的
我们所用的MSP430G2553...
电设工作小结之——MSP430G2553学习笔记——1一,MSP430G2553单片机的各个功能模块(一),IO口模块,1,我们所用的MSP430G2553有两组IO口,P1和P2。
2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN,IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。
3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。
所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。
4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。
注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。
程序如下:void IO_interrupt_init() //IO中断初始化函数{P1REN |= BIT4+BIT5+BIT6+BIT7; // pull up 内部上拉电阻使能//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断P1OUT = BIT4+BIT5+BIT6+BIT7; // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来//0:下拉,1:上拉P1IE |= BIT4+BIT5+BIT6+BIT7; // interrupt enabled P13中断使能P1IES |= BIT4+BIT5+BIT6+BIT7; // Hi/lo edge 下降沿中断//P1IES &= ~BIT3; //上升沿触发中断P1IFG &= ~(BIT4+BIT5+BIT6+BIT7); //中断标志位清零}5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。
基于MSP430G2553的带漏电保护功能的直流稳压电源设计
基金项目:湖北省教育科学"十二五"规划2012年度立项课题(2012B397)———电子设计竞赛引导下的《单片机》与《C 语言》课程整合研究作者简介:徐明(1977-),男,副教授,武汉理工大学访问学者,主要研究领域为嵌入式系统及应用。
E-mail:xu_ming01@。
0引言电子信息技术的快速进步,对电源的品质要求也越来越严格。
由于我国是能源消耗大国,因此国家特别重视节能环保产品的开发与生产,这使得高效节能的电源在电子产品中的应用得到快速发展。
目前电源技术已经向着智能化、数字化、模块化和绿色化方向发展[1]。
而漏电保护装置又称漏电保护开关,是一种新型的电气保护装置,对预防各类漏电事故的发生,及时切断电源、保护设备和人生安全,提供了可靠而又有效的技术手段。
因此,设计出一款稳定且带漏电保护功能的直流稳压电源及已经成为所有电子产品设计师迫在眉睫的任务。
本文介绍一种基于MSP430G2553微控制器的具有实时显示输出电压、电流、电功率及漏电保护功能的直流稳压电源设计。
1系统总体设计方案本系统设计框图如图1所示,硬件主要由4个模块组成:直流稳压电源调整模块、漏电保护模块、微控制器模块以及显示模块。
当输入电压信号为5.5V~25V,通过自动切换电路及TL1963稳压模块输出稳定的5±0.05V。
微控制器选取MSP430G2553,根据通过采样电阻采样到的电压值计算出功率,并将稳压电源输出电压、电流及功率实时显示。
漏电保护模块中,漏电电流值通过两路INA194电流测量单元电路的比较结果来确定。
当漏电电流超过30mA 阀值时漏电保护装置动作,转换开关S 接2端的回路与直流稳压源断开,负载电阻R L 两端电压为0V 并保持自锁。
漏电故障排除后,直流稳压电源恢复正常输出。
2系统硬件设计系统硬件电路采用模块化设计,主要包括:MSP430G2553最小系统、直流稳压电源调整电路模块、漏电保护模块、键盘液晶LCD 显示电路等。
基于msp430g2553单片机ADC测量外部直流电压
#include<msp430g2553、h>#define uchar unsigned char#define uint unsigned int#define LCD_CON_DIR P2DIR#define LCD_CON_IN P2IN#define LCD_CON_OUT P2OUT#define LCD_RS BIT0 //p2、5接51 p2、5#define LCD_RW BIT1 //p2、0接51 p2、6#define LCD_EN BIT2 //p2、1接51 p2、7#define LCD_DATA_DIR P1DIR#define LCD_DATA_IN P1IN#define LCD_DATA_OUT P1OUT#define A 1000#define B 100#define X 10void InitOsc(void);void InitLCD(void);void write_command(uchar command);void write_data(uchar data);void Display_ZFC(uchar *s);void LCD_Set_xy(uchar x,uchar y);void Trans_val(uint Hex_Val);void Display_Volte(uint Hex_Val);void Measure_Volte(void);uchar num[]={"0123456789、v"};uchar volte[]={"Volt: "};uint index=0;int i;unsigned long sum=0;uint Hex_Val;#define Num_of_Results 32uint results[Num_of_Results]; //保存ADC转换结果的数组uint average;/**************************************************************************** ADC初始化*****************************************************************************/ void ADC_Init(void){ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled ADC10CTL1 = INCH_1; // input A1ADC10AE0 |= 0x02; //二次采集}/**************************************************************************** DCO时钟初始化设为1MHz*****************************************************************************/ void DCO_Init(void){if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF){while(1);}BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;BCSCTL2 = SELM_0 +DIVM_0;}/****************************************************************************向12864发送字节*****************************************************************************/ void SendByte(uchar Zdata){uint i;for(i=0; i<8; i++){if((Zdata << i) & 0x80){LCD_CON_OUT |= LCD_RW; //clk始终信号为高}else{LCD_CON_OUT &=~LCD_RW; //clk始终信号为低}LCD_CON_OUT &= ~LCD_EN;LCD_CON_OUT |= LCD_EN;}}/****************************************************************************向12864写命令*****************************************************************************/ void write_command(uchar command){LCD_CON_OUT |= LCD_RS;SendByte(0xF8);SendByte(command & 0xF0);SendByte((command<<4)&0xF0);_delay_cycles(200);}/****************************************************************************向12864写数据*****************************************************************************/ void write_data(uchar data){LCD_CON_OUT |= LCD_RS;SendByte(0xFA);SendByte(data & 0xF0);SendByte((data << 4) & 0xF0);_delay_cycles(200);}void Display_ZFC(uchar *s){while(*s > 0){write_data(*s);s++;_delay_cycles(5000);}}/****************************************************************************确定12864屏幕显示的坐标位置(x,y)*****************************************************************************/ void LCD_Set_xy( uchar x, uchar y ){uchar address;switch(x){case 0: address = 0x80 + y; break;case 1: address = 0x80 + y; break;case 2: address = 0x90 + y; break;case 3: address = 0x88 + y; break;case 4: address = 0x98 + y; break;default:address = 0x80 + y; break;}write_command(address); //写入地址命令}/**************************************************************************** lcd初始化*****************************************************************************/ void InitLCD(void){LCD_CON_DIR |= 0xFF; //p2口定义为输出write_command(0x01); //清屏write_command(0x30);_delay_cycles(5000);write_command(0x0c);_delay_cycles(5000);}/****************************************************************************采集到的数据转化成电压形式*****************************************************************************/ void Trans_val(uint Hex_Val){unsigned long caltmp;uint Curr_Volt,volt,max;uint a[50];caltmp = Hex_Val;caltmp = caltmp*34600; //caltmp = Hex_Val * 34600Curr_Volt = caltmp >> 10 ; //Curr_Volt = caltmp / 2^nvolt = Curr_Volt;for(i=0;i<50;i++){a[i]=volt;}for(max=a[0],i=0;i<50;i++){if(a[i]>max)max=a[i];}Curr_Volt = max;Display_Volte(Curr_Volt);}/****************************************************************************主函数*****************************************************************************/ void main(void){WDTCTL = WDTPW + WDTHOLD;ADC_Init(); //ADC初始化DCO_Init(); //DCO初始化InitLCD(); //12864液晶初始化while(1){Measure_Volte(); //测量直流电压值并且显示}}/****************************************************************************测量电压*****************************************************************************/ void Measure_Volte(void){ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE);results[index++] = ADC10MEM; // Move resultsif(index == Num_of_Results){index = 0;for(i = 0; i < Num_of_Results; i++){sum += results[i];}sum >>= 5; //除以32Trans_val(sum);sum=0;}}/****************************************************************************显示电压值*****************************************************************************/ void Display_Volte(uint Hex_Val){uint Curr_Volt;Curr_Volt = Hex_Val;write_command(0x90);for(i=0;i<16;i++){write_data(volte[i]);}write_command(0x93);write_data(num[Curr_Volt / 10000]);write_data(num[10]);write_data(num[Curr_Volt % 10000/1000]);write_data(num[Curr_Volt % 10000 % 1000 / 100]);write_data(num[Curr_Volt % 10000 % 1000 % 100 / 10]);write_data(' ');write_data(num[11]);}/****************************************************************************ADC中断,进入低功耗模式关闭CPU*****************************************************************************/ #pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR(void){__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)}。
基于MSP430单片机的交流电压测量设计
基于MSP430单片机的交流电压测量设计东南大学仪器科学与工程学院许欢摘要:在单片机的一些测量中,有时候需要我们直接测量交流信号,现介绍一种基于msp430 单片机实现的交流电压的测量方法。
关键字:MSP430单片机,交流电压,测量,中断日常生活及学习中,我们一般需要之间测量交流信号,测量交流信号的方法有很多,而在应用单片机的测量中,我们常常用来测量直流电压,现在将介绍一种基于msp430单片机实现的交流电压的测量方法。
系统的构成主要分硬件设计和软件设计两块来介绍。
硬件设计:为了保证硬件电路设计的通用性,采用单级性电压测量的方法,将输入的双极性电压转换成单级性电压进行测量。
整个电路主要包括极性转换电路和输入处理电路。
其中,极性转换电路主要由放大电路实现,在此我采用MCP601放大芯片。
MCP601芯片:(Microchip公司的一款高性能的放大芯片)如图所示,该芯片共有8个管脚,Vcc管脚:电源管脚GND管脚:接地管脚VIN-管脚:负输入端管脚VIN+管脚:正输入端管脚OUT管脚:输出管脚极性转换电路设计:在进行A/D转换时,我们一般会采用芯片的工作电压作为A/D转换的参考电压。
由于一般芯片的工作电压都为正电压,而我们在这里要测量交流电压,所以要对输入的交流信号进行极性转换,将双极性变成单级性。
下图为极性转换电路:在极性转换电路中,ADOUT为输出信号。
输出信号是在输入信号ADIN的基础上叠加了一个直流分量,调节上面的V ref的值就可以改变直流分量的值。
如果调节V ref使直流分量的值为1.5V,并且此时输入信号是幅值为1.5V的交流正弦信号,那么输出信号就为最大值为3V,最小值为0V的单级性正弦信号。
在极性转换电路基础上我们将很容易设计出我们要的输入电路。
输入处理电路:在极性转换电路基础上,输入处理电路需要将220V的交流电压信号变为幅值为1.5V左右的交流信号,此外,还需要为MCP601提供适当的参考电压信号。
我的TLC2543学习笔记——基于msp430g2553单片机
我的TLC2543学习笔记——基于msp430g2553单⽚机还是贴不了图⽚我的TLC2543学习笔记Created on: 2012-9-8Author: zhang bin学习笔记for msp430g2553redesigned by zhang bin2012-09-08versions:12_09_01All Rights ReservedTLC2543具有4线制串⾏接⼝,分别为⽚选端(CS),串⾏时钟输⼊端(I/O CLOCK),串⾏数据输⼊端(DATA IN)和串⾏数据输出端(DATA OUT)(转换结束脚EOC可以不接)。
它可以直接与SPI器件进⾏连接,不需要其他外部逻辑。
同时,它还在⾼达4MHz的串⾏速率下与主机进⾏通信。
TLC2543的特点及引脚TLC2543是TI的12 bit串⾏A/D转换器,11个模拟输⼊通道。
使⽤开关电容逐次逼近技术完成,A/D转换过程.由于是串⾏输⼊结构,能够MCU的I/O资源.其特点有:1)12 bit分辨率A/D转换器;2)在⼯作温度范围内10us转换时间;3)11个模拟输⼊通道;4)3路内置⾃测试⽅式;5)采样率为66 kb/s;6)线性误差+1LSB(max);7)有转换结束(EOC)输出;8)具有单、双极性输出;9)可编程的MSB或LSB前导;10)可编程的输出数据长度.��� 12-Bit-Resolution A/D Converter��� 10-µs Conversion Time Over OperatingTemperature��� 11 Analog Input Channels��� 3 Built-In Self-Test Modes��� Inherent Sample-and-Hold Function��� Linearity Error . . . ±1 LSB Max��� On-Chip System Clock��� End-of-Conversion Output��� Unipolar or Bipolar Output Operation(Signed Binary With Respect to 1/2 theApplied Voltage Reference)��� Programmable MSB or LSB First��� Programmable Power Down��� Programmable Output Data Length��� CMOS Technology��� Application Report Available我⽤的tlc2543是直插的,引脚图如下:各引脚的详细说明如下:引脚号名称I/O说明1~9,11,12AIN0~AIN10I模拟量输⼊端。
大学本科电信专业多功能数字万用表设计与制作毕业设计论文
1、摘要随着科技的日新月异,电子产品发展也非常之快,在电子电路测试、家用电气设备的维修、电子仪器检修、电子元器件测量中,万用表是最普及、最常用的的测量仪表。
由于它操作简单、功能齐全、便于携带、一表多用等特点,深受电工、电子专业工作者及广大无线电爱好者的喜爱。
事实证明,万用表不仅能检测电工、电子元器件的性能优劣,查找电子、电气线路的故障,估测某些电气参数,有时还能代替专业测试仪器,获得比较准确的结果,基本上可以满足电工、电子专业人员和业余无线电爱好者的需要。
因此,推广万用表的应用技术,实现一表多用,既符合节约精神,又可以在一定程度上克服专用仪器的困难。
多功能数字万用表是在电子方面的学习、开发以及生产方面应用相当广发的一种仪器工具,整机电路设计以大规模的集成模拟和数字电路组合,采用STM32F103RBT6为核心,高精度的运算放大器,低功耗高效率的开端电源转换器,全电子调校技术赋予仪表高可靠性,高精度。
仪表可用于测量交直流电压、交直流电流、电阻、电感、电容,RS232C接口技术的应用使其和计算机构成可靠多种的双向通讯。
仪表采用独特的外观设计,采用OLED3.1液晶显示器,仪表采用220V交流供电使之成为性能更优越的高精度电工仪表。
目录1摘要 (2)2项目概述与功能需求 (5)3项目论证 (6)3.1 总体方案论证 (6)3.1.1 设计目标 (6)3.1.2 总体设计方案 (6)3.2 小模块方案设计 (9)3.3 项目设计 (12)4项目设计 (12)4.1 系统硬件设计 (12)4.1.1 测直流电流模块 (12)4.1.2 测直流电压模块 (14)4.3.3 侧交流电压模块................................................................................... 错误!未定义书签。
4.1.4测电阻模块............................................................................................ 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//***************************************************************************** *
// LaunchPad Lab5 - ADC10, Sample A10 Temp and Convert to oC and oF
//
// MSP430G2452
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// |A10 |
//幅值测量范围,7hz 以上的正弦波
//***************************************************************************** *
#include "msp430g2553.h"
long temp;
long peak;
long IntDegC;
long IntDegF;
long count;
long counta;
long IntDegV;
/////////////////////////////////////////////////
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
unsigned char position[4]={0xfe,0xfd,0xfb,0xf7};
unsigned char dis_buff[4];
//unsigned char time[3]={0}; // 分、秒计数单元和积分单元unsigned char posit = 0;
unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共yang显示顺时针
//unsigned char disp[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共yin显示顺时针
#define clr_595_1 P1OUT |= BIT6
#define clr_595_0 P1OUT &=~BIT6
#define clk_595_1 P1OUT |= BIT7
#define clk_595_0 P1OUT &=~BIT7
#define cp_595_1 P1OUT |= BIT4
#define cp_595_0 P1OUT &=~BIT4
#define di_595_1 P1OUT |= BIT5
#define di_595_0 P1OUT &=~BIT5
void show_595(unsigned char c)//595显示
{
int w,x;
unsigned char num;
clr_595_1;
num=disp[c];
for(w=0;w<8;w++)
{
clk_595_0;
x=num&0x80;
if(x==0)
{
di_595_0;
}
else
{
di_595_1;
}
delay_us(2);
num=num<<1;
clk_595_1;
}
cp_595_0;
delay_us(2);
cp_595_1;
}
void display(void) // 2位LED数码管动态扫描函数
{
show_595(dis_buff[posit]);
P2OUT=position[posit]; //p1out
if(++posit>=4)
posit=0;
}
void time_to_disbuffer(void) // 时钟时间送显示缓冲区函数{
unsigned char j=0;
dis_buff[j++] = (unsigned char)((IntDegF%100) % 10);
dis_buff[j++] = (unsigned char)((IntDegF%100) /10);
dis_buff[j++] = (unsigned char)((IntDegF/100) % 10);
dis_buff[j++] = (unsigned char)((IntDegF/100) / 10);
//dis_buff[j++] = time[1] % 10;
//dis_buff[j++] = time[2] % 10;
}
//////////////////////////////////////////////////////////
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT(关闭电子狗)
ADC10CTL1 = INCH_2 + ADC10DIV_1 + CONSEQ_2 ; // Choose ADC Channel as Temp Sensor
ADC10CTL0 = SREF_1+ ADC10SHT_1 + REF2_5V + REFON + ADC10ON + MSC;
//Choose ADC Ref source
ADC10AE0 |= BIT2;
P1DIR = 0xFB;
P2DIR = 0xFF;
P1SEL = 0x04;
count = 0;
peak = 0;
IntDegF = 0;
IntDegC = 0;
counta = 0;
IntDegV = 0;
while(1)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
temp = ADC10MEM;
IntDegC = (int)(((float)temp / 1023) * 2500);
if(peak<IntDegC)
peak=IntDegC;
count++;
if(count==200)
{
counta++;
count=0;
// IntDegF = peak;
IntDegV += peak;
peak=0;
// IntDegF=2345;
// time_to_disbuffer();
// display();
}
if(counta == 10)
{
counta = 0;
IntDegF = IntDegV / 10;
time_to_disbuffer();
IntDegV = 0;
}
// time_to_disbuffer();
display();
}
}。