
差分信号分析仪
简介
采用Arduino作为信号源,产生正弦波等信号,经过放大电路,最后在上位机LabVIEW上显示
简介:采用Arduino作为信号源,产生正弦波等信号,经过放大电路,最后在上位机LabVIEW上显示开源协议
:Public Domain
描述
1.信号发生器:
信号源采用的是Arduino单片机产生的正弦波,三角波,锯齿波,方波四种信号,由于Arduino uno没有好用的DA转换,可通过R2R网络来生成一个简易的DA转换单元,来输出对应的电压值。先在Arduino中产生出正弦波,三角波等波形的数字信号,将数字信号放在Arduino中的PORTD寄存器(D0~D7)中,再通过在面包板上搭建的简易DA转换器输出转换后的信号(即模拟信号)作为信号源输入到放大电路中
信号源Arduino程序:
int wavedigital[255];
//定义图形周期
int cycle;
//波形模式切换按键
const int button = 12;
//波形常数
volatile int wave = 0;
void setup()
{
Serial.begin(9600);
//设置中断程序
//attachInterrupt(button, waveSelect, RISING);
//输出端口 0-7
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
//改变输出信号频率调整完电位器后复位后生效
cycle=int(analogRead(A0)/10)+1;
//默认输出正玄波
wagegen();
}
void loop()
{
unsigned char date1[1]={0xFF};
unsigned char date2[1]={0xEE};
unsigned char date3[1]={0x0D};
unsigned char date4[1]={0x0A};
if(digitalRead(button)==0)
{
waveSelect();
}
//增加此句后会影响波形的质量,波形导致失真
//cycle=int(analogRead(A0)/10)+1;
for (int i=0;i<255;i++)
{
PORTD=wavedigital[i];
Serial.write(date1,1);
Serial.write(date3,1);
Serial.write(date4,1);
Serial.print(wavedigital[i]);
Serial.write(date2,1);
Serial.write(date3,1);
Serial.write(date4,1);
Serial.print(analogRead(A2));
//调试各个波形的值
// Serial.println( wavedigital[i]);
//调试波形周期
delayMicroseconds(cycle);
// delayMicroseconds(10);
}
//调试模拟量输入的值已决定波形周期
// Serial.println(cycle);
}
// 波形选择程序
void waveSelect() {
//选择所需波形 0-正玄波 1-三角波 2-锯齿波 3-矩形波
wave++;
if(wave == 4)
{
wave = 0;
}
wagegen();
delay(3000);
}
//波形数值生成
void wagegen()
{
float x;
float y;
//正玄波的值
if(wave==0)
{
for(int i=0;i<255;i++)
{
x=(float)i;
y=sin((x/255)*2*PI);
wavedigital[i]=int(y*128)+128;
// Serial.print(wavedigital[i]);
}
}
// 三角波的值
if(wave==1)
{
for(int i=0;i<128;i++)
{
x=(float)i;
wavedigital[i]=int(2*x);
}
for(int i=128;i<255;i++)
{
x=(float)i;
wavedigital[i]=255-int((x-128)*2);
// Serial.print(wavedigital[i]);
}
}
//锯齿波
if(wave==2)
{
for(int i=0;i<255;i++)
{
x=(float)i;
wavedigital[i]=x;
// Serial.print(wavedigital[i]);
}
}
//方波值得生成
if(wave==3)
{
for(int i=0;i<128;i++)
{
wavedigital[i]=255;
}
for(int i=128;i<255;i++)
{
wavedigital[i]=0;
// Serial.print(wavedigital[i]);
}
}
Arduino搭载的简易DA转换器连线图:
实物连线图:
2.放大电路:
放大电路采用的是立创公司电子设计大赛比赛附件中提供的原理图,在立创EDA绘制原理图与PCB,并完成电路的焊接与调试。
原理图:原理图采用的是立创比赛定制的原理图,在立创EDA上绘制
PCB:采用原理图中推荐封装,对元器件进行布局、排版、连线
焊接后实物图:
测试用PCB
测量显示(LabVIEW作为示波器):
测量显示部分使用的是Labview作为上位机显示信号的波形,使用了简单的状态机架构,对下位机发送的波形进行显示。实现方法是将差分放大电路中输入波形,放大后波形组成一个数据包,包头为十六进制FF,包尾为十六进制EE,通过Arduino单片机读取源信号的数据,并通过串口发送给Labview上位机,在上位机部分对数据进行解包并显示。
通过对下位机发送的信号进行解包处理,分别写出了两组LabVIEW程序,分别是对在Arduino通过面包板搭建的简易DA转换后的模拟信号和放大后信号进行显示,LabVIEW程序写好后,将程序打包为exe文件,以便在没有安装LabVIEW的电脑上仍然能够使用该程序。
正弦波:
示波器显示:
三角波
示波器显示
锯齿波
示波器波形:
方波:
示波器显示:
输出信号示波器显示:
正弦信号
三角波信号
锯齿波信号
方波信号:
设计图
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | 470pF | C1,C2 | C0603 | 2 |
2 | Header-Female-2.54_2x2 | H2 | HDR-TH_4P-P2.54-V-F-R2-C2-S2.54 | 1 |
3 | S9013 | Q1,Q2,Q3 | TO-92-3_L4.9-W3.7-P1.27-L | 3 |
4 | 2.7k | R1,R2 | R0603 | 2 |
5 | 1k | R3,R4,R5 | R0603 | 3 |

评论