智能电动扳手控制系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

智能电动扳手控制系统设计
摘要:本设计是基于单片机(STC12C5A32S2)和模拟电路部分相结合的技术,用于对电动扳手的扭矩进行控制,从而达到拧紧螺丝的目的。

通过一次测量电机正常工作时的电压、电流和转速值,将所测得的电压、电流送入自带AD的单片机(STC12C5A32S2),进行AD 转换,利用测频法测出电机的转速,再将这三个值送入单片机内部处理,将所得的扭矩通过五位八段数码管显示出来。

同时,还能控制扭矩的大小,以免将螺丝拧断;拧紧螺丝后,本系统还能让电机回转从螺丝上面取下来;另外,为防止电机的启动电流太大,容易损害电机,本系统还设置了软启动的功能,能够延长电机的使用寿命。

本系统不仅仅是理论的设计,并且运用到了实际的生活当中,还进行了现场的测试。

一..基本原理
本系统实现的功能是控制电动扳手的扭矩的大小,从而拧紧螺丝。

因为扭矩的计算公式M=9550*P/n,其中,M代表扭矩,P代表电动扳手的有功功率,n代表电动扳手正常工作时的转速,再送入单片机内进行数据处理,就能计算出扭矩的真实值。

根据上面的原理,只要测量出P和n,就可以计算出扭矩的大小,从而进行控制。

但是对于电动扳手实际的功率虽然可以通过一些专门功率器件进行测量,但是价格比较高,为了减少成本,根据P=U*I*cost,通过测量电动扳手的工作电压和工作电流来计算有功,相对于专门的功率器件而言,不仅价格低廉,而且实现电路简单,适合实时系统,能够达到题目要求的指标。

故选用测量工作电压和工作电流的方法来求得电动扳手的有功功率。

对于电动扳手的转速不宜直接测量,但是根据计算公式n=60*f,其中,f是电动扳手运转时输出波形的频率,电动扳手运转时输出波形频率测量较测量转速简单,故选用测量运转频率的方法,将所测得值送入单片机进行处理,得出电动扳手的正常转速。

综上所述,本系统采用的方案是通过测量电动扳手的工作电压、工作电流和正常工作时输出波形的频率,将所测得的值送给单片机进行数据处理即可得到扭矩的值。

由于不同的螺丝具有不同的扭矩值,故此系统还设置了扭矩调整功能以实现不同的需求。

具体的实现方案通过单片机来控制四个按键来设置扭矩值得大小。

本系统还采用了功率元件可控硅来控制电机的启动,为了防止可控硅被击穿而影响到电机的工作,还增增加了继电器来保护电机,当可控硅失去控制时,电机还能正常工作。

因为电动扳手在刚启动时,具有很大的工作电流,大概是额定电流的3—5倍,对电动扳手有很大的损害,为了避免这种损害,延长电动扳手的使用寿命,本系统还设计了电动扳手的软启动环节,使启动从零慢慢增加到工作电流,消除启动时的冲击电流。

二.系统设计
根据测量扭矩的原理,本系统共包括五个模块:以STC12C5A32S2单片机为核心的控制模块,电机工作电压测量模块、电机工作电流测量模块、电机工作转速测量模块、电机启动模块。

其系统方框图如下:
三.各模块电路设计
A.电源部分
由于真有效值转换芯片AD637采用的双电源(+5V,-5V)供电方式,故需要制作两个不同的电源,我们采用常用的稳压电源电路,利用芯片7805和7905分别实现+5V和-5V的电源。

另外,测频部分为了防止电磁干扰,这个部分的电源于其他电路隔开,单独使用一个电源。

整流电路LM311,放大电路LM358和光耦MOC3020均采用+5V单电源供电方式,故本系
统需要两个+5V 电源和一个-5V 电源。

现设计电路框图如下:
硬件电路图如下:
U 3
芯片工作电源 U 2测速电路电源
B .电机工作电压测量电路
由于此电机是在220V 交流电的带动下工作的,我们用单片机无法直接测量220V 交流电的大小,我们可以通过将交流转换为低于5V 的直流电压,再送入单片机进行处理。

由于单片机只能测量5V 左右的直流电压,我们需要将220V 的交流电压,先降压再转换成直流送给单片机进行处理,采用真有效值转换芯片AD637,将交流电压转换为直流电压,同时也能将交流电压转换为直流电压,采用双电源供电(+5V 和-5V),容易实现。

因为AD637的输入电压很小导致输出电压也很小,以致输出的波形幅值不大,而且还有噪声波,不能送入单片机内部进行AD 转换,因此,我们设计了滤波和放大电路,使输出波形的幅值达到单片机的要求。

将滤波后的波形送入运算放大器LM358进行负反馈放大,该芯片采用单电源(+5V )供电方式,输出的电压值能够满足单片机的测量要求。

由于LM358不是轨到轨的输出芯片,其输出电压不到5V ,在设计放大倍数是,要注意到这一极限电压,以免造成限幅输出。

由于单片机内部自带12位AD ,满足设计要求,故不需要外加AD 转换芯片。

系统设计框图如下:
1. AD637芯片介绍:
A D637是AD 公司RMS-DC 产品中精度最高、带宽最宽的交直流转换电路,对于1VRMS
的信号,它的3dB 带宽为8MHz,并且可以对输入信号的电平以dB 形式指示,另外,AD637还具有电源自动关断功能,使得静态电流从3mA 降至45µA.,可以测出任意波形交变信号的有效值,实验数据表明,在电源为正负5V 供电情况下,当输入信号的频率不大于2MHz 时,其输入信号的电压有效值在0.7V ~4V 范围内能保证测量误差。

AD637的真值-有效值转换电路设计如下:
2. 电压测量硬件电路图
B UF IN 1
NC 2
C OM 3OUT 4C S 5DENIN 6
VDB 7NC 8
NC
9
C AV 10V011-VS 12+VS 13NC 14VIN 15B UF OUT
16U12AD637
C 291UF
R 47
1M
R w1
K
+5V
-5V
R 5824K
R 57
24K
C 282.2UF
C 300.1UF C 170.1UF C 3110UF
C 1910UF
C 1647UF
+5V -5V
VIN
C 32
2.2UF
200K
C 200.22UF
C 220.22UF
R 53681K +5V C 21
104
56
7
U13B
lm3583
2
1
8
4
U13A
lm358
VOLAGE
10K C 24104
C 26102
C 236.8UF
R 6215K
-5
R 552K
+5
R w21K
P1.5R 6124K
单片机STC12C5A32S2 内12为AD
变压器 AD637 有源滤波 ~220V 无源滤波
LM358放大
C.电机工作电流的测量
由于电机工作时产生的电流很少,不宜直接测量,但是册来那个的方法很多。

方案一:在电机的电流输出端串联一个大电阻,将电流放大,实现简单,但测量不准确,容易将干扰信号一起放大。

方案二:利用电流传感器元件来测量微小的电流变化,实现方法简单,输出噪声干扰小,符合要求。

比较两种方案,我们选择方案二。

我们选用电流传感器来感应电机的电流,因为电流传感器的输出的波形中,含有直流分量,不是我们所需要的,我们将此波形经过隔直电路,输出的交流波形幅值很小,无法测量。

为了便于测量,我们采用串联大电阻的方法,将此电流转为可测量的电压进行测量。

输出的是交流波,无法送入单片机进行检测,故我们运用精密整流对此交流小信号波进行整流,采用的是运算放大器LM358,该芯片采用单电源(+5V)供电方式,然后进行滤波。

同样的,输出的波形幅值很小,不能直接送单片机处理,因此,将滤波后的波形送入运算放大器LM358进行负反馈放大,该芯片采用单电源(+5V)供电方式,输出的电压值能够满足单片机的测量要求。

由于LM358不是轨到轨的输出芯片,其输出电压不到5V,在设计放大倍数是,要注意到这一极限电压,以免造成限幅输出。

由于单片机内部自带10位AD,满足设计要求,故不需要外加AD转换芯片。

现设计电路框图如下:
电流测量硬件电路图如下:
D.频率测量电路:
本系统采用软硬结合的方法来测量电机的转动频率。

1.硬件方面:
电机在工作时,由于转子的转动产生了磁场,从而输出波形。

我们利用霍尔线性测速元件A3515将电机产生的波形输出,A3515此元件输出的波形于电机产生的磁场成比例输出,输出的波中谐波很多,我们采用无源滤波装置进行滤波。

我们运用测频率的方法来测量电机的工作频率,单片机要计算每秒钟的脉冲个数,我们需要将矩形波信号送入单片机才能进行测
量。

对于不同的霍尔线性元件,输出波形不一定都是矩形波,A3515输出的就不是矩形波,所以,我们增加了LM311比较器,使电机输出的波形变成矩形波,送入单片机进行测量。

为了防止干扰,我们在比较电路的输出端和单片机的输入端之间接了一个光电耦合器,起到隔离的作用。

系统框图如下:
硬件电路图如下:
2.软件部分:
本系统采用定时器0和外部中断0同时计数脉冲的方法来测量电机的频率。

系统流程图如下:
E.启动和保护电路的设计
本模块采用的是软硬结合的方法。

1.启动电路
由于220V的交流电不能直接启动电机,我们在电机和交流点之间加了一个功率元件可控硅BA T26,来驱动电机的启动。

由于可控硅是一种电感器件,断电后其电压不能突变,我们在可控硅两端并联了RC泄放电路来保护电路中的其他元件。

为了防止可控硅失效后电机仍然运转,本系统增加了电机保护功能,在可控硅和交流电之间增加了一个继电器,来检测可控硅的工作转态。

此继电器的吸合电压为220V,线圈电压为5V,但可控硅被击穿时,继电器从吸合状态转为释放状态,即从常闭点变到常开点。

系统设计框图如下:
硬件电路图如下:
2.软件实现
这个模块我们采用的是软硬结合的方法来控制电机的软启动。

1.硬件部分
本系统采用单片机控制脉冲的方法来实现软启动,基本原理是:本系统是采用双向可控硅来启动电机的,而可控硅是在高电平的情况下才能够导通,电机才开始工作。

我们采用单片机STC12C5A32S2控制高电平的输出时间来控制可控硅的导通,导通的时间有短变长,从而使电机的输出电流从小到大的变化,不会对电机有损害作用。

因为电网输出的是频率为50HZ 的交流正弦波,不能送入单片机进行处理,所以,我们增加了LM311比较器,使电机输出的波形变成矩形波,送入单片机进行测量。

系统框图如下:
硬件电路图如下:
0P
2.软件部分:
设计思想:因为电网输出的波的频率是50HZ,周期为20MS,我们控制可控硅的导通时间来达到电流从零慢慢变大。

比如,在每一个周期的8MS和18MS处给一个脉冲,导通时间只有2MS,这样电流也就减小了。

所以,检测电网输出波形,当下降沿到来时开始计时,在10MS以内的某个时间开始给可控硅一个脉冲,可控硅导通,电机在剩余的时间内开始工作,起到控制电流的作用。

当电流超过某一值时,说明电机刚启动,此时调用软启动函数。

程序流程图如下:
四、总结
本系统是基于单片机和模拟电路相结合的方式来实现各种功能,采用软件和硬件共同控制系统的运作。

比起同类装置,有以下优点:
1.对电机设置了软启动功能,保护电机,这是其他电机不具备的。

2.对可控硅串联继电器来进行保护,这也是本系统的一大优点。

通过此次毕业设计,是自己独立完成的,从中学到了很多东西,不仅扎实了理论知识,更是增强了自己的动手能力。

还学会了坚持和独立思考的习惯,对以后的学习和工作有深远的影响。

附上部分程序代码
/****************头文件********************************************/
#include <reg51.h>
#include<absacc.h>
#include <stdio.h>
#include <intrins.h>
/*****************宏定义*********************************************/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/******************SPEED1 SPEED0 A/D转换寄存器设置******************/
#define AD_SPEED 0x60 //0110,0000 1 1 270个时钟周期转换一次,
sfr ADC_CONTR=0xbc;
sfr ADC_RES=0xbd;
sfr ADC_RESL=0xbe;
/*******************数码管端口定义*****************************/
sbit sdata=P2^2;
sbit SCLK=P2^1;
sbit RCK=P2^0;
char code tab1[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1F,0x01,0x09}; //0-9数码管对应的断段
/****************PWM输出端口*********************************/
sbit PWM=P2^7;
/***********************定义全局变量************************/
ulong Freq=0,Freq1=0,Freq_adv; //电机转动频率
ulong shuju[1];
uint count;
uint vol[10],cur[10]; //定义数组存放电流、电压值
uchar num;
/******************数码管显示程序*************************/
/******************延时程序******************************/
/*
void delay1(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<100;j++);
}
}*/
void aclk()
{
SCLK=0;
SCLK=1;
}
void display(uint display)
{
uchar a=0,b=0,c=0,d=0;
uchar i=0;
a=display/1000;
b=display%1000/100;
c=display%100/10;
d=display%10;
a=tab1[a];
b=tab1[b];
c=tab1[c];
d=tab1[d];
for(i=0;i<8;i++)
{
sdata=d & 0x80 ;
aclk();
d=d<<1;
}
for(i=0;i<8;i++)
{
sdata=c & 0x80 ;
aclk();
c=c<<1;
}
for(i=0;i<8;i++)
{
sdata=b & 0x80 ;
aclk();
b=b<<1;
}
for(i=0;i<8;i++)
{
sdata=a & 0x80 ;
aclk();
a=a<<1;
}
RCK=0;
RCK=1;
}
/*****************延时程序*********************************************************/ void delay(uchar delay_time)
{
uchar n;
uint m;
for(n=0;n<delay_time;n++)
{
for(m=0;m<100;m++);
}
}
/*********************AD转换模块************************************************/
uint get_AD_result(uchar channel)
{
ADC_RES = 0;
ADC_RESL=0;
channel &= 0x07;
ADC_CONTR = AD_SPEED;
ADC_CONTR = 0xE0; //1110,0000 清ADC_FLAG, ADC_START 位和低3 位ADC_CONTR |= channel; //选择A/D 当前通道
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令ADCS = 1, 启动A/D转换,
while (1) //等待A/D转换结束
{
if (ADC_CONTR & 0x10) //0001,0000 测试A/D转换结束否
{
break;
}
}
ADC_CONTR &= 0xE7; //1111,0111 清ADC_FLAG 位, 关闭A/D转换,
return (ADC_RES<<2 | ADC_RESL); //ADC_RES<<2 | ADC_RESL
}
/*********************初始化定时器0,计数器1******************************************/ void Timer_init()
{
TMOD=0x16; //计数器0工作工作方式2,自动重装初值
TH0=0; //计数器初值为0
TL0=0;
TR0=1; //计数器开始计数
TR1=1;
EA=1; //开总中断
ET0=1; //打开计数器0中断
ET1=1;
EX0=1;
IT0=1;
TH1=0x3C;
TL1=0xB0; //50MS中断一次
}
/*****************************主函数*************************************/ void main()
{
uint niuju=0;
uint vol_sum=0,cur_sum=0,current=0,voltage=0,speed=0,DA TA=0,middle=0;
uchar ADC_10bit=0,medium=0;
int i=0,j=0;
DATA=1210;
ADC_CONTR = 0x80; // 电源
Timer_init();
while(1)
{
// if(niuju<6500) //设定扭矩的值
// {
PWM=1;
// }
// else
// {
// PWM=0;
// }
vol_sum=0;
cur_sum=0;
for(j=0;j<10;j++)
{
vol[j]=get_AD_result(5);
cur[j]=get_AD_result(7);
}
for(j=0;j<10;j++)
{
vol_sum=vol_sum+vol[j];
cur_sum=cur_sum+cur[j];
}
if(num==19) //定时1s时间到
{
num=0; //计时清0
TR1=0; //关定时器1
TR0=0; //关中断
EX0=0;
Freq=(ulong)count*256+TL0;
shuju[0]=Freq1;
Freq_adv=(ulong)((Freq+shuju[0])/2);
speed=Freq_adv&0x0000ffff;
// voltage=vol_sum/10; //测电压
current=cur_sum/10; //测电流
if(speed>0)
{
medium=(uchar)(955/speed);
voltage=(uint)(((vol_sum>>5)*(DATA>>5))/100);
middle=(uint)((medium*voltage)/3);
niuju=(middle>>5)*((current*5)>>5);
}
else
{
niuju=0;
}
TH0=0;
TL0=0; //清零计数器0计数
count=0; //清零计数器0计数
Freq1=0;
TR1=1;
TR0=1; //开中断
EX0=1;
}
display(niuju);
// display(current);
// display(voltage);
// display(speed);
// display(medium);
// display(middle);
}
}
/**************************定时器0中段程序*****************************************/
void inter0() interrupt 0
{
Freq1++;
}
void timer0() interrupt 1 //计数器0中断
{
count++;
}
//===================================================//
void timer1() interrupt 3
{
TH1=0x3C; //在程序初始化的时候给RCAP2L和RCAP2H赋值,
TL1=0xB0; //50MS中断一次
num++;
}
软启动程序代码如下:
/********************软启动控制代码****************************************************/
//电机软启动,转速判断
ADC_bit=get_AD_result(7);
current=((uint)(((ADC_bit*10)>>5)*50))>>5;
if(current>150)
{
while(1)
{
PWM=0;
EX0=1;
if(count<=300)
{
if(num==6)
{
TR0=0;
num=0;
TR1=1;
PWM=1; //可控硅导通
delay_us(200);
PWM=0;
TH0=0xfc; //定时1MS
TL0=0x18;
}
if(flag==1)
{
TR1=0;
flag=0;
PWM=1;
delay_us(200);
PWM=0;
TH1=0xd8; //定时10US
TL1=0xf0;
}
}
else
{
EX0=0;
PWM=1;
num=0;
TH0=0xfc; //定时1MS
TL0=0x18;
TR0=1;
}
/**********************外部中断0中断程序************************************/ void inter0() interrupt 0
{
TR0=1; //外部中断0
count++;
}
/**********************定时器0中断程序************************************/ void timer0() interrupt 1
{
num++;
TH0=0xfc; //定时1MS
TL0=0x18;
}
/**********************定时器1中断程序************************************/ void timer1() interrupt 3
{
flag=1;
TH1=0xd8; //定时10US
TL1=0xf0;
}。

相关文档
最新文档