资源描述
实训(论文)说明书
题 目:基于ATmega16单片机的
二极管参数测试仪的制作
系 别:机械电子工程系
专 业:机械电子工程
指导老师:
学生姓名:
学 号:
√
题目类型: 理论研究 实验研究 工程设计 工程技术研究 软件开发
2013年 5 月 27日
摘 要
本次设计的二极管参数测试仪,采用ATmega16单片机作为二极管的检测和控制核心;采用串行口通信数模转换芯片TLC5615,达到用AD采集方式检测二极管的各项参数。该设计电路结构简单、可靠性高,各种信息一目了,搭建了有好的操作界面。
关键词:单片机;正向压降;二极管
Abstract
The design of the diode parameter tester, using ATmega16 microcontroller as the diode detection and control of the core; using serial port communication digital-analog conversion chip TLC5615, reached with the AD acquisition mode detector diode parameters. The design is simple circuit structure, high reliability, a variety of information at a glance, to build a good user interface.
Key words:MCU; forward voltage drop; diode
目 录
引言 - 1 -
1.1 要求 - 1 -
2 恒流源系统 - 1 -
2.1 恒流源方案一 - 1 -
2.2恒流源方案二 - 2 -
3参数检测的具体设计与实现 - 3 -
3.1 核心芯片 - 3 -
3.1.1 ATmega16 - 3 -
3.2 电压采集电路设计方案 - 4 -
3.3 电源系统 - 5 -
5 系统性能测试 - 6 -
6 结论 - 6 -
谢 辞 - 7 -
参考文献 - 8 -
附 录 - 9 -
引言
随着电子技术的飞速发展,二极管成为目前使用最广泛的一种电子元器件,该装置具有体积小、功耗低、功能强、成本低等特点。在军事、民用及科学研究等领域得到了广泛的应用。单片机以其强大的控制能力为实现这一愿望提供了切实可行的手段。本设计二极管参数测试仪使用ATmega16单片机开发板和一些简单的外围电路作为主要驱动装置,用LCD5110显示二极管参数。
1 设计任务
设计一个二极管参数测试仪。
1.1 要求
1、 可以测量二极管的正向压降。
2、 可以列表显示二极管的正向伏安特性。
3、 可以设置二极管两端电流,然后检测二极管导通特性。
2 恒流源系统
二极管参数测试需要有一个稳定的电流源给二极管输出电流,然后再通过检测电路采集二极管两端电压值。
2.1 恒流源方案一
利用单片机的PWM功能输出PWM波,然后经过二阶滤波转换成稳定的电压值,再经过一个V-I转换电路将电压转成电流供给二极管。这样通过软件改变PWM波的占空比就可调节输入电流。对应电路如图2.1
图2.1 PWM方式恒流源电路图
2.2恒流源方案二
利用独立的DA芯片能更快速精确的改变输出电压,通过单片机传输设定电压数据给DA芯片,输出电压再经过V-I转换为电流给二极管。这样成本略高,但性能强劲。相应电路如图2.2。图2.3为V-I转换电路图。
图2.2 DA转换电路图
图2.3 V-I转换电路图
方案一成本低,电路简单。但是经过试验测试,电压变化不灵敏,失真度太大,不符合要求,而方案二虽然电路略复杂,但是反应快,调压精度高,故采用方案二。
3参数检测的具体设计与实现
3.1 核心芯片
3.1.1 ATmega16为ATMEL所生产的一种低功耗、高性能RCIS 8 位微控制器,具有8K在系统可编程Flash存储器,引脚如图3.1.1。其主要功能列举如下:
1、 拥有灵巧的8位CPU和在系统可编程Flash
2、 晶片内部具时钟振荡器(传统最高工作频率可至12MHz)
3、 内部程序存储器(ROM)为16KB
4、 内部数据存储器(RAM)为1KB
5、 32个可编程I O
6、 内部10位精度AD转换器
图3.1.1 单片机引脚图
3.1.2 TLC5615
TLC5615 为美国德州仪器公司 1999 年推出的产品,是具有串行接口的数模转换器,其输出为电压型,最大输出电压是基准电压值的两倍。带有上电复位功能,即把 DAC 寄存器复位至全零。性能比早期电流型输出的 DAC 要好。只需要通过 3 根串行总线就可以完成 10 位数据的串行输入, 易于和工业标准的微处理器或微控制器(单片机) 接口, 适用于电池供电的测试仪表、移动电话,也适用于数字失调与增益调整以及工业控制场合。如图3.1.2
图3.1.2 TLC5615功能图
TLC5615有两种工作方式: (A)16 位移位寄存器分为高 4 位虚拟位、低两位填充位以及 10位有效位。在单片 TLC5615 工作时,只需要向 16 位移位寄存器按先后输入 10位有效位和低 2 位填充位, 2 位填充位数据任意,这是第一种方式,即 12 位数据序列。 (B)第二种方式为级联方式, 即 16 位数据列,可以将本片的 DOU T 接到下一片的 DIN , 需要向 16 位移位寄存器按先后输入高 4 位虚拟位、10 位有效位和低 2 位填充位, 由于增加了高 4 位虚拟位, 所以需要 16 个时钟脉冲。
3.2 电压采集电路设计方案
电压采集我选择利用单片机内部的10位AD转换器。但是设计要求精度较高,实际使用时发现电压测得值浮动很大,故需要加入一定的去噪声电路和抗干扰电路。由此我设计了模拟输入电路如图3.2。
图3.2 模拟电压输入电路图
电压采集点用一个电压跟随器可以很好的加大输入阻抗和减小输出阻抗,在单片机的AD检测输入IO还必须加入二阶滤波,保证电压的稳定。
除了二极管两端电压还需要测量二极管的电流,在此我用了一个10欧姆的电阻作采样电阻与二极管串联,采样电阻两端电压,然后根据I=U/R就可以计算出流过二极管的电流,从而得出二极管的参数,其结构如图3.3
图3.2 电压采集电路图
3.3 电源系统
利用单片机内部的AD转换器需要提供一个基准参考电压。我用的是单片机的内部基准电压。基准电压的稳定决定了AD转换的精准度,因此必须保证单片机电压的稳定。我原来是用220V市电转5V供给给单片机,但是市电波纹太大,导致单片机电压不稳,严重影响的AD数据的精度。我发现万用表都是用9V的干电池供给,应该比较稳定,于是我也利用9V干电池给系统的放大器供电(采用的是LM358,LM324非轨道型放大器,这类放大器的最大输出电压为VCC-1,所有在这里用9V电压给放大器供电)然后9V电压经过一个LM2576开关型稳压器电路给单片机供电。经测试电压相当稳定,用万用表已经检测不到电压的波动。故采用此方案,9V-5V电路如图3.3。
图3.3稳压电路图
4 显示和按键电路
由于二极管参数测量仪需要显示和输入的内容比较少,要求功耗较低,所有采用LCD51101.5寸液晶屏作为显示,显示效果清晰且不需要背光灯。按键采用3个独立式的按键。
5 系统性能测试
为了保证电路万无一失, 在制作完成后,我用二极管1N4007作了测试实验,实验数据如表1
表
表1实验数据表
经过多次实验,数据相差均不超过1%,故认为方案可行。
6 结论
采用单一单片机结构,用软件商的多任务结构是系统同时去执行多个操作,提高了CPU得利用率和系统的灵活性。该设计具有结构轻巧、操作简单、维护方便、成本低、可靠性高等优点,有一定得开发利用前景。
谢 辞
在本次实训中感谢朱老师在制作过程中对我们的指导和帮助!
参考文献
[1] 朱清慧,张凤蕊,翟天蒿,王志奎.电子线路设计、制版与仿真[M].北京:清华大学出版社,2008.9:151~177.
[2] 龚淑秋,李忠波.电子技术(非电类专业)[M].北京:机械工业出版社,2010.7:206~259
附 录
单片机程序
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd5110.h"
#define DAPORT PORTB
#define DADDR DDRB
#define CLK 6
#define CS 5
#define DIN 7
volatile uint16_t V1,V2,V3,V4,V5,I1,I2,I3,I4,I5,pwm_v;
volatile uint8_t Trg,Cont,pwm_ih,pwm_il,a=1,b=1;
//================================读¨¢键¨¹值¦Ì函¡¥数ºy==================================
void KeyRead( void )
{
unsigned char ReadData = PIND^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
//===================================================DA电Ì?压1输º?出?========================================
void DA_Conver(uint16_t DAValue)
{
uint8_t i;
DAValue <<= 6;
SETBIT(DADDR,CLK);
SETBIT(DADDR,CS);
SETBIT(DADDR,DIN);
CLEARBIT(DAPORT,CS); // 片?选?DA芯?片?
CLEARBIT(DAPORT,CLK); // 在¨²以°?下?12个?时º¡À钟¨®周¨¹期¨²内¨²,每?当Ì¡À在¨²上¦?升¦y沿?的Ì?
// 数ºy据Y被À?锁?存ä?,形?成¨¦DA输º?出?。¡ê在¨²前¡ã10个?时º¡À钟¨®
for(i = 0; i < 12; i++) // 内¨²输º?入¨?的Ì?是º?10位?DA数ºy据Y,ê?后¨®两¢?个?时º¡À钟¨®周¨¹期¨²
{ // 为a填¬?充?字Á?节¨²。¡ê
if(DAValue & 0x8000) SETBIT(DAPORT,DIN);
else CLEARBIT(DAPORT,DIN);
SETBIT(DAPORT,CLK); //
DAValue <<= 1; //
CLEARBIT(DAPORT,CLK);
}
SETBIT(DAPORT,CS); // CS的Ì?上¦?升¦y沿?和¨ª下?降¦Ì沿?只?有®D在¨²clk为a低̨ª的Ì?时º¡À候¨°
CLEARBIT(DAPORT,CLK); // 才?有®D效¡ì
}
//===========================================单Ì£¤通ª¡§道̨¤AD输º?入¨?0 差?分¤?输º?入¨?1,单Ì£¤位?mV======================================
uint16_t adc_calc(uint8_t k,uint8_t a)
{
uint16_t value=0;
float vtemp;
CLEARBIT(DDRA,7);
CLEARBIT(PORTA,7);
ADCSRA = 0x00; //禁?止1AD转Áa换?
if(k) ADMUX = 0xd0;
else ADMUX= 0xc0|a;
SFIOR |= 0x00;
ACSR = 0x80; //禁?止1模¡ê拟a比À¨¨较?器¡Â
ADCSRA = 0xC7;
while(!(ADCSRA & (1<<ADIF)));
value=ADCL; //首º¡Á先¨¨读¨¢低̨ª位?
value=(ADCH<<8)+value; //然¨?后¨®读¨¢高?位?
if (k)
{
if (value>0x200) //负o数ºy要°a变À?换?,ê?正y数ºy不?用®?
{
value=~value+1; //变À?换?成¨¦16位?无T符¤?号?整?数ºy
value&=0x03FF;
}
if(value==0x200) value=512;
vtemp=(float)(value*5);
}
else
{
vtemp=(float)(value*2.5);
}
value=(uint16_t)vtemp;
ADCSRA|=1<<ADIF;
ADCSRA=0x00;
return value;
}
//=================================================AD多¨¤次ä?测a量¢?求¨®平?均¨´值¦Ì================================================
uint16_t adc_diode(uint8_t k,uint8_t a)
{
uint8_t i;
uint16_t temp=0;
adc_calc(k,a);
for(i=0;i<50;i++)
{
temp=adc_calc(k,a)+temp;
}
temp=temp/i;
return temp;
}
//================================================显?示º?函¡¥数ºy===============================================
void display(uint16_t i,uint16_t j,uint8_t k)
{
uint8_t a,b,c,d;
j=adc_diode(0,0); //单Ì£¤位?是º?0.1mA
if(j<=1) reset();
i=adc_diode(0,1);//单Ì£¤位?是º?mV
i=adc_diode(0,1);
i=adc_diode(0,1)-j-3;
if(j>11)
{
j=j+(j-11)/11;
}
a=j/100+0x30;
b=j%100/10+0x30;
c=j%10+0x30;
LCD_set_XY(48,k);
if(a!=0X30) LCD_write_char(a);
else LCD_write_char(' ');
LCD_write_char(b);
LCD_write_char('.');
LCD_write_char(c);
a=i/1000+0x30;
b=i%1000/100+0x30;
c=i%1000%100/10+0x30;
d=i%10+0x30;
LCD_set_XY(12,k);
if(a!=0X30) LCD_write_char(a);
else LCD_write_char(' ');
LCD_write_char(b);
LCD_write_char(c);
LCD_write_char(d);
}
//===========================================================PWM===================================================
void StartPWM(uint16_t value) //单Ì£¤位?mA,ê?参?数ºy是º?输º?出?电Ì?流¢¡Â
{
TCCR1B = 0x00;//停ª¡ê止1定¡§时º¡À器¡Â
TIMSK |= 0x00;//中D断?允¨º许¨ª
TCNT1 = 0x0000;//初?始º?值¦Ì
OCR1A = 0x1F3F;//匹£¤配?A值¦Ì
OCR1B = value*16;//匹£¤配?B值¦Ì
ICR1 = 0xffff;//输º?入¨?捕?捉Á?匹£¤配?值¦Ì
TCCR1A = 0x2F;
TCCR1B = 0x19;//启?动¡¥定¡§时º¡À器¡Â
}
void PWM_VI(uint16_t VI) //mV单Ì£¤位?设¦¨¨定¡§值¦Ì
{
uint16_t temp,pwm,i,temp1;
DA_Conver(256);
for(i=0;i<5;i++) temp1=adc_diode(0,0);
temp=adc_diode(0,0);
if (VI<temp1)
{
pwm=1;
while(temp!=VI)
{
DA_Conver(pwm++);
for(i=0;i<5;i++) temp=adc_diode(0,0);
if(pwm==512) return;
}
}
else
{
pwm=512;
while(temp!=VI)
{
DA_Conver(pwm--);
for(i=0;i<5;i++) temp=adc_diode(0,0);
if(pwm==256) return;
}
}
}
void reset()
{
asm( "cli" );
asm( "clr r30" );
asm( "clr r31" );
asm( "jmp 0" );
}
//==========================================================主¡Â函¡¥数ºy==================================================
void main(void)
{
uint8_t i;
LCD_init();//初?始º?化¡¥液°o晶¡ì
CLEARBIT(DDRD,0);
CLEARBIT(DDRD,1);
CLEARBIT(DDRD,2);
SETBIT(DDRD,4);
SETBIT(PORTD,0);
SETBIT(PORTD,1);
SETBIT(PORTD,2);
LCD_write_chinese_string(5,0,12,6,0,0,0);
LCD_write_chinese_string(36,2,12,1,6,0,0);
LCD_write_chinese_string(5,4,12,6,7,0,0);
while(adc_diode(0,0)<=1);
DA_Conver(50);
LCD_clear();
LCD_write_chinese_string(5,0,12,6,13,0,1);
LCD_write_chinese_string(5,2,12,6,19,0,0);
while(1)
{
display(V1,I1,5);
_delay_ms(50);KeyRead();
if (Trg&0x01)
{
LCD_clear();
if(a==1)
{
LCD_write_chinese_string(5,0,12,6,13,0,0);
LCD_write_chinese_string(5,2,12,6,19,0,1);
a=0;
}
else
{
LCD_write_chinese_string(5,0,12,6,13,0,1);
LCD_write_chinese_string(5,2,12,6,19,0,0);
a=1;
}
}
if (Trg&0x02)
{
if(a)
{
LCD_clear();
LCD_write_english_string(12,0,"U/mV I/mA");
DA_Conver(100);_delay_ms(100);
for(i=0;i<30;i++) display(V1,I1,1);
DA_Conver(175);_delay_ms(100);
for(i=0;i<30;i++) display(V2,I2,2);
DA_Conver(250);_delay_ms(100);
for(i=0;i<30;i++) display(V3,I3,3);
DA_Conver(325);_delay_ms(100);
for(i=0;i<30;i++) display(V4,I4,4);
DA_Conver(400);_delay_ms(100);
for(i=0;i<30;i++) display(V5,I5,5);
b=0;
KeyRead();
while(!(Trg&0x04))
{
if(Trg&0x02)
{
if (b)
{
LCD_clear();
LCD_write_english_string(12,0,"U/mV I/mA");
DA_Conver(100);_delay_ms(100);
for(i=0;i<30;i++) display(V1,I1,1);
DA_Conver(175);_delay_ms(100);
for(i=0;i<30;i++) display(V2,I2,2);
DA_Conver(250);_delay_ms(100);
for(i=0;i<30;i++) display(V3,I3,3);
DA_Conver(325);_delay_ms(100);
for(i=0;i<30;i++) display(V4,I4,4);
DA_Conver(400);_delay_ms(100);
for(i=0;i<30;i++) display(V5,I5,5);
b=0;
}
else
{
LCD_clear();
Paint_line(5,0,5,43,1);
Paint_line(15,43,15,48,1);
Paint_line(25,43,25,48,1);
Paint_line(35,43,35,48,1);
Paint_line(45,43,45,48,1);
Paint_line(55,43,55,48,1);
Paint_line(65,43,65,48,1);
Paint_line(5,43,66,43,1);
Paint_line(0,37,5,37,1);
Paint_line(0,32,5,32,1);
Paint_line(0,27,5,27,1);
Paint_line(0,22,5,22,1);
Paint_line(0,17,5,17,1);
Paint_line(0,12,5,12,1);
Paint_line(0,7,5,7,1);
Paint_line(0,2,5,2,1);
CachePixel(5+10,43-9,1);
CachePixel(5+20,43-12,1);
CachePixel(5+30,43-15,1);
CachePixel(5+40,43-17,1);
CachePixel(5+50,43-20,1);
LCD_write_english_string(7,0,"0.2V");
LCD_write_english_string(66,5,"2mA");
b=1;
}
KeyRead();
}
else {_delay_ms(50);KeyRead();}
}
a=1;
LCD_clear();
LCD_write_chinese_string(5,0,12,6,13,0,1);
LCD_write_chinese_string(5,2,12,6,19,0,0);
}
else
{
LCD_clear();
LCD_write_english_string(5,0,"Please Set:");
LCD_set_XY(12,3);
LCD_write_char(pwm_ih+0x30);
LCD_write_char('.');
LCD_write_char(pwm_il+0x30);
LCD_write_char('m');
LCD_write_char('A');
_delay_ms(50);KeyRead();
while(!(Trg&0x04))
{
_delay_ms(50);
KeyRead();
if (Trg&0x01)
{
pwm_ih++;
if(pwm_ih==10) pwm_ih=0;
LCD_set_XY(12,3);
LCD_write_char(pwm_ih+0x30);
}
if (Trg&0x02)
{
pwm_il++;
if(pwm_il==10) pwm_il=0;
LCD_set_XY(24,3);
LCD_write_char(pwm_il+0x30);
}
}
pwm_v=pwm_ih*10+pwm_il;
if (pwm_v>11)
{
pwm_v=pwm_v-(pwm_v-11)/11;
}
LCD_clear();
LCD_write_english_string(0,3,"Please Wait...");
PWM_VI(pwm_v);
LCD_clear();
a=1;
LCD_write_chinese_string(5,0,12,6,13,0,1);
LCD_write_chinese_string(5,2,12,6,19,0,0);
}
}
}
// LCD_draw_bmp_pixel(32,0,AVR_bmp,48,24);
// LCD_write_english_string(12,0,"U/mV I/mA");*/
}
最终成品图目录
第一章 总 论 1
1.1 项目概况 1
1.2 可行性研究报告编制依据及原则 1
1.3 可行性研究报告的内容 3
第二章 项目背景与建设的必要性 4
2.1 项目建设的背景 4
2.2 项目建设的必要性 5
2.3 结论 5
第三章 效益分析 7
3.1 社会效益 7
3.2 经济效益 8
3.3 环境效益 8
3.4 评价结论 9
第四章 项目选址及建设条件 10
4.1 项目选址 10
4.2 项目建设地点 10
4.3 项目建设条件 10
第五章 项目建设方案 17
5.1方案设计原则 17
5.2 总体方案设计 17
5.3 道路工程 17
5.4 平面交叉口设计 22
5.5路灯布设 23
第六章 投资估算与资金筹措 24
6.1 投资估算 24
6.2 资金筹措 25
第七章 环境影响分析 26
7.1 编制依据 26
7.2 项目建设与运营对环境影响及治理措施 27
7.3环境影响结论 30
第八章 劳动安全 32
8.1 影响劳动安全的因素分析 32
8.2 防护及监控措施 33
第九章 建设管理 34
9.1 建设期项目管理 34
9.2 建设期组织机构 34
9.3项目运营期管理 35
第十章 可行性研究结论与建议 36
10.1结论 36
10.2建议 36
- 19 -
展开阅读全文