数字式电参数测试仪的设计报告.docx
- 文档编号:5621826
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:19
- 大小:340.08KB
数字式电参数测试仪的设计报告.docx
《数字式电参数测试仪的设计报告.docx》由会员分享,可在线阅读,更多相关《数字式电参数测试仪的设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
数字式电参数测试仪的设计报告
数字式电参数测试仪的设计报告
摘要
根据设计任务与要求,该设计的控制部分以STM32f103RBT6单片机为主控芯片,利用其单片机内部自带的12AD模/数转化器读取外部输入的电压值,经最小二乘法处理后,可以使所测的电压值满足设计的要求。
因为经处理后可以得到比较精确的电压值,因此可以将电阻的测量以及电流的测量转换为对电压的测量,然后通过数学公式求出电阻值和电压值。
对于电阻的转换,可以采用串联分压的原理进行转换,同时为了精确度,可以根据所测电阻范围的变化用继电器选择不同的分压阻值,从而提高精确度。
对于电流的测量,可以通过测精度已知电阻两端的电压值的方法,根据欧姆定律求得电流值。
对于频率的测量,由于题目所给的方波的峰值为1V,因此需要通过一个比较器358放大输入方波的峰值,便于单片机的检测,由于单片机内部时钟可以倍频到72MHz,所以经过比较器后的输入信号可以被单片机所采集并测出频率。
对于功率的测量,由于已经测出电阻两端的电压值,所以根据功率计算公式P=U*U/R得到功率值。
关键词:
STM32f103RBT6,12位AD转换器,模拟开关,
一.系统方案
1.1控制芯片的选择与比较
方案一:
STM32单片机
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。
STM32f103RBT6有DMA,2个12为ADC(16通道),4个16位定时器,51个可用IO口。
STM32芯片用3.3V供电。
STM32f103RBT6的这些配置安全可以满足该系统的需求。
这些配置无论到哪里都是很不错的,更重要的是其价格较低,为18元左右的零售价。
也是市场上32位单片机的主流。
方案二:
STC12C5A60S2单片机
STC单片机是51单片机的一种,内部自带8通道的10位ADC,3个16位定时器/计数器,32个可用IO口。
以5V电压供电。
拥有灵巧的8位CPU,并且价格低廉。
由于该系统用于测量电参数,对于各个量的测量精度都有很高的要求,并且题目中要求刷新周期为2S,因此需要AD转换周期短,而STM32单片机在这方面比STC单片机更合适。
而这些参数的关键就是所测电压值的精确性,因此我们选择拥有多通道的12位ADC的STM32单片机
1.2测电阻方案的选择与比较:
方案一:
串联分压原理
V
RxR0
图1串联电路原理图
根据串联电路的分压原理可知,串联电路上电压与电阻成正比关系。
通过测量Rx和R0上的电压。
由公式Rx=V*R0/Ux-R0
方案二:
利用直流电桥平衡原理的方案
图2电桥(其中R1,R2,为可变电位器,R3为已知电阻,R4为被测电阻)
根据电路平衡原理,不断调节电位器,使得电表指针指向正中间。
由R1*R4=R3*R4.在通过测量电位器电阻值,可得到R4的值。
方案三:
利用555构成单稳态的方案
图3555定时器构成单稳态
根据555定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电阻阻值。
由f=1/[(R1+2R2)*C*In2]
得到公式:
R2=1/2*[1/(f*c*Ln2)-R1]
上述三种方案从对测量精度要求而言,方案二需要测量的电阻值多,而且测量调节麻烦,不易操作与数字化,相比较而言,方案三还是比较符合要求的,由于是通过单片机读取转化,精确度会明显的提高。
而方案一的原理简单,操作简单,成本低廉,而且由于12位的ADC可以在很大程度上弥补方案一精度低的缺陷。
故本设计选择了方案一,并且通过模拟开关的转换来改变已知电阻值的大小,以满足整个范围内测电阻的精度要求。
1.3测量电流值的方案的选择与比较
方案一:
霍尔传感器测电流法
霍尔传感器由于通电螺线管内部存在磁场,其大小与导线中的电流成正比,故可以利用霍尔传感器测量出磁场,从而确定导线中电流的大小。
利用这一原理可以设计制成霍尔电流传感器。
方案二:
转换电压测电流法
通过一个高精度、小阻值的电阻直接串联进电路对电流进行采样,将电流转换为电压进行测量。
再由欧姆定理进行转换。
上述两个方案相比较,方案一其优点是不与被测电路发生电接触,不影响被测电路,不消耗被测电源的功率。
但是霍尔传感器比较适合大电流的测量,而对于题目中所给的小电流的测量在精度上将有所下降,且不易测量。
方案二电路简单,容易实现,且成本相对于方案一大大减小。
虽然方案二精度比方案一差,但是主控芯片内置的12位A/D很大程度上解决了这个问题,故本设计选用了方案二。
1.4测量电压值的方案
本设计采用了分压法测电压。
分压法具有电路简单,操作方便的特点。
1.5信号放大方案的选择与比较
方案一:
运用模拟电路知识,运用三极管或莫斯管搭建放大电路。
方案二:
采用集成放大芯片对信号进行放大。
方案一相对于方案二更节约成本,但是电路太过复杂,且稳定性不好。
所以本设计采用方案二对信号进行放大。
选用的是ad620集成运放芯片。
这款芯片的特点是低功耗,工作电压低,只需要±5V就可以正常工作。
二.理论分析与设计
2.1频率测量的精确度分析
STM32f103RBT6内部可以将8MHz的外部时钟倍频到72MHz,这个高频时钟信号可以提高频率测量的精确度。
本设计通过三极管将50MV交流电信号放大到4V左右,然后再通过三极管将其变为3.3V的方波,让STM32可以捕捉到。
2.2电压值的测量分析
由于单片机的AD的基准源为3.3V,因此要对电压的测量进行分段处理,当电压小于3V时,由单片机直接测量。
当电压在3V到10V时,先通过外部分压电路,采得十分之一的待测电压,然后由单片机测量,所得值再有程序内部处理得到待测电压。
2.3电流的测量分析
采样电阻选值为86Ω,待测电流范围为100µA~10mA,即所采得电压理想值范围为8.6mv~860mv,实际电压值略有偏差。
由于所用内置A/D为12位A/D,基本可以满足8.6mv~860mvd的电压范围,所以把所采得的电压直接交由单片机测量处理。
2.4电阻的测量分析
电阻的测量整体上采用串联分压原理进行测量,但是如果只是采用一个固定的已知电阻值来测量电阻值,当所测电阻值与已知电阻值之间的差值太大时就会严重影响测量精度,因此需要对题目要求的电阻值测量范围进行分段测量,通过大量的实验后决定采用四个不同的已知电阻值作为分压电阻,其阻值分别为100,1K,10K,100K。
各个分压电阻之间用三个继电器进行控制,根据测量的不同进行自动换挡。
经测试发现,所测电阻值满足发挥部分的要求
2.5功率的测量分析
以电流测量模式和电压测量模式同时工作,将所测得的电压和电流值,利用P=U*I,间接的到所测器件在实际工作电路中的功率。
三.电路与程序设计
1.各模块电路
1.1电源模块
本设计需要3.3V、±5V三种电压。
其中3.3V主要给主控模块供电,5V主要作为继电器、LED的驱动电源,-5V主要与+5V为集成运算放大器提供工作电压。
整个设计以两节3.7V大功率干电池供电。
由于两节电池输出为7.4V电压,所以设计中先用7805稳压器得到5V电压,再由lm1117-3.3稳压器的到3.3V电压。
而-5V我们选用了超电压转换器7660s来得到。
该芯片具有价格低,功耗低,电路简单的特点。
-5V电压
1.2电流检测电路
1.3电压检测电路
1.4电阻检测模块
1.5频率检测模块
1.6显示模块
1.7主控模块
2.主要程序
#include
#include"delay.h"
#include"sys.h"
#include"N5110.h"
#include"ADC1.h"
#include"Frequency.h"
u16g_Wave_Count=0;
doubler=0;
voidJiDian_RCC_Configuration(void);
voidJiDian_GPIO_Configuration(void);
voidMeasure_R(void);
voidMeasure_V(void);
#definePC13PCout(13)
#definePC1PCout
(1)
#definePC3PCout(3)
#definePC0_VPCout(0)//电压换挡
#defineLED0PCout(9)
#defineLED1PCout(7)
#defineLED2PBout(15)
#defineLED3PBout(13)
intVa=0,Va1=0;
intmain()
{
doublea=0.0;
Stm32_Clock_Init(9);
delay_init(72);
N5110_RCC_Configuration();
N5110_Init();
//测频初始化
RCC_Configuration();//时钟初始化
GPIO_Configuration();//端口初始化
NVIC_Configuration();//中断配置初始化
TIM1ERT_Configuration();//TIM1初始化
TIM2_Configuration();//TIM2初始化
//ADC初始化:
ADC1_RCC_Configuration();
ADC1_GPIO_Configuration();
ADC1_Configuration();
DMA_RCC_Configuration();
DMA_ADC1_Configuration();
//继电器初始化
JiDian_RCC_Configuration();
JiDian_GPIO_Configuration();
PC13=0;//初始化以100为基准
PC1=0;
PC3=0;
PC0_V=0;
while
(1)
{
N5110_Write_Litter_Str("Fre:
",0,0,1);
N5110_Print_Int(g_Wave_Count*2,"Hz",0,0,0);
//测电流
a=Get_Volatge(3)/(86.0*4.5*(1+0.0507315));
N5110_Write_Litter_Str("A:
",1,0,1);//显示Volatge:
N5110_Print_Double(a,"mA",0,0,0);
//测电压
Measure_V();
//测电阻
Measure_R();
//测功率
N5110_Write_Litter_Str("P:
",4,0,1);//显示Volatge:
N5110_Print_Double(a*Va1/1000.0,"mW",0,0,0);//显示采集电压
}
}
//**********************************************************************
//函数名称:
voidTIM1_CC_IRQHandler(void)
//功能:
定时器1比较匹配中断
//参数:
无
//返回值:
无
//***********************************************************************
voidTIM1_CC_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!
=RESET)//判断是否为定时器1比较匹配中断
{
TIM_ClearITPendingBit(TIM1,TIM_FLAG_CC1);//清除TIM1的待处理位
TIM_ClearFlag(TIM1,TIM_FLAG_CC1);//清除TIM1的待处理标志位
}
}
//**********************************************************************
//函数名称:
voidTIM2_IRQHandler(void)
//功能:
定时器2溢出中断,每1ms溢出一次
//参数:
无
//返回值:
无
//***********************************************************************
voidTIM2_IRQHandler(void)
{
staticu16Count=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!
=RESET)//判断是否为定时器2溢出中断
{
Count++;
if(Count>=500)
{
Count=0;//测试灯1s翻转一次
g_Wave_Count=TIM_GetCounter(TIM1);
TIM_SetCounter(TIM1,0);
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除TIM2的待处理位
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清中断标记
}
}
voidJiDian_RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOA,ADC1时钟
}
voidJiDian_GPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_3|GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_9|GPIO_Pin_7;//选中0,2,3,4管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//管脚工作状态为模拟输入
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_13;//选中0,2,3,4管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//管脚工作状态为模拟输入
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
voidMeasure_R(void)//测电阻换挡
{
if((PC13==0)&&(PC1==0)&&(PC3==0))//以100为已知电阻
{
r=3.3*101.15*1000/Get_Volatge
(1)-101.15;
N5110_Write_Litter_Str("R:
",3,0,1);//显示Volatge:
N5110_Print_Double(r,"",0,0,0);//显示采集电压
if((r>=800)&&(r<8000))//转到1k
{
PC13=0;delay_ms(100);PC1=1;delay_ms(100);delay_us(100);PC3=0;delay_ms(100);
}
if((r>=8000)&&(r<80000))//转到10k
{
PC13=1;delay_ms(100);PC3=0;delay_ms(100);PC1=0;delay_ms(100);
}
if(r>=80000)//转到100k
{
PC13=1;delay_ms(100);PC3=1;delay_ms(100);PC1=0;delay_ms(100);
}
LED0=1;LED1=0;
LED2=0;LED3=0;
}
if((PC13==0)&&(PC1==1)&&(PC3==0))//以1k
{
r=3.3*998.3*1000/Get_Volatge
(1)-998.3;
N5110_Write_Litter_Str("R:
",3,0,1);//显示Volatge:
N5110_Print_Double(r,"",0,0,0);//显示采集电压
if(r<800)//转到100
{
PC13=0;delay_ms(100);PC1=0;delay_ms(100);PC3=0;delay_ms(100);
}
if((r>=8000)&&(r<80000))//转到10k
{
PC13=1;delay_ms(100);PC3=0;delay_ms(100);PC1=0;delay_ms(100);
}
if(r>=80000)//转到100k
{
PC13=1;delay_ms(100);PC3=1;delay_ms(100);PC1=0;delay_ms(100);
}
LED0=0;LED1=1;
LED2=0;LED3=0;
}
if((PC13==1)&&(PC3==0)&&(PC1==0))//以10k
{
r=3.3*9.893*1000*1000/Get_Volatge
(1)-9.893*1000;
N5110_Write_Litter_Str("R:
",3,0,1);//显示Volatge:
N5110_Print_Double(r,"",0,0,0);
if(r<800)//转到100
{
PC13=0;delay_ms(100);PC3=0;delay_ms(100);PC1=0;delay_ms(100);
}
if((r>=800)&&(r<8000))//转到1k
{
PC13=0;delay_ms(100);PC1=1;delay_ms(100);PC3=0;delay_ms(100);
}
if(r>=80000)//转到100k
{
PC13=1;delay_ms(100);PC3=1;delay_ms(100);PC1=0;delay_ms(100);
}
LED0=0;LED1=0;
LED2=1;LED3=0;
}
if((PC13==1)&&(PC3==1)&&(PC1==0))//以100k
{
r=3.3*101.20*1000*1000/Get_Volatge
(1)-101.20*1000;
N5110_Write_Litter_Str("R:
",3,0,1);//显示Volatge:
N5110_Print_Double(r,"",0,0,0);
if(r<800)//转到100
{
PC13=0;delay_ms(100);PC3=0;delay_ms(100);PC1=0;delay_ms(100);
}
if((r>=800)&&(r<8000))//转到1k
{
PC13=0;delay_ms(100);PC1=1;delay_ms(100);PC3=0;delay_ms(100);
}
if((r>=8000)&&(r<80000))//转到10k
{
PC13=1;delay_ms(100);PC3=0;delay_ms(100);PC1=0;delay_ms(100);
}
LED0=0;LED1=0;
LED2=0;LED3=1;
}
}
voidMeasure_V(void)//电压换挡
{
Va=Get_Volatge(0);
if((Va<300))
{
PC0_V=1;
delay_ms(20);
N5110_Write_Litter_Str("V:
",2,0,1);//显示Volatge:
Va1=Get_Volatge(0);
N5110_Print_Int(Va1,"mV",0,0,0);//显示采集电压
delay_ms(20);
}
else
{
if(PC0_V==1)
{
delay_ms(20);
N5110_Write_Litter_Str("V:
",2,0,1);//显示Volatge:
Va1=Get_Volatge(0);
N5110_Print_Int(Va1,"mV",0,0,0);//显示采集电压
delay_ms(20);
if(Va1>=3000)
PC0_V=0;
else
PC0_V=1;
}
else
{
PC0_V=0;
delay_ms(20);
N5110_Write_Litter_Str("V:
",2,0,1);//显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字式 参数 测试仪 设计 报告