
【天津工业大学】差分放大电路测试仪 滕天淇
简介
本测试仪以STM32F103单片机和Arduino单片机为核心控制器件,利用DDS模块、放大器和电阻分压电路产生幅度、频率可调的差分信号Uid,依题意路搭建三极管差分放大电路,并调试使之正常工作。
简介:本测试仪以STM32F103单片机和Arduino单片机为核心控制器件,利用DDS模块、放大器和电阻分压电路产生幅度、频率可调的差分信号Uid,依题意路搭建三极管差分放大电路,并调试使之正常工作。开源协议
:Public Domain
描述
摘要:本测试仪以STM32F103系列单片机和Arduino Uno单片机为核心控制器件,利用DDS模块、放大器和电阻分压电路产生幅度、频率可调的差分信号Uid,依题意路搭建三极管差分放大电路,并调试使之正常工作,通过采集输入电压Uid和流过输入电阻上电流Iid,算出输入电阻Rid;通过采集输出电压Uod,算出电压放大倍数Avd;并为了测量差分放大电路的幅频特性,编写程序使其在显示屏上显示。
在 1KHz 下测量放大器的电压放大倍数和输入电阻,由测量、计算得知放大倍数约为32倍,输入电阻约为50欧姆。该测试仪基本满足题目要求。
关键词:STM32F103;AD9851;Arduino Uno。
一、方案设计与论证
1、控制方案选择
方案一:单片机+FPGA方式。该方案利用FPGA输出以10mV步进在0-100mV内幅度可调、频率以100Hz步进在100Hz~1MHz可调的差模信号和步进为10mV的在0V~1V可调的共模信号,产生测试所用信号,利用单片机控制信号源以及控制FPGA,即由单片机对输出信号进行采集、处理、计算、显示和人机交互接面等顶层功能,由FPGA完成测试所用信号输出。
方案二:采用基于ARM Cortex™-M4内核的STM32F103系列单片机以及采用基于ATmega328P的Arduino UNO系列微控制器板。其中STM32F103系列单片机以及该微控制器板有着高主频,内部集成FPU有很强的计算能力,能够处理复杂计算和控制。Arduino UNO系列微控制器板编程简单,功率较小,能够执行简单操作。
考虑其可行性、以及所有的利用资源后,采用方案二作为本次设计方案。
2、差分信号源生成方案选择
方案一:利用STM32单片机的DAC产生差分信号。STM32F407的DAC模块配置为12位模式,与DMA控制器配合使用。但是需要频率变化,通过单片机产生正弦波高频段其精度不够且占资源。
方案二:利用ADI公司应用的最广泛的DDS芯片AD9851制作正弦波发生器,此模块可以输出高稳定性的正弦波且频率范围可达40MHz,幅度范围为80mV~2V。另外此芯片采用专用的稳压基准芯片。供电更加稳定。并结合STM32单片机DAC输出共模信号,编写程序更加简单。
综上所述,采用第二种方案作为本次设计方案。
3、总体方案设计
图1
系统总体框图如图1所示。本系统采用基于ARM内核的STM32F103单片机和基于ATmega328P的Arduino UNO系列微控制器板的软件控制DDS模块AD9851产生差分信号,经过以放大器为原理的调幅模块,输入放大电路。采用STM32F103单片机测量差分放大电路的幅频特性,并在显示屏显示。
二、理论分析与计算
1、理论电压放大倍数的计算
图2
被测电路如图2 所示差分共射放大电路。
通过仿真软件,设置差模信号频率为1KHz,将差分信号输入差分放大电路,并将输入信号和输出信号连接至示波器。观察,记录并测量uid和uod,通过计算Avd =uod/uid,计算理论电压放大倍数为。
2、理论输入电阻的计算
通过仿真软件,设置差模信号频率为1KHz,将差分信号连接至示波器,在波形未明显失真的前提下,观察,记录并测量uid,并使用万用表测量输入电流Iid,应用放大器的输入电阻公式Rid =uid/Iid,计算理论输入电阻为。
三、电路与程序设计
1、调幅电路设计
应用运算放大电路,调整相关电阻阻值大小改变其放大倍数,实现调幅。
2、实际电压放大倍数的测量
图3
应用Arduino控制DDS模块,使输入差模信号频率为1KHz,将差分信号输入差分放大电路,并将输入信号和输出信号连接至示波器。在波形无明显失真的情况下,观察、记录并测量uid和uod,通过计算Avd =uod/uid,计算实际电压放大倍数为32倍。
3、实际输入电阻的计算与测量
应用Arduino控制DDS模块,设置差模信号频率为1KHz,将差分信号连接至示波器,在波形未明显失真的前提下,观察,记录并测量uid,并使用万用表测量输入电流Iid,应用放大器的输入电阻公式Rid =uid/Iid,计算实际输入电阻为50欧姆。
四、测试方案与测试结果
1、测试仪器
表1 测试仪器表
测试仪器列表 |
|
万用表 |
VICTOR VC890C+ |
电源 |
EAST WYK-303B2 |
示波器 |
RIGOL DG4102 |
信号源 |
RIGOL DP832A |
2、测试结果及分析
2.1、放大倍数测试
使差模信号频率稳定在1KHz下测量并计算放大器的电压放大倍数和输入电阻。
表2 放大倍数测试表
输出/输入电压 |
测量值 |
uod |
3.52V |
uid |
0.11V |
Avd |
32 |
根据电压放大倍数公式Avd =uod/uid,计算Avd=32。
2.2、输入电阻测试
表3 输入电阻测试表
Uid |
0.11V |
Iid |
2.2mA |
根据输入电阻公式Rid =uid/Iid ,计算得实际输入电阻Rid=50欧姆。
附录:
STM32代码
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "dac.h"
#include "adc.h"
#include "usmart.h"
/************************************************
ALIENTEK¾«Ó¢STM32¿ª·¢°åʵÑé20
DAC ʵÑé
¼¼ÊõÖ§³Ö£ºwww.openedv.com
ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com
¹Ø×¢Î¢ÐŹ«ÖÚÆ½Ì¨Î¢Ðźţº"ÕýµãÔ×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£
¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
×÷ÕߣºÕýµãÔ×Ó @ALIENTEK
************************************************/
int main(void)
{
//u16 adcx;
//float temp;
u8 t=0;
u16 dacval=0;
u8 key;
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
uart_init(115200); //´®¿Ú³õʼ»¯Îª115200
KEY_Init(); //³õʼ»¯°´¼ü³ÌÐò
//LED_Init(); //LED¶Ë¿Ú³õʼ»¯
//LCD_Init(); //LCD³õʼ»¯
usmart_dev.init(72); //³õʼ»¯USMART
Adc_Init(); //ADC³õʼ»¯
Dac1_Init(); //DAC³õʼ»¯
//POINT_COLOR=RED;//ÉèÖÃ×ÖÌåΪºìÉ«
//LCD_ShowString(60,50,200,16,16,"Elite STM32");
//LCD_ShowString(60,70,200,16,16,"DAC TEST");
//LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
//LCD_ShowString(60,110,200,16,16,"2015/3/8");
//LCD_ShowString(60,130,200,16,16,"WK_UP:+ KEY1:-");
//ÏÔʾÌáʾÐÅÏ¢
//POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«
//LCD_ShowString(60,150,200,16,16,"DAC VAL:");
//LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");
//LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");
DAC_SetChannel1Data(DAC_Align_12b_R, 0);//³õʼֵΪ0
while(1)
{
t++;
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
if(dacval<100)dacval+=10;
//DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//ÉèÖÃDACÖµ
}else if(key==KEY1_PRES)
{
if(dacval>10)dacval-=10;
else dacval=0;
//DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//ÉèÖÃDACÖµ
}
delay_ms(10);
Dac1_Set_Vol(dacval);
}
//void Dac1_Set_Vol(u16 vol)
//{
//float temp=vol;
//temp/=1000;
//temp=temp*4096/3.3;
//DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12λÓÒ¶ÔÆëÊý¾Ý¸ñʽÉèÖÃDACÖµ
//}
}
Arduino代码
#define ad9851_w_clk 2
#define ad9851_fq_up 3
#define ad9851_rest 4
#define ad9851_bit_data 5
int a=1;
void setup() {
pinMode(ad9851_w_clk, OUTPUT);
pinMode(ad9851_fq_up, OUTPUT);
pinMode(ad9851_rest, OUTPUT);
pinMode(ad9851_bit_data, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(ad9851_w_clk, 0);
digitalWrite(ad9851_fq_up, 0);
digitalWrite(ad9851_rest, 0);
digitalWrite(ad9851_bit_data, 0);
Serial.begin(9600);
Serial.println("init complete!");
}
void loop() {
ad9851_reset_serial();
ad9851_wr_serial(0x01, 500);
//0x01为开六倍频
//ad9851_wr_serial(0x00, 500);
//0x00为不开六倍频
digitalWrite(13, 0);
delay(500);
digitalWrite(13, 1);
delay(500);
digitalWrite(13, 0);
delay(500);
digitalWrite(13, 1);
delay(500);
ad9851_reset_serial();
ad9851_wr_serial(0x01, 2000);
}
//***************************************************//
// ad9851复位(串口模式) //
//---------------------------------------------------//
void ad9851_reset_serial()
{
digitalWrite(ad9851_w_clk, 0);
digitalWrite(ad9851_fq_up, 0);
//rest信号
digitalWrite(ad9851_rest, 0);
digitalWrite(ad9851_rest, 1);
digitalWrite(ad9851_rest, 0);
//w_clk信号
digitalWrite(ad9851_w_clk, 0);
digitalWrite(ad9851_w_clk, 1);
digitalWrite(ad9851_w_clk, 0);
//fq_up信号
digitalWrite(ad9851_fq_up, 0);
digitalWrite(ad9851_fq_up, 1);
digitalWrite(ad9851_fq_up, 0);
}
//***************************************************//
// 向ad9851中写命令与数据(串口) //
//---------------------------------------------------//
void ad9851_wr_serial(unsigned char w0, double frequence)
{
unsigned char i, w;
long int y;
double x;
int bit_data;
/ar inByte;
String b="";
//计算频率的HEX值
x = 4294967295 / 180; //适合180m晶振/180为最终时钟频率(或30m六倍频)
//如果时钟频率不为180MHz,修改该处频率值,单位为MHz
frequence = frequence / 1000000;
frequence = frequence * x;
y = frequence;
//**********************************************//
while (Serial.available() > 0) //判断串口是否有数据
{
b +=char(Serial.read()); //读取数据,串口一次只能读1个字符
delay(10);
a = b.toInt();
Serial.println(a);
}
//********************************************//
y=y/5*a;
//写w4数据
w = (y >>= 0);
for (i = 0; i < 8; i++)
{
bit_data = (w >> i) & 0x01;
digitalWrite(ad9851_bit_data, bit_data);
digitalWrite(ad9851_w_clk, 1);
digitalWrite(ad9851_w_clk, 0);
}
//写w3
w = (y >> 8);
for (i = 0; i < 8; i++)
{
bit_data = (w >> i) & 0x01;
digitalWrite(ad9851_bit_data, bit_data);
digitalWrite(ad9851_w_clk, 1);
digitalWrite(ad9851_w_clk, 0);
}
//w2
w = (y >> 16);
for (i = 0; i < 8; i++)
{
bit_data = (w >> i) & 0x01;
digitalWrite(ad9851_bit_data, bit_data);
digitalWrite(ad9851_w_clk, 1);
digitalWrite(ad9851_w_clk, 0);
}
//w1
w = (y >> 24);
for (i = 0; i < 8; i++)
{
bit_data = (w >> i) & 0x01;
digitalWrite(ad9851_bit_data, bit_data);
digitalWrite(ad9851_w_clk, 1);
digitalWrite(ad9851_w_clk, 0);
}
//w0
w = w0;
for (i = 0; i < 8; i++)
{
bit_data = (w >> i) & 0x01;
digitalWrite(ad9851_bit_data, bit_data);
digitalWrite(ad9851_w_clk, 1);
digitalWrite(ad9851_w_clk, 0);
}
//移入使能
digitalWrite(ad9851_fq_up, 1);
digitalWrite(ad9851_fq_up, 0);
}
设计图
BOM


评论