这是我做的电设校赛题目,用的是430开发板,所以程序整体复制没什么意义,但里面对信号频率和幅值的处理算法和430内部ADC12 ,TIMERA中断的使用很值得初学者借鉴,希望对大家有帮助。 波形采集、存储并回放系统
(内附MSP430代码)
一. 方案设计与论证
1.1题目要求及指标分析
题目的基本要求是将待测周期信号的波形采集、存储并回放,由于要求系统断电后能恢复,所以进行模拟/数字转化并存储到存储器中。显示时,能从存储器读出数据并进行数字/模拟转化,然后输入到示波器。因此,设计的重点是模拟信号的采样、处理和显示,数字信号的存储,参数的检测和显示,系统的控制4个方面。 虽然对电压、周期的误差要求不是很严格,基本上能保证,但仍有许多因素可能产生误差,如干扰、器件、每周期采样的点数等。
1.2 方案分析与比较
处理核心的选择:
方案一:
采用单片机作为核心控制芯片。单片机的频率适中,抗干扰性能强,成本低。由于AT89S51单片机存储容量小,难以存储需要的数据;数字I/O口少,对采样,AD,DA的全程控制实现较难,且速度难以胜任高速采样的数据处理,故予以放弃;选择使用MSP430F149芯片,其存储容量、速度都满足需要,且其有低功耗的特性,故觉得是最佳选择。
方案二:
采用FPGA芯片作为核心控制器。在FPGA中可实现各种存储器。其硬件可编程的特点允许开发人员灵活设定存储器数据的宽度、存储器的大小、读写控制逻辑等,尤其适用于各种特殊存储要求的场合。它可工作于百兆频率以上,构造的存储器存取速度也可达百兆次每秒以上,能够胜任存储容量不太大,速度要求很高的场合,但成本较高,对硬件的编程
能力要求也很高。
综合以上考虑,决定采用方案一,以MSP430作为核心控制器。
ADC,DAC模块的选择
方案一:
采用外部芯片AD0809和TLC5615,该方案0809八位的采样位无法满足40MV至4V的信号采样精度要求,TLC5615 采用的是十位串口传输,DAC的速率太低,无法满足要求。陶瓷手链
方案二:
采用MSP430片内外设ADC12,该方案有采样速率高,精度高且电路简单的优点,DA采用外扩DAC0832,通过430定时中断产生0832的WR信号,以达到100KHz的DA速率。
1.3 方案设计框架
模拟信号通过输入信号调理模块(程控放大、叠加直流),将电压范围调理到msp430内部
12位AD的输入范围0—3.3V,再对信号进行采样。采用MSP430内部SMCLK作为AD的时钟信号并加以控制字控制,实现ADC12的100KHz采样速率,用430内部的主Flash区,地址0x5000至0x57FF共2K个字节存储两个波形的数据,数据包括ADC12防眩通路灯的采样结果和信号的周期,峰峰值。模拟信号频率的检测通过无线图像传输msp430内TIMEA定时器的捕捉功能检测出周期内的计数器计数差,从而算出信号频率。信号在接入430前,要通过基于LM311的过零检测电路转化成数字信号提供TIMEA的触发源;幅值检测可通过430内高精度12位AD采样结果数据中寻最大最小值得出,将以上结果通过外扩lcd1604和矩阵键盘实现显示控制功能;msp430内部主Flash断电不易失,可以将数据送入外扩八位单极性DAC0832电路,再通过输出信号调理模块,恢复为原来的模拟信号,接入示波器显示。
系统整体设计框架图如下:
图1.系统整体设计框架图
二、理论计算与分析
化学泥浆(1)对于输入信号处理电路,即程控放大的电阻值计算选取和叠加直流电压,以达到匹配AD输入电压0—3.3v的要求。经过分析,确定分为6个放大档位,按输入信号电压4v—2v—800mv—400mv—200mv—100mv—50mv,分别放大0.25、0.5、1.25、2.5、5、10倍,再通过放大器构成的加法器叠加1.6v直流电压,从而将电压调整到规定范围内。
(2)由于AD的采样频率为100KHz,对于10KHz的正弦波,每周期采样10个点,据此能够恢复采样前的信号。这样需要存储。
(3)显示频率和存储器读出频率的关系 显示屏上显示的信号是从存储器中读出的信号,只要使观察到的波形不闪烁即可。本设计中,单通道时刷新频率为200Hz;双踪示波时,每通道刷新频率为100HZ。通过计算,每秒读出的点数为200*200=40K。即RAM读出频率为40KHz,要求D/A转换速率高于40KHz。
(4)相反于输入信号处理过程,DA的输出信号经过直流调压、程控放大恢复出原来的信
号,即先减去1.6v的直流电压,再分别放大4、2、0.8、0.4、0.2、0.1倍。
三、电路图
图2.基于LF356、HCF4051的程控放大电路
图3.基于LM311的过零检测电路
图4.LF356的叠加直流电路
光学增强器守卫
四、测试方法与数据
由于本系统具有较好的模块结构,故采取分模块测试各部分的功能。对于模拟开关和程控放大部分,可以先人工选择档位,测试是否有放大功能,再接入主芯片,测试程序的运行情况,观察能否显示出峰值;对于过零检测电路,输入正弦波或三角波,观察输出是否是方波,再接入主芯片,测试能否测量和显示频率值;
程序代码如下:
#include "msp430x14x.h"
#define RW_H P6OUT|=BIT4
#define RW_L P6OUT&=~BIT4
#define RS_H P6OUT|=BIT2
#define RS_L P6OUT&=~BIT2
阳极化处理#define EN_H P6OUT|=BIT3
#define EN_L P6OUT&=~BIT3
#define LDATA P4OUT
typedef unsigned char uchar;
typedef unsigned int uint;
void AD12_INIT();
void control(uchar key_value);
void DA_10Bit(unsigned int DA_10);
void DA_OUT(uint dadata) ;
void delay(uint time);
void lcd_w(uchar cmd,uchar data1);
void lcd_xy(uchar x,uchar y);
void lcd_init(void);
void Print(uchar *str);
void Write_CGRAM(uchar *p);
void LCD_DisPlay(uchar i,uchar j,uchar ch);
void display(uint lcdfreq,uint lcdfuzhi) ;
void Flash_write(char addrab);
void FLASH_DEL(char addrab);
uint FREQ();
uint FUZHI();
uchar key_scan();
void C4051();
void C4051CTRL();
void DA_INIT();
void datafreq();
void datafuzhi();
uint check;
uchar BIGER=1;
uchar data[1024];
uint index=0;
uint start=0,end=0,seflag=1,period,vpp;
uchar key=0;
//////////////////////////////////////////////////////////////////////////////////////////////////ADC12模块初始化,中断使能,在中断中,将ad结果保存在变量数组data中
void AD12_INIT()
{
P6SEL |= BIT0; // 使能ADC通道
ADC12CTL0 = ADC12ON+SHT0_3+MSC; // 打开ADC,设置采样时间250k;=clk/4/sht0
ADC12CTL0|= REFON+REF2_5V;