一、设计题目:
基于单片机的数字电流表设计
二、设计要求:
- 数字电流表在平常工作环境中能良好工作
- 能测0——1000mA电流,至少能达1%的精度
- 要求掌握I/V信号转换,A/D转换器的使用和数据采集系统的设计
- 电流表能数字显示,且由单片机处理采集数据并驱动LED显示
。
目 录
一、功能要求…………………………………………………………………5
二、原理及方案论证…..………………………………………………………5
三、系统硬件电路的设计………………………………………………………9
四、系统程序的设计…………………………………………………………10
五、调试及设计结果………………………………………………………….19
参考文献 …………………………………………………………………...20
一、功能要求
1、数字电流表在平常工作环境中能良好工作
2、能测0——1000mA电流,至少能达1%的精度
3、要求掌握I/V信号转换,A/D转换器的使用和数据采集系统的设计
4、电流表能数字显示,且由单片机处理采集数据并驱动LED显示
二、原理及方案论证
1、数字电流表工作原理
1.1采样电阻网络
原理如下图所示,输入被测电流通过量程转换开关S1——S4,流经采样电阻R1——R4,由欧姆定律可知:U=I*R,因而转换输出电压为0V——0.1V的电压,输出电压可再经后续放大电路放大处理。
1.2高共模抑制比放大电路
如下图,由双运放组成的同相输入高共模抑制比放大电路,其闭环输出可表示为:
为使共模输入为0,可令R1/R2=R4/R3,此时电路的差动闭环增益为Kd=1+R1/R2, U0=Kd(U1-U2); 下图即Kd=11,U0=11(U1-U2);
1.3通用A/D转换器
ADC0832 是美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D 转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
ADC0832 具有以下特点:
◆ 8 位分辨率;
◆ 双通道 A/D转换;
◆ 输入输出电平与 TTL/CMOS 相兼容;
◆ 5V 电源供电时输入电压在 0~5V 之间;
◆ 工作频率为 250KHZ,转换时间为 32μS;
◆ 一般功耗仅为 15mW;
◆ 8P、14P—DIP(双列直插)、PICC 多种封装;
◆ 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为- 40°C to +85°C;
芯片接口说明
CS_ 片选使能,低电平芯片使能。
CH0 模拟输入通道 0,或作为 IN+/-使用。
CH1 模拟输入通道 1,或作为 IN+/-使用。
GND 芯片参考 0 电位(地)。
DI 数据信号输入,选择通道控制。
DO 数据信号输出,转换数据输出。
CLK 芯片时钟输入。
Vcc/REF 电源输入及参考电压输入(复用)。
1.4 AT89C51单片机
AT89C51是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的只读程序存 储器(PEROM)和256 bytes 的随机存取数据存储器(RAM),器件采用ATMEL 公司的高密度、非易失性存储技术生产, 与标准MCS-51 指令系统及8052 产品引脚兼容,片内置通用8 位 央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于许多较为复杂控制应用场合。
主要性能参数
·与MCS-51 产品指令和引脚完全兼容
·8k 字节可 擦写Flash 闪速存储器
·1000 次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存储器
·256 ×8 字节内部RAM
·32 个可编程I /O 口线
·3 个16 位定时/计数器
·8 个 断源
·可编程串行UART 通道
·低功耗空闲和掉电模式
功能特性概述
AT89C51提供以下标准功能:8k 字节Flash 闪速存储器,256 字节内部RAM,32 个I /O 口线,3 个16位定时/计数器,一个6 向量两级 断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C52 可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU 的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2、方案论证
本设计采用精密采样电阻(9欧、0.9欧、0.09欧、0.01欧),电阻精度可达0.1%可忽略;八位A/D精度为5/256(V);因而除去放大电路增益误差及线性误差,电流表精度约为(5/256)/11,约为1.7mA;对于1000mA的总量程精度可达0.1%,因而方案可达设计要求。
本设计中用到AT89C52单片机、八位ADC AD0832、发光二极管、六位八段显示数码管LED,通用运放 UA741 、PNP管及必要的电阻、电容元件等。系统原理方框图电路仿真简图如上图。
系统方框图
四、系统程序设计
程序流程图如下
:系统程序流程图
单片机源程序如下:
- #include<reg52.h>//包含相应的头文件
- #include<intrins.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar axs[6],azs[6],ac[10],dc[6];
- void ITOAZ(int num,uchar *p);
- void ITOAX(int num,uchar *p);
- float U,U1;
- sbit CS=P3^4;//定义数模转换器硬件对应引脚
- sbit CLK=P3^5;
- sbit DO=P3^6;
- sbit DI=P3^7;
- /******************读写AD0832函数****************/
- /************************************************/
- unsigned char ReadADC(unsigned char channel)
- {
- unsigned char j;
- unsigned char Temp=0;
- DI=1;
- _nop_();
- _nop_();
- CS=0;//拉低CS端
- _nop_();
- _nop_();
- CLK=1;//拉高CLK端
- _nop_();
- _nop_();
- CLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- CLK=1;//拉高CLK端
- DI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- CLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- CLK=1;//拉高CLK端
- DI=channel&0x1;
- _nop_();
- _nop_();
- CLK=0;//拉低CLK端,形成下降沿3
- DI=1;//控制命令结束
- _nop_();
- _nop_();
- for(j=0;j<8;j++) //处理读入8位数据
- {
- CLK=0;
- _nop_();
- Temp=(Temp<<1)|DO;
- _nop_();
- CLK=1;
- }
- CS=1;
- CLK=0;
- DI=1;
- return(Temp); //返回转换值
- }
- /************************************************/
- /************************************************/
- /******************显示转换函数******************/
- /************************************************/
- //延时函数
- void delay(uint n)
- {
- uint a;
- uchar i;
- for(a=n;a>0;a--)
- for(i=0;i<2;i++);
- }
- //将浮点数转成函数
- void ITOC(float f,uchar *c)
- {
- float zs,xs;
- int bxs,bzs,i,k=0;
- xs=modf(f,&zs); //分离整数部分与小数部分函数
- if(P3==0XFE)
- bxs=(int)((xs*100)+0.5);
- else
- bxs=(int)((xs*100)+0.5); //小数点后两位有效数字
- ITOAX(bxs,axs); //把小数部分转换成字符串存入axs数组
- bzs=(int)zs; //把整数部分转成整型
- ITOAZ(bzs,azs); //把整数部分转换成字符串存入azs数组
- for (i=0;axs[i]!='s';i++) //把最终结果存入c数组
- c[i]=axs[i];
- c[i]='.';
- for(k=0,i=i+1;azs[k]!='s';k++,i++)
- c[i]=azs[k];
- if(U<0) c[i]='-';
- else c[i]=0xff;
- c[i+1]='s';
- }
- //将整型数转换成对应的
- void ITOAZ(int num,uchar *p)
- {
- uchar w,i=0;
- do
- {
- w=num%10; //将整型数各位分离,并转换成对应的字符存入a中
- p[i]=w;
- num=num/10;
- i++;
- }while(num);
- p[i]='s';
- }
- //将小数数部分转换成对应的
- void ITOAX(int num,uchar *p)
- {
- uchar w,i=0;
- do
- {
- w=num%10; //将整型数各位分离,并转换成对应的字符存入a中
- p[i]=w;
- num=num/10;
- i++;
- }while(num);
- while(i<2)
- {p[i]=0;i++;}
- p[i]='s';
- w=p[i];
- }
- //显示译码函数
- void decode(uchar *n,uchar *dn)
- {uchar i;
- for(i=0; n[i]!='s';i++)
- {switch( n[i])
- {case 0: dn[i]=0x3F;break;
- case 1: dn[i]=0x06;break;
- case 2: dn[i]=0x5B;break;
- case 9: dn[i]=0x6F;break;
- case 3: dn[i]=0x4F;break;
- case 4: dn[i]=0x66;break;
- case 5: dn[i]=0x6D;break;
- case 6: dn[i]=0x7D;break;
- case 7: dn[i]=0x07;break;
- case 8: dn[i]=0x7F;break;
- case 46: dn[i]=0x80;break;
- case'-':dn[i]=0x40;break;
- default:dn[i]=0x00;break;
- }
- }
- dn[i]='s';
- }
- /************************************************/
- /************************************************/
- /********************主换函数********************/
- /************************************************/
- void main(void)
- {
- uchar i,j,P2_;
- float A;
- while(1)
- {
- U=ReadADC(0)/256.0;
- switch(P1)
- {case 0xfe:A=U*10*1.025;break;
- case 0xfd:A=U*100/1.09;break;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
系统仿真能正常运行,达设计所有指标,仿真部分电路如下:
PROTUSE系统仿真效果图
2、实际硬件制作结果
根据电路图自制电路,测试结果:能正常测量10——1000mA电流,达大部分设计要求。
参考文献:
[1] 单片机原理与应用技术,清华大学出版社。
[2] 电子技术基础(模拟部分、数字部分). 北京:高等教育出版社,2006.01
[3] 大学生电子设计与应用.北京:中国电力出版社,2007.03