基于MSP430G2553的频率计设计

合集下载

MSP430频率计程序

MSP430频率计程序

这两天在搞频率计的问题,开始的时候思路很清晰,但是实现起来比较麻烦。

想测量一个方波的频率,有两种方法,一个是测频率,就是定时1S然后计数方波的高电平个数。

另一个是测周期法,就是测量方波的一个周期的时长,从而得到频率。

第一种方法很简单,下面讲讲我用的第二种方法。

思路是这样的,利用定时器的捕获功能,捕获方波的上升沿,将两次比较的值相减,就能得出两个上升沿之间定时器的计数值,然后处理一下计数值,就能得到正确的频率。

设置两个变量,一个是new_cap,一个是old_cap。

捕获得到新的TAR数值赋给new_cap,再将上一次捕获的数值赋给old_cap,然后两值相减就能得到一个周期的计数值。

(程序中将体现)最开始写的时候,显示的频率不对,今天改动了一下。

用定时器A1,然后比较TAIV的值再进行频率数值计算。

再将显示函数放在主函数里面循环就对了。

(昨天把显示函数放在中断里面了,不知道有啥关系不,知道的提示下,谢谢了)程序贴出来供大家参考//*****************************************************////*****P1.2为定时器A1的CCI1A输入端,信号从P1.2输入********////*****定时器时钟为SMCLK(DCO=1Mhz),不用分频*********////************ ————————————————*************////*****P1.0 ->|(比较器输入) |************////*****P1.1 ->|(LCDRS) P2.0|->D0*******////*****P1.2 ->|(定时器输入)<--- ~ | ~********////*****P1.3 ->|(LCDEN) | P2.7|->D7*****////*****P1.7 ->|(比较器输出)---- |*********////***********| msp30g2553 |********////***********| 制作人:wusong |*******////*********************************************//#include<msp430g2553.h>#include<1602.h>#define uchar unsigned char#define uint unsigned intuchar table[]={"frequency:"};uchar table_num[]={"0123456789"};uint new_cap,old_cap,cap_diff,fre;void LCD_display(){write_com(0x80);fre = 10000000/cap_diff;/////////////这个是将计数值转换为频率。

msp430g2553测频率以及测峰值

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等。

基于MSP430G2 553的电子秤设计汇总

基于MSP430G2 553的电子秤设计汇总

MSP430G2系列Launchpad开发板应用实例作品基于MSP430G2553实现的电子秤设计李弘祖西安邮电大学2015年12月第一章作品概述第一节系统概述本设计以MSP430G2553作为核心,由压力传感器和数码管显示器共同实现对物体质量的测量显示功能,最小分辨率1克,系统框图和各部分简介如图1.1所示。

图1.1 系统组成框图1)压力传感器:在直流激励下,受到压力形变,产生电压信号。

压力信号以差分电压的形式通过绿色(数据)和白色(数据地)连根引线与PCB上的端子相连。

2)信号调理电路:传感器信号由于幅度较小,噪音较大,不能直接由AD采集,经过放大(AD623)滤波电路,得到合适频带幅度的信号送往中央控制器(MSP430G2231) 。

由接线端子上引入的数据+和数据地差分信号分别接仪表运放的正端输入和负端输入,在反馈电阻的作用下,实现高共模抑制的差分放大。

后接RC滤波电路,将低频可用信号取出,输出至MSP430的ADC10模块入口。

3)中央控制器:由G2的AD模块通道0采集前级电压信号,转换为数字量后,保存在CPU内存中,然后通过统计算法和传感器线性参数修正,得到被测压力数值参数,再将这些数据发往LED显示电路。

4)显示电路:由数码管驱动芯片(74LS48)根据CPU发来的显示数据点亮LED,显示出数值。

第二节器件概述1)MSP430G2553MSP430是美国德州仪器公司自1996推出以来一直主打的一个低功耗系列,包含1至5五个系列,每个系列都各自有各自的特点,适用于各种不同场合的不同应用。

其中最近2系列添新面孔——G2超值系列。

本设计采用的MSP430G2553就是MSP430超低功耗系列中G2超值子系列的一款16位处理器。

通过引入MSP430G2xx3 系列,MSP430 超值系列继续扩展了产品系列。

由于具有低成本和超低功耗,G2xx3 系列适用于电容触摸应用,并可集成诸如UART、SPI 和I2C 等通信外设。

基于MSP430G2553的数字频率计设计

基于MSP430G2553的数字频率计设计

基于MSP430G2553的数字频率计设计这是经过改进后的程序源码,较上次的设计相比,测频范围提高到3MHz,是因为将上次采用的IO口中断计数,改为两人TIMERB计数,通过TIMERA定时,TIMERB捕获计数,最终实现测频。

相关经验总结1、测频有两种方法:侧频法和测周法;本次设计是采用的timerA定时1S,P1.0口作为被测信号输入口,上升沿捕捉,每来一个上升沿进入IO中断,在中断服务函数里变量i 计数一次,当定时1S到时,读取变量i的值,则为被测频率;然后将数据传送到LCD和PC机显示;G2553有两个定时模块timerA和timerB,要特别注意它的寄存器的区别格式,默认的是TIMER A的。

中断向量也有两个,有优先级之分,timer0_A0 (应用于CCR0 优先级最高)timer0_A1(用于CCR1,CCR2和其他寄存器)。

2、串口通信有UART的异步通信与SPI的同步通信,也有两个通信模块,接收中断和发送中断,对应口位P1.1和P1.2。

3、MAX232在焊接时,外围的电容可以在0.1UF到10UF,没有影响,9阵的串口接线时也需要特别注意(见单片机书上179页)4、在最后的串口通信中会出现串口调试窗口中不仅显示需要的频率还会有其他的数据,这就需要传进BUFF(8位)中的数据长度不能有其他的,因此比如传一个字符串型的DA TA 进入BUFF,用到stringlen(),包含头文件sring.h。

5、重点是波特率的配置,特别是当分频系数为小数时:/***msp430g2553_LCD1602_Frequency_Detect*****grade:2010*date:2012.7.16*函数功能:测频率*管脚:P1.0作为外部频率的入口*LCD显示:P1.3 P1.5 --> RS EN P2.0--> RW P2.4->2.7 数据端口*/#include <msp430g2553.h>#include "lcd1602_4.h"unsigned long data;int i,j,h,m=0,n=0;char a[15]=" ";char *pa=a;double Freq=0; //频率测量结果存放变量double TA_OverflowCnt=0;//TA溢出次数存放变量void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT//端口设置P1SEL |=BIT0; //允许其第二功能,作为TACLK输入,即待测输入<<----设为1外围模块接口P2SEL=0x00; //设置P2为通用I/OP1DIR &=~BIT0; //P1.0(TACLK)作为输入引脚P2DIR |= 0xf1; // Set P2 to output direction 1111 0001P1DIR |= 0x28; //0111 1000 p1.3 1.5 作为LCD使能复位控制端0010 1000//initial_lcd(); //LCD初始化initLCD();TA1CCR0=65535; //A1定时1sTA1CTL = TASSEL_2 + ID_3 + TACLR + MC_1 + TAIE; // TA1信号作为基准时钟选择SMCLK作为时钟选ACLK会不会稳定点?TA0CTL = TASSEL_0 + TACLR + TAIE + MC_2; //外部信号作为A0时钟,捕获模式TACCTL0 = CCIE; //打开A0中断捕获(该句和下一句为中断必要语句)TA1CCTL0 = CCIE; //打开A1中断捕获_EINT(); //打开全局中断for (;;){_enable_interrupts();data=(int)data;a[0]=data/100000+0x30;a[1]=data/10000%10+0x30;a[2]=data/1000%10+0x30;a[3]=data/100%10+0x30;a[4]=data/10%10+0x30;a[5]=data%10+0x30;a[6]='H';a[7]='z';a[8]='\0';for(h=5000;h>0;h--){//LCD_Disp(0,0,"f=");onLcd(0,0,"f=");//delay(100);//LCD_Disp(1,0,pa);onLcd(1,0,pa);}_disable_interrupts();}}// TA interrupt service routine计数器A0溢出中断#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_R0(void){_disable_interrupts();TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1TA0CTL = TASSEL_0 + TACLR + TAIE + MC_2;//连续计数模式,选择外部时钟_enable_interrupts();}//定时器A1中断#pragma vector=TIMER1_A0_VECTOR__interrupt void Timer_R1(void){_disable_interrupts();data = (TA_OverflowCnt*65535 + TAR)*2.30012328;//读取上次TA计数值及溢出次数,计算频率TA_OverflowCnt=0; //将溢出次数置零TA1CTL = TASSEL_2 + ID_3 + TACLR + MC_1 + TAIE; //选择子系统时钟SMCLK 四分频增计数模式TA0CTL = TASSEL_0 + TACLR + TAIE + MC_2; //选用外部时钟连续计数模式_enable_interrupts();}。

基本时钟模块_MSP430G2553

基本时钟模块_MSP430G2553

基本时钟模块_MSP430G2553G2xxx系列DCO校准数据(校正寄存器)1MHz:CALBC1_1MHZCALDCO_1MHZ8MHz:CALBC1_8MHZCALDCO_8MHZ12MHz:CALBC1_12MHZCALDCO_12MHZ16MHz:CALBC1_16MHZCALDCO_16MHZ例:设置DCO频率为1MHzif(CALBC1_1MHZ==0xFF || CALDCO_1MHZ==0xFF)while(1);//校准数据是否被擦除,若是则CPU挂起。

BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;基本时钟模块寄存器寄存器缩写形式类型初始状态DCO控制寄存器DCOCTL 读/写0x60(PUC)基本时钟系统控制器1 BCSCTL1 读/写0x87(POR)基本时钟系统控制器2 BCSCTL2 读/写由PUC复位基本时钟系统控制器3 BCSCTL3 读/写0x05(PUC)中断使能寄存器(特殊功能寄存器)IE1 读/写由PUC复位中断标致寄存器(特殊功能寄存器)IFG1 读/写由PUC复位说明:DCO的频率可以通过软件设定DCOx、MODx、RSELx相应位来调整,DCO频率是通过将f DCO和f DCO+1混频得到。

1、DCOCTL:DCO控制寄存器7 6 5 4 3 2 1 0DCOx MODxrw-0 rw-1 rw-1 rw-0 rw-0 rw-0 rw-0 rw-0 DCOx:DCO频率范围选择位,这些位可以用来在由RESLx设置决定的8个离散的频率范围中选择哪一个。

MODx:调制系数选择位,这些位用来决定在32个DCO时钟周期中f DCO+1占多少个,f DCO 占多少个。

注意:当MODx=0时调制器关闭,DCOx=7时,由于此时没有下一个更高的频率范围f DCO+1可用,因此MODx无效不可用。

2、BCSCTL1:基本时钟系统控制寄存器17 6 5 4 3 2 1 0 XT2OFF XTS(1)(2)DIVAx RSELxrw-(1) rw-(0) rw-(0) rw-(0) rw-0 rw-1 rw-1 rw-1 XT2OFF:第二晶振XT2(可选高频晶振)关闭控制位。

基于MSP430G2553便携式脉搏测试仪的设计

基于MSP430G2553便携式脉搏测试仪的设计

导通程度。显然,传感器已经完成了把心脏跳动的信号转换 成电信号。接下来涉及到第二个模块了,那就是把从传感器 送出来的微弱的代表了心脏跳动的电信号做放大处理,当手 指放入的时候,不 管 手 指 的 半 透 明 组 织 的 透 明 程 度 如 何,光 敏三极管 3DU4 都不能完全导通,也就是说动传感器送出来 的电信号,始终都 存 在 一 个 电 压,我 们 实 际 测 量 到 这 个 电 压 是 2. 13V。当半透明组织的透明程度减小,这个电压还会加 大。所以这个 2. 13V 实际上是一个底电压,在后级的放大电 路中,是不需要放 大 的,也 不 可 以 放 大,因 为 一 旦 放 大,这 个 电压信号就超过我们单片机 MSP430G2553 的采集范围了。 所以合理的 解 决 方 式 应 该 是,在 后 级 做 一 个 减 法 运 算 放 大 器,尽管市面上有很多高精密运算放大器,比如 OP07,价格也 不贵。但是他 们 是 双 电 源 供 电 的,还 得 为 这 些 运 放 配 负 电 压,所以在做放大这部分电路的时候我们选择单电源供电的 LM324,并且把它配置成减法运放,而且参考电压为 2. 13V, 我们实际的放大倍数是 4. 3 倍,放大之后的信号,我们的单 片机已 经 能 识 别 到 了。最 后 就 是 显 示 部 分,因 为 单 片 机 MSP430G2553 是用串行的方式和 QC12864 通信的,所以硬件 接口比较简单。
三、结语 MBR 装置经过连续运行 4 个月,证明赛诺公司的 MBR 系统处理对该公司的电子废水是可行的。MBR 系统的运行 达到了设计要求,其产水产水 COD、产水 SDI、营养物去除率 等指标完全满足 RO 装置的进水要求。COD 去除率平均为 80. 9% ,经膜过滤后还可降低 30% 左右。通过 2 个半月 RO 的运行,产水电导率 < 200um / s,可作为工厂再生水使用。由 于电子废水化学成分复杂,国内目前尚无电子废水采用 RO 深度回用的先例,通 过 本 中 试 研 究,说 明 电 子 废 水 膜 法 处 理 回用具有可行性。

103636_基于MSP430G2553的频率计设计

数字式频率计一、设计概述在电子技术中,频率是最基本的参数之一,数字频率计具有精度高、使用方便、测量迅速、以及便于实现测量过程自动化等优点,是近代电子技术领域的重要工具之一,在许多领域得到广泛应用。

本系统以超低功耗MSP430G2553单片机为核心处理芯片来测量信号的频率,通过定时器A 采用计数法完成信号频率测量,并将被测频率值通过LCD12864液晶串行显示。

频率可测量范围在1Hz 到999MHz 之间。

如需要,范围可继续扩宽,频率计的误差在1%以内。

二、原理图基于MSP430G2553的频率计设计原理图如图1所示,通过串口方式液晶显示,只需配置单片机三个口线便可以实现对频率的测量。

其中待测频率信号从P1.0口输入,然后可以直接在液晶屏上显示。

三、引脚说明(一)MSP430G2553引脚功能说明由原理图可以看出,430单片机的最小系统用到1脚电源、16脚复位端、20脚接地端、配置P1.0口为待测信号输入端,P1.4为串行数据输出口,P1.5为串行时钟输出口,如表1所示。

图1 基于MSP430G2553频率计设计原理图表1 MSP430G2553引脚功能说明引脚序号引脚名称功能说明备注1 VCC 电源正2 P1.0 频率信号输入端6 P1.4 串行数据输出端7 P1.6 串行时钟输出端16 RST 复位脚20 GND 电源地(二)LCD12864引脚功能说明LCD12864液晶显示屏用到1、2脚,电源接口线,19、20脚背光电源接口线,15脚并行/串行接口选择,5脚串行数据口,6脚串行的同步时钟。

LCD12864引脚功能如表2所示。

表2 LCD12864接口说明引脚序号引脚名称功能说明备注1 VSS 模块的电源地2 VDD 模块的电源正端4 RS(CS) 并行指令/数据选择信号;串行片选信号5 R/W(SID) 并行读写选择信号;串行的数据口6 E(CLK) 并行使能信号;串行的同步时钟15 PSB PSB并/串行接口选择:H-并行,L-串行19 LED_A 背光源正极20 LED_K 背光源负极(0V)四、软件设计流程图系统软件设计包括初始化模块、中断模块和信号频率显示模块。

报告4

数字频率计摘要:本系统以TI公司的MSP430G2553单片机为控制和计算单元,外加放大整形电路,实现了对正弦波频率测量功能。

系统使用了计数法和测周期法对被测信号进行测量,其测试方法可以根据频率自行切换,实现了对各频带内的准确测量。

系统电路简单,架构合理,性能稳定。

关键词:MSP430单片机;数字频率计一、系统方案方案一:选用频率计专用模块。

该方案在技术上是可行的,但竞赛规则不能采用频率计专用模块。

即使允许使用,对于设计要求中的某些指标,采用专用模块完成也是困难的。

方案二:采用逻辑芯片和可编程器件实现。

还方案也是可行的。

该方案的优点是:仅使用硬件电路完成,调试工作量相对较少。

缺点是:某些功能实现困难,不易修改。

方案三:用单片机实现。

目前单片机种类很多,单片机功能越来越强,根据设计要求选用TI公司的MSP430单片机,该芯片内含2个16为定时/计数器,能最大限度的简化频率计外围器件。

MSP430还有全功能串行口、程序存储器等,因此该方案具有硬件构成简单、功能灵活、易于修改等有点。

综合上述三种方案,本设计选用方案三。

如图1所示,被测正弦波信号经过放大整形电路,得到方波信号;在通过MSP430G2553单片机进行定时Ts内产生方波N个(又f=N/T),从而达到测频的目的与要求,最后在LCD上显示频率值。

图1(系统框图)二、单元电路设计2.1.波形变换电路方案一:采用迟滞比较器。

该电路简单,并且输入正弦波信号后,经过变换可以输出方波信号,但是波形不是完全的方波。

当输入幅值较大的信号时,能够输入很好的方波;但是输入幅值较小(小于1V)的信号时,输入方波波形失真比较大。

方案二:采用过零比较器进行波形变换。

将输入的正弦波变换为同频率的方波信号。

电路简单可以同时满足0.5V和5V的幅值信号输入,且转换出来的方波波形完全不失真,输出电压为3.2V(可调,改变负载电阻即可)。

方案三:直接采用施密特触发器进行变换与整形。

李江基于MSP430G2553单片机的直流电机PWM调速系统设计

李江基于MSP430G2553单片机的直流电机PWM调速系统设计1 引言 (1)2 MSP430 简介 (2)3 脉宽调制(PWM)基本原理 (2)4 硬件设计 (3)4.1 电源模块设计 (3)4.2电机控制系统方案设计 (4)4.2 调速系统硬件电路设计 (4)5 软件设计 (6)5. 1 MSP430 指令集和编译软件的特点 (6)5. 2 整个系统的软件设计思想 (7)5.3 整个系统的程序设计流程图 (7)6 硬件调试 (8)7 性能评估 (12)8 总结思考 (13)参考文献 (13)附录 (14)电机控制系统是数控火焰切割机自动调高器中的关键部件。

提出了自动调高器中电机控制系统的方案,设计了基于单片机的PWM 直流电机控制硬件电路,指出了本系统软件设计需解决的关键问题,并设计了相应的控制软件。

该系统设计了一种实用新型的切割机自动调高系统,较好地解决了电机转动惯性对调高精度的影响。

关键词:自动调高器;直流电机;单片机;PWM1 引言数控切割机是对金属板材下料的机电设备,作为型材加工的关键设备之一,它是集数控技术、计算机软、硬件等技术为一体的高科技产品,在工业生产中发挥着重要的作用。

数控切割机在切割钢板的过程中,由于钢板高低不平或者倾斜等其它原因会影响加工质量,为提高加工的精度和质量,切割过程中需要高性能的自动调高器来保证割嘴到钢板之间高度的恒定。

电机控制系统用于实时调整割炬高度,是自动调高器中的关键部件。

直流电机由于具有速度控制容易,启、制动性能良好,且在宽范围内平滑调速等特点而在冶金、机械制造、轻工等工业部门中得到广泛应用。

直流电动机转速的控制方法可分为两类,即励磁控制法与电枢电压控制法。

励磁控制法控制磁通,其控制功率虽然小,但低速时受到磁饱和的限制,高速时受到换向火花和换向器结构强度的限制;而且由于励磁线圈电感较大,动态响应较差。

所以常用的控制方法是改变电枢端电压调速的电枢电压控制法。

电设工作小结之——MSP430G2553学习笔记—3

电设工作小结之——MSP430G2553学习笔记——3接上一篇继续:二,MSP430G2553的应用设计(一),频率计的设计1,频率计的实现方法有:测频法,测周法,等精度测频。

一般是低频用测周法较准,高频用测频法较准。

等精度测频是比较准的。

2,测周法:(1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。

(2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。

丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。

(3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。

3,测频法:(1)可以定时一定的时间,然后计算捕获脉冲的个数,从而得出周期。

(2)把待测信号接到IO脚上,然后用IO的中断功能在一定时间内记录脉冲数。

(3)设置Timer0_A的时钟为外接时钟TACLK,然后把待测信号接到该时钟上,把Timer0用作计数器,在一定时间内读取TAR寄存器,得出脉冲个数,从而得出频率。

(4)测频法,使用与测高频信号,对于低频信号误差较大。

4,等精度测频:(1)把Timer0_A工作于计数器模式,计数待测信号。

然后把Timer1_A的时钟设为ACLK,32768Hz的标准晶振,作为标准信号。

然后再外部输入一个控制闸门信号PWM(我觉得也可以用看门狗定时器工作在间隔定时器模式来控制),和待测信号一起通过D触发器控制计数的开始和结束。

这个外接的闸门信号可以用555振荡器产生一个周期可调的PWM,这个PWM 的周期不需要精确的控制,只有知道大概的范围就可,保证计数器不溢出即可,最终测的精度和它的周期没有绝对的关系。

(也可以在计数器溢出时,在溢出中断中记录溢出的次数,这样的话也可以,但是这样中断的进入和退出会对测量精度产生影响)(2) 如果Timer0_A用于其他用途的话,也可以接一个计数器,然后把计数值在输入给单片机(如小车上测速所采用的方法)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字式频率计一、设计概述在电子技术中,频率是最基本的参数之一,数字频率计具有精度高、使用方便、测量迅速、以及便于实现测量过程自动化等优点,是近代电子技术领域的重要工具之一,在许多领域得到广泛应用。

本系统以超低功耗MSP430G2553单片机为核心处理芯片来测量信号的频率,通过定时器A采用计数法完成信号频率测量,并将被测频率值通过LCD12864液晶串行显示。

频率可测量范围在1Hz到999MHz之间。

如需要,范围可继续扩宽,频率计的误差在1%以内。

二、原理图基于MSP430G2553的频率计设计原理图如图1所示,通过串口方式液晶显示,只需配置单片机三个口线便可以实现对频率的测量。

其中待测频率信号从P1.0口输入,然后可以直接在液晶屏上显示。

图1 基于MSP430G2553频率计设计原理图三、引脚说明(一)MSP430G2553引脚功能说明由原理图可以看出,430单片机的最小系统用到1脚电源、16脚复位端、20脚接地端、配置P1.0口为待测信号输入端,P1.4为串行数据输出口,P1.5为串行时钟输出口,如表1所示。

(二)LCD12864引脚功能说明LCD12864液晶显示屏用到1、2脚,电源接口线,19、20脚背光电源接口线,15脚并行/串行接口选择,5脚串行数据口,6脚串行的同步时钟。

LCD12864引脚功能如表2所示。

四、软件设计流程图系统软件设计包括初始化模块、中断模块和信号频率显示模块。

(一)主函数主函数流程图如图2所示。

在主程序中,主要对单片机配置进行初始化和屏幕初始化,以及频率信号数据的处理并实时显示。

图2 主函数流程图(二)单片机初始化函数单片机初始化函数包括对看门狗定时器模式的设置、I/O口输入/输出功能的配置。

定时器A所需时钟源、分频系数的选择,并将总中断打开。

函数流程图如图3所示。

图3 MSP430初始化流程图(三)中断函数中断函数流程图如图4所示。

当定时器A溢出后就进入中断,count就加上65535。

图4 中断函数(四)频率显示函数频率显示流程图如图5所示。

频率显示函数包含对定时器A相关内容的操作,将定时器A计数寄存器内容清零后,设置定时器A的工作模式,产生1s 计数闸门,关闭定时器A,记下count的值即为所测得频率的大小。

最后根据数据的大小,按不同的单位将数据通过12864液晶显示屏串行显示出来。

图5 频率显示函数五、程序源代码/***************************************************************基于定时器A,采用计数法完成信号频率的测量使用片内时钟DOC,时钟频率默认值采用12864串行显示频率测量范围:1Hz -- MHz(只要需要,范围可以继续扩宽,误差在1%以内) 被测信号输入管脚P1.0WR数据引脚P1.4SCLK模拟时钟引脚P1.5PSB串行/并行选择引脚接GND*****************************************************************/ #include<msp430g2553.h>#define uint unsigned int#define uchar unsigned char#define ulint unsigned long intulint count=0;void delay(uint t);void delay1(void);void int_430(void);void sendbyte(uchar zdata);void write_com(uchar cmdcode);void write_data(uchar Dispdata);void lcdinit();void print_string( char *s);void display(void);/*************主函数************/void main(){int_430();lcdinit();while(1){display();count=0;}}/*************延时函数************/void delay(uint t){uint i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}//1s延时的计数闸门void delay1(void){unsigned long i;for(i=0;i<119000;i++){_NOP(); // 该函数用来产生一个MSP430 系统时钟周期的延时}}/*************430初始化函数************/void int_430(void){WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗P1SEL&=~BIT4;P1DIR|= BIT4;P1OUT&=~BIT4;P1SEL&=~BIT5;P1DIR|= BIT5;P1OUT&=~BIT5;P1SEL|=BIT0; // 设置P1.0 为TimerA 外部计数信号输入口P1DIR&=~BIT0; // 设置P1.0 为输入口// TimerA 配置TACTL=TASSEL_0; // 定时器A 时钟源选择:TACLKTACTL=ID_3; // 计数时钟分频系数选择:1CCTL0 = CCIE; //开中断CCR0 = 65535;_EINT();}/*************数据传送函数************/void sendbyte(uchar zdata){uchar code_seg7,serial_clk, serial_shift;code_seg7=zdata;serial_shift=0x80;for(serial_clk=0; serial_clk<8; serial_clk++){if(code_seg7&serial_shift){P1OUT|=BIT4; //SID为1}else{P1OUT&=~BIT4; //SID为0}P1OUT&=~BIT5; //产生时钟信号下沿P1OUT|=BIT5; //产生时钟信号上沿serial_shift=serial_shift>>1; //准备发送下一位数据}}/*************写命令函数************/void write_com(uchar cmdcode){ //串口控制格式(11111AB0)//A数据方向控制,A=H时读,A=L时写//B数据类型选择,B=H时为显示数据,B=L时为命令sendbyte(0xf8); //MCU向LCD发命令sendbyte(cmdcode & 0xf0); //发高四位数据(数据格式D7D6D5D4_0000) sendbyte((cmdcode << 4) & 0xf0); //发低四位数据(数据格式D3D2D1D0_0000)delay(2); //延时等待}/*************写数据函数************/void write_data(uchar Dispdata){sendbyte(0xfa); //MCU向LCD发数据sendbyte(Dispdata & 0xf0); //发高四位数据sendbyte((Dispdata << 4) & 0xf0); //发低四位数据delay(2);}/*************LCD初始化函数************/void lcdinit(){delay(20000); //复位等待(内部自带上电复位电路),时间较长write_com(0x30); //功能设定:基本指令集操作delay(50); //延时等待write_com(0x0c); //整体显示,关游标delay(50);}/*************送字符串函数************/void print_string( char *s){while(*s > 0) //C语言里字符串末尾自动加“\0”(ASCII码值为0){delay(50);write_data(*s); //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址s++;}}/*************频率显示函数************/void display(void){ulint a1,a2,a3,a4,a5,a6,a7,a8,a9; // 声明计数数据变量TAR=0x0000; // 定时器A 计数寄存器内容清零TACTL=MC_2; // 定时器A 工作模式选择:连续模式delay1(); // 产生1s 计数闸门TACTL=MC_0; // 定时器A 工作模式选择:停止模式count +=TAR;write_com(0x01); //清屏指令if(count>=1000000){a1=count/100000000;a2=count%100000000/10000000;a3=count%100000000%10000000/1000000;a4=count%100000000%10000000%1000000/100000;a5=count%100000000%10000000%1000000/100000;a6=count%100000000%10000000%1000000%100000/10000;a7=count%100000000%10000000%1000000%100000%10000/1000;a8=count%100000000%10000000%1000000%100000%10000%1000/100;a9=count%100000000%10000000%1000000%100000%10000%1000%100/10;write_com(0x03);write_com(0x80); //第一行首地址0x80print_string("德州仪器MSP430 "); //第一行显示(必须加一个空格否则不能下载)write_com(0x90);print_string("频率:");write_com(0x93); //第二行首地址0x90,从第四个开始显示write_data(a1+0x30); //发送dat1的ASCII码,显示dat1的值write_data(a2+0x30); //发送dat1的ASCII码,显示dat2的值write_data(a3+0x30); //发送dat1的ASCII码,显示dat3的值write_data('.'); //发送"."write_data(a4+0x30); //发送dat1的ASCII码,显示dat4的值write_data(a5+0x30); //发送dat1的ASCII码,显示dat5的值write_data(a6+0x30); //发送dat1的ASCII码,显示dat6的值write_data(a7+0x30); //发送dat1的ASCII码,显示dat7的值write_data(a8+0x30); //发送dat1的ASCII码,显示dat8的值write_data(a9+0x30); //发送dat1的ASCII码,显示dat9的值write_com(0x88);print_string("单位:");write_data('M'); //发送H的ASCII码,显示Mwrite_data('H'); //发送H的ASCII码,显示Hwrite_data('z'); //发送z的ASCII码,显示z;delay(500);}else{if(count>=1000){a1=count/100000;a2=count%100000/10000;a3=count%100000%10000/1000;a4=count%100000%10000%1000/100;a5=count%100000%10000%1000/100;a6=count%100000%10000%1000%100%10;write_com(0x03);delay(50); //延时// 读定时器A 计数寄存器内容write_com(0x80); //第一行首地址0x80print_string("德州仪器MSP430 "); //第一行显示(必须加一个空格否则不能下载)write_com(0x90);print_string("频率:");write_com(0x94); //第二行首地址0x90,从第四个开始显示write_data(a1+0x30); //发送dat1的ASCII码,显示dat1的值write_data(a2+0x30); //发送dat1的ASCII码,显示dat2的值write_data(a3+0x30); //发送dat1的ASCII码,显示dat3的值write_data('.'); //发送"."write_data(a4+0x30); //发送dat1的ASCII码,显示dat4的值write_data(a5+0x30); //发送dat1的ASCII码,显示dat5的值write_data(a6+0x30); //发送dat1的ASCII码,显示dat6的值write_com(0x88);print_string("单位:");write_data('K'); //发送H的ASCII码,显示Kwrite_data('H'); //发送H的ASCII码,显示Hwrite_data('z'); //发送z的ASCII码,显示zdelay(500); //较长时间延时,保证下次操作前LCD完成上述功能处于非忙状态}else{count*=1000;a1=count/100000;a2=count%100000/10000;a3=count%100000%10000/1000;a4=count%100000%10000%1000/100;a5=count%100000%10000%1000/100;a6=count%100000%10000%1000%100%10;write_com(0x03);delay(50); //延时// 读定时器A 计数寄存器内容write_com(0x80); //第一行首地址0x80print_string("德州仪器MSP430 "); //第一行显示(必须加一个空格否则不能下载)write_com(0x90);print_string("频率:");write_com(0x94); //第二行首地址0x90,从第四个开始显示write_data(a1+0x30); //发送dat1的ASCII码,显示dat1的值write_data(a2+0x30); //发送dat1的ASCII码,显示dat2的值write_data(a3+0x30); //发送dat1的ASCII码,显示dat3的值write_data('.'); //发送"."write_data(a4+0x30); //发送dat1的ASCII码,显示dat4的值write_data(a5+0x30); //发送dat1的ASCII码,显示dat5的值write_data(a6+0x30); //发送dat1的ASCII码,显示dat6的值write_com(0x88);print_string("单位:");write_data('H'); //发送H的ASCII码,显示Hwrite_data('z'); //发送z的ASCII码,显示zdelay(500); //较长时间延时,保证下次操作前LCD完成上述功能处于非忙状态}}}#pragma vector = TIMER0_A0_VECTOR //Timer_A中断向量__interrupt void Tiemr_A(void){count +=65535;}。

相关文档
最新文档