发作品签到
标准版

【天津工业大学】差分放大电路测试仪 滕天淇

工程标签

1.3k
0
0
0

简介

本测试仪以STM32F103单片机和Arduino单片机为核心控制器件,利用DDS模块、放大器和电阻分压电路产生幅度、频率可调的差分信号Uid,依题意路搭建三极管差分放大电路,并调试使之正常工作。

简介:本测试仪以STM32F103单片机和Arduino单片机为核心控制器件,利用DDS模块、放大器和电阻分压电路产生幅度、频率可调的差分信号Uid,依题意路搭建三极管差分放大电路,并调试使之正常工作。

开源协议

Public Domain

创建时间:2021-05-18 23:14:59更新时间:2021-07-02 08:37:45

描述

摘要本测试仪以STM32F103系列单片机Arduino Uno单片机为核心控制器件,利用DDS模块、放大器和电阻分压电路产生幅度、频率可调的差分信号Uid,依题意路搭建三极管差分放大电路,并调试使之正常工作,通过采集输入电压Uid和流过输入电阻上电流Iid,算出输入电阻Rid;通过采集输电压Uod,算出电压放大倍数Avd并为了测量差分放大电路的幅频特性,编写程序使其在显示屏上显示。

1KHz 下测量放大器的电压放大倍数和输入电阻,由测量、计算得知放大倍数约为32倍,输入电阻约为50欧姆。该测试仪基本满足题目要求。

关键词STM32F103AD9851Arduino 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);
}

设计图

原理图(1 / 2)

BOM

暂无BOM

附件

序号文件名称下载次数
1
嘉立创.rar
119
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航