已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 转速测量与控制一、实验目的1 熟悉速度传感器工作原理2 熟悉硬件设计原理3 熟悉软件编程方法二、实验仪器PC机、示波器、综合实验板、数字表,频率计三、实验设计原理1. 硬件设计原理(1)整体设计框图速度传感器放大整形CPUI/O显示键盘D/A信号放大直流电机图1-1 整体设计方框图其中,图的上半部分为测量部分,下半部分为控制部分CPU: AT89C52I/O:人机接口,7290D/A:5618直流电机:=24v(2)硬件主要由三块集成芯片和直流电机、光电转速传感器等组成。信号产生与放大整形 图1-2 信号产生与放大整形示意图注:圆盘上有360个孔,因此每转输出360个脉冲。光电转速传感器:传感器的作用是将各种现场的被测物理量按照一定的规律转换成便于测量的模拟电信号(电压或电流)。转速传感器将电动机转速转化为电压信号,作为整个系统的输入。本实验中采用光电式转速传感器,其工作原理是:利用电动机带动一个圆周上有均匀分布小孔的圆盘来控制发光二极管的光强,使光的强度呈周期性变化。光电二极管的回路电流也呈周期性变化,频率f=N/60360=6N Hz,其中N为转速,单位为 R/min。信号放大整形:传感器的输出电压信号比较小,一般只有几毫伏到几十毫伏,不足以驱动后边与之相连的芯片,并混有许多干扰信号,因此必须将信号放大到与下一极芯片驱动电压相匹配的程度,并去除干扰,变成一个方波信号。本实验中电动机、光电传感器及信号放大整形电路都集成到一块,封装在一个圆柱形容器内。输出的信号经过反向器(近一步提供驱动)和缓冲器后输送给AT89C52单片机T0管脚。 数据采集与处理图1-3 数据采集与处理框图电路板上有一个由555集成定时器构成的单稳态触发器,提供1秒钟的定时,来控制74HC244缓冲器的通与断,这样单片机计数器一次所累积的数即为脉冲频率,经换算后可得到电动机的转速。 图1-4 定时电路原理图单稳态触发器的特点是:电路有两个工作状态:个稳态,一个暂态。在没有外界触发信号时,电路处于稳态,并且能一直保持下去。在外界信号的作用下,电路由稳态转换为暂稳态。暂稳态是一个不能长久保持的状态,经过一段时间后,电路会自动返回到稳态。暂稳态的持续时间,就是电路输出脉冲的宽度,它仅取决于电路本身的参数,而与触发脉冲无关。输出脉冲宽度为,适当选取定时元件R1和C3的数值,使1s。这种单稳态触发器电路要求输入触发负脉冲的宽度小于输出脉冲的宽度。单片机:本实验中,单片机的型号是AT89C52,是整个实验的核心,主要负责数据的数据采集、数据处理和显示,并控制直流电机。AT89C52是一款具有低功耗和高性能的、CMOS制造工艺的8位微处理器,有8K字节的FLASH可编程和可擦除只读存储器(PEROM)。有片内2568位内部RAM,32根可编程I/O线,3个16位定时/计数器,八个中断源,和可编程串行通道等。电路图如下: 图1-5 单片机电路原理图说明:P1口是数据/地址复用口,P2口是地址口;P1口多用途:P10、P11作为串行总线的两根线,一根数据线,一根时钟线,P12,P13,P14作为与CS5460A的接口线,本实验中没有用到,P15,P16,P17作为三八译码器的输入信号线;P30,P31是串行输入/输出通道,P32(INT0)与ZLG7290的中断管脚相连,P33(INT1)与CS5460A的中断管脚相连。P34(T0)作为计数器的输入端,P35(T1)作为输出,作为外部芯片的读信号线;使用内部晶振,外接起振晶体。单片机将采集来的数据经过一定的算法处理后,输出给D/A,来控制电机转速。 状态显示与键盘设置本实验中用ZLG7290作为键盘接口和LED显示驱动。特点:串行总线接口,提供键盘中断信号,方便与处理器接口;可驱动8位共阴数码管或64只独立LED和64个按键;8个功能键,可检测任意键的连击次数。因为ZLG7290采用串行总线,而AT89C52内部没有集成总线接口,因此利用软件模拟总线接口功能。本实验中使用了8个数码管,分为两组,数码管的左四位显示数值为当前所处状态,右四位显示数值为对应状态的数值。以数值表示的状态含义如下:0101当前电机转速0102设置电机转速44键盘布键如下:图1-6 44键盘布键示意图实验板的左下方有一44键盘, 配合数码管使用。测量当前电机转速,则按一下“电机”键,数码管右四位即表示当前电机转速;若要改变转速,则按一下设置键,这时,数码管左四位显示“0102”,即可进行设置转速,设置好后再按“确定”键。再按一次“电机”键,即可看到电机当前转速,再按一次又回到设置转速;设置时如想修改,按“取消”,即可重新输入设置值(设置值5002500R/M,否则无效)。电路图如下:图1-7 44键盘电路示意图 控制电路本实验中,要通过设置转速来控制电机的转速,需要将数字信号转换为模拟信号,电路中使用了D/A转换芯片TLV5618。芯片特点:12位双通道串行接口;可编程设置转换时间,高速模式下为2.5us,低速模式下为12us;89C52将保存的设置预期转速值转换成串行数据输出到5618的SDI端,从SDI端输入的数字信号经TLV5618转换成模拟信号,由OUTB端输出,经放大后作用于直流电机,达到闭环控制目的。电路图:图1-8 控制电路示意图驱动电路:直流电机的驱动电流和电压都比较大,一般要024V的电压,而D/A输出的信号电压和电流比较小,电压范围为05V,不能直接驱动,中间要经过电压、电流放大。图1-9 驱动电路示意图图1-10 信号放大器电路示意图根据理想运放的性质,输出电压与输入电压的关系为:当在05V之间变化时,约在024V之间变化,变换后的电压控制直流电机的转速,直至电机转速达到预期设定值,从而实现闭环控制。但是因为放大电路的非线性性,会带来转速误差。 直流调速电机在本实验中为受控对象,在一定的输入电压下,输出相应的转速。输入电压的范围为024V。2. 软件设计原理图1-11 软件设计流程图实验程序见附录四、实验步骤1. 按实验要求连接电路,检查没有连接错误后,给综合实验板上电,开始实验。在实验的整个过程中要注意安全。2. 用键盘设置电机转速,从500R/min开始,当数码管显示的当前转速在设定转速附近上下小幅波动时或稳定在设定转速时,用示波器测量TLV5618的OUTB端的信号频率,用万用表测量OUTB端的信号电压、直流电机的输入电压(测试点为f对应m2,VOUTB对应R23,对应m+).3. 改变设定的转速,依次输入500R/min2500R/min之间的值,重复步骤2。4. 记录数据,处理数据。五、数据的采集和分析1数据采集表1-1 所测参数设定参数R/m/Hz误差/%/v/vA转速方程60034484.22%1.455.584.94=(R)90054050.09%1.887.73120070422.19%2.3410.01150087712.54%2.7812.03=(R)1800104173.54%3.2214.252000116283.1%3.5515.712数据分析理论上,=,(即理论值),A=(不能用表1-1中数据直接计算,因为有初始值)=,=100%。经过表1-1中数据计算,=4.9(1)在实验数据选择上,设定参数的前五个转速由上而下的以300R/m递增,同时测得数据的值也相应以相似的差值递增,因此,我们设想和转速R成线性关系。设 = aR + c 式其中a和c为未定常量。因为d/Dr = a = /R 式将表1-1中数据代入式和式,可得到表1-2表1-2 参数a和c的值ac0.5620.5480.564因此, = , = 0.558因此, = 0.00148R + 0.558(2)由表1-1可知,和 成 倍的关系。由(1)中同样的分析方法可得: = 0.00739R + 1.04综上,转速方程为: = 0.00148R + 0.558 = 0.00739R + 1.04(3)验证转速方程的正确性选取转速为 1300 R/m,测量得 = 2.49 V, = 10.74 V(理论值)=2.482 V,(理论值)= 10.647 V计算得到1=,2=,=(1+2 )/2S=(10-)10 =表1-3 所测参数的值12S2.490.322%10.740.873%0.5994.14 用Matlab画出转速特性曲线 (1):(2) :六、实验思考题1、在测量转速时,本实验设计是采用的硬件定时,若用软件定时,该如何设计?请用C51设计出基于软件定时的转速测量程序。 #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long#define LED_DAT P0sbit LED_SEG0 = P27;sbit LED_SEG1 = P26;sbit LED_SEG2 = P25;sbit LED_SEG3 = P24;/sbit pin_SpeedSenser = P35; /速度传感器信号接在T1上#define TIME_CYLC 100 /12M晶振,定时器10ms 中断一次 我们1秒计算一次转速 / 1000ms/10ms = 100#define PLUS_PER 50 /码盘的齿数 ,这里假定码盘上有50个齿,即传感器检测到50个脉冲,认为1圈#define K 100.0 /校准系数uchar code loops = 0xFE,0xFD,0x0FB,0x0F7,0x0EF,0x0DF,0x0BF,0x7F;uchar code table=0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0, / 0 1 2 3 4 5 6 7 8 9 0x60,0x25,0x3C,0x23,0x34,0x74,0x00,0x00,0xF7,0x00,0xFF ; / A B C D E F H L - 全亮 全灭uchar data Disbuf4;/ 显示缓冲区 uint Tcounter = 0; /时间计数器bit Flag_Fresh = 0; / 刷新标志 bit Flag_clac = 0; /计算转速标志 bit Flag_Err = 0; /超量程标志 /在数码管上显示一个四位数 void DisplayFresh();/计算转速,并把结果放入数码管缓冲区 void ClacSpeed();/初始化定时器T0void init_timer0();/初始化定时器T1void init_timer1();/延时函数 void Delay(uint ms);void it_timer0() interrupt 1 /* interrupt address is 0x000b */TF0 = 0; /d定时器 T0用于数码管的动态刷新 /TH0 = 0xC0; /* init values */TL0 = 0x00; Flag_Fresh = 1; Tcounter+; if(TcounterTIME_CYLC) Flag_clac = 1;/周期到,该重新计算转速了 void it_timer1() interrupt 3 /* interrupt address is 0x001b */TF1 = 0; /定时器T1用于单位时间内收到的脉冲数 /要速度不是很快,T1永远不会益处Flag_Err = 1; /如果速度很高,我们应考虑另外一种测速方法,:脉冲宽度算转速 void main(void)Disbuf0 = 0; /开机时,初始化为0000Disbuf1 = 0; Disbuf2 = 0;Disbuf3 = 0;init_timer0();init_timer1();while(1)if(Flag_Fresh) Flag_Fresh = 0; DisplayFresh(); / 定时刷新数码管显示 if(Flag_clac) Flag_clac = 0; ClacSpeed(); /计算转速,并把结果放入数码管缓冲区 Tcounter = 0;/周期定时 清零 TH1=TL1 = 0x00;/脉冲计数清零 if(Flag_Err) /超量程处理 /数码管显示字母EEEE Disbuf0 = 0x74; /开机时,初始化为0000 Disbuf1 = 0x74; Disbuf2 = 0x74; Disbuf3 = 0x74; while(1) DisplayFresh();/不再测速 等待复位i /在数码管上显示一个四位数void DisplayFresh()P2 |= 0xF0;LED_SEG0 = 0;LED_DAT = tableDisbuf0;Delay(1);P2 |= 0xF0;LED_SEG1 = 0;LED_DAT = tableDisbuf1;Delay(1);P2 |= 0xF0;LED_SEG2 = 0;LED_DAT = tableDisbuf2;Delay(1);P2 |= 0xF0;LED_SEG3 = 0;LED_DAT = tableDisbuf3;Delay(1);P2 |= 0xF0;/计算转速,并把结果放入数码管缓冲区void ClacSpeed()uint speed ; uint PlusCounter;PlusCounter = TH1*256 + TL1;speed = K*(PlusCounter/PLUS_PER);/K是校准系数,如速度不准,调节K的大小Disbuf0 = (speed/1000)%10; Disbuf1 = (speed/100)%10; Disbuf2 = (speed/10)%10;Disbuf3 = speed%10;/初始化定时器T0void init_timer0()TMOD &= 0xD8; /定时10毫秒 /* Timer 0 mode 1 with software gate */TMOD |= 0xF0; /* GATE0=0; C/T0#=0; M10=0; M00=1; */TH0 = 0xC0; /* init values */TL0 = 0x00; ET0=1; /* enable timer0 interrupt */EA=1; /* enable interrupts */TR0=1; /* timer0 run */延时函数 void Delay(uint ms)uchar i;while(ms-) for(i=0;i100;i+);/初始化定时器T1void init_timer1()TMOD &= 0x0F; /* Counter 1 mode 1 with software gate */TMOD |= 0x50; /* GATE0=0; C/T0#=1; M10=0; M00=1; */TH1 = 0x00; /* init values */TL1 = 0x00; ET1=1; /* enable timer1 interrupt */EA=1; /* enable interrupts */TR1=1; /* timer1 run */2结合该实验的硬件结构,查阅有关资料设计一个步进电机的控制程序。#ifndef _STEPPER_H / 防止Stepper.h被重复引用#define _STEPPER_H#include #define uchar unsigned char#define uint unsigned int#define T 10000 / 10ms定时常量宏定义sbit M1=P20;sbit M2=P21;sbit M4=P22;sbit M5=P23;sbit EN=P24;sbit CWB=P25;sbit RET=P26;sbit CLK=P27;#endifmain.c#include Stepper.h/* 定时器0服务子程序 */void time0() interrupt 1 using 1 / 用定时器0中断来产生CLK时钟 /* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */ TH0 = -T/256; TL0 = -T%256; CLK = CLK;/* 键消抖延时函数 */void delay(void) uchar i; for (i=300;i0;i-);/* 键扫描函数 */uchar keyscan(void) uchar scancode,tmpcode; P1 = 0xf0; / 发全0行扫描码 if (P1&0xf0)!=0xf0) / 若有键按下 delay(); / 延时去抖动 if (P1&0xf0)!=0xf0) / 延时后再判断一次,去除抖动影响 scancode = 0xfe; while(scancode&0x10)!=0) / 逐行扫描 P1 = scancode; / 输出行扫描码 if (P1&0xf0)!=0xf0) / 本行有键按下 tmpcode = (P1&0xf0)|0x0f; /* 返回特征字节码,为1的位即对应于行和列 */ return(scancode)+(tmpcode); else scancode = (scancode1)|0x01; / 行扫描码左移一位 return(0); / 无键按下,返回值为0 /* 主程序 */void main() uchar key; TMOD = 0x01; / 设置定时器0工作模式 EA = 1; ET0 = 1; /* 设置为2相激励 */ M1 = 0; M2 = 0; /* 设置为环形转向轨迹 */ M4 = 1; M5 = 1; EN = 0; / 切断驱动输出 RET = 0; / 归位输入无效 CWB = 1; / 初始设置为顺时针方向 while(1) key = keyscan(); / 调用键盘扫描函数 switch(key) case 0x11: / 0行0列,启动键 EN = 1; / 打开驱动输出 TH0 = -T/256; / 改变T可以改变步进电机转动速度 TL0 = -T%256; TR0 = 1; / 定时器0开始计数 break; case 0x21: / 0行1列,停止键 TR0 = 0; / 定时器0停止计数 EN = 0; / 切断驱动输出 break; case 0x41: / 0行2列,切换转向按键 CWB = CWB; break; case 0x81: / 0行3列,归位键 RET = 1; delay(); RET = 0; break; default:break; 附录A 实验一的硬件电路图及参考程序实验程序#include #include #include #define iscl P1_1#define isda P1_0#define sdi P1_2#define sdo P1_3#define sclk P1_4#define rd1 P3_5unsigned char xdata *p=0x8001;unsigned char xdata *adp=0x8004;unsigned char s=1,num=1,need=1,new=0,lp=1; unsigned char display= /* display array */ 0,0,0,0,1,1,3;unsigned int r1,r2=0,r3=0x0; unsigned char f1=0; unsigned int bri=0; unsigned char m1=0; /*delay*/void delay_ms(unsigned int x) unsigned int i,j; for (i=0;ix;i+) j=108; while (j-); ; /*delay*/*I2C OPERATION 1*/void i2cwait(void) reentrant _nop_(); void i2cinit(void) isda=1; iscl=1; void i2cstart(void) / isda=1; iscl=1; i2cwait(); isda=0; i2cwait(); iscl=0; void i2cstop(void) isda=0; i2cwait(); iscl=1; i2cwait(); isda=1; /i2cwait(); / /iscl=0; unsigned char i2csentbyte(unsigned char b) unsigned char i,ack=1; for (i=0;i8;i+) if (b & 0x80) isda=1; else isda=0; b=1; i2cwait(); iscl=1; i2cwait(); iscl=0; i2cwait(); ; isda=1; i2cwait(); iscl=1; i2cwait(); ack=isda; iscl=0; i2cwait(); return ack ; void sendacknowlege(unsigned char ack) isda=ack; iscl=1; i2cwait(); iscl=0; i2cwait(); unsigned char i2creceivebyte(void) unsigned char i,a=0; for (i=0;i8;i+) iscl=1; i2cwait(); a=1; if (isda=1) a|=0x01; else a=a&0xfe; iscl=0; i2cwait(); ; return a; void writecmd7290(unsigned char i,unsigned char k) EA=0; delay_ms(1); i2cinit(); i2cstart(); i2csentbyte(0x70); i2csentbyte(i); i2csentbyte(k); i2cstop(); EA=1; void writedata7290(unsigned char i,unsigned char k) EA=0; delay_ms(1); i2cinit(); i2cstart(); i2csentbyte(0x70); i2csentbyte(0x07); i2csentbyte(i); i2csentbyte(k); i2cstop(); EA=1; unsigned char read7290(unsigned char i) unsigned char x=0; EA=0; delay_ms(1); i2cinit(); i2cstart(); i2csentbyte(0x70); i2csentbyte(i);i2cstart(); i2csentbyte(0x71); /*71H ?*/ x=i2creceivebyte(); sendacknomlege(0x1); i2cstop(); return x; / EA=1; /*I2C OPERATION 2*/* 5618 operation */void write5618(unsigned int k)unsigned int i,j; EA=0; j=k; P1=P1&0x5f; _nop_(); for (i=0;i16;i+) if (j&0x8000) sdi=1; else sdi=0; j=1; sclk=0; _nop_(); sclk=1; ; _nop_(); _nop_(); P1=0xff; EA=1; /* 5618 operation */*initial COUNTER0*/ void init_time0() TMOD=0x85; TH0=0; TL0=0;TCON=0x10; /*initial COUNTER0*/main() unsigned int temp,t3=0xc100; unsigned char i=0; IE=0x95;IP=0x01; P1=0xff;P3=P3|0x30; init_time0();/*initiate 5618*/ write5618(0x4000); write5618(0xc000); /*initiate 5618*/ /* motor measure start */ P1=P1&0x3f; _nop_(); P1=0xff; /* motor messure start */ /*7290*/ writedata7290(0x65,0); writedata7290(0x67,0); /*7290*/ while(1) /*display*/ if (need=1) writedata7290(0x64,display4); writedata7290(0x66,display5); writecmd7290(0x13,0x0); writecmd7290(0x12,0x0); writecmd7290(0x11,0x0); for (i=0;idisplay6;i+) writedata7290(0x60+i),displayi); need=0; ; /*display*/ /* read speed and temperature and electricity*/ i=*p; /*7865状态地址(只读):0x8001 */ if(!(i&0x08) /*电机一次测速完成时执行*/ r1=TH0;r1=(r10x0fff) /*D/A变换器是12位的*/ r3=0x0fff; ; if (r2r1)&(r30x0ff9) r3=r3+4; if (r20x05) r3=r3-4; write5618(r3+0x4000); /*update display array*/ switch(s) /*测速情况*/ case 1:display5=1; if(num=1) /*num=1 0101当前电机转速*/ if (new&0x01) /*(初始new=0x03;)设定转速后new=0x01*/ new&=0xfe;i=0; /*将new清零*/ display4=1; display0=0; need=1; /*数码显示更新标志,下次循环时,将改变数码管显示的值*/ temp=r1; while (temp!=0) /*将个、十为依次放入数组displayi的前几位*/ displayi=temp-(int)(temp/10)*10; temp=(int)(temp/10);i+; ; if(i=0) i=1; display6=i; /*数组的第六位代表所存数字的位数*/ ; if (num=2) /*0102动态显示设置电机转速的过程*/ if (new&0x08) /*设置速度时new=0x88*/ need=1;new=0x80; /*显示更新标志need置1*/ /*将new置0x80,防止设置间隙时,此段程序继续执行,提高效率*/ display4=2; display0=0x40; /*?*/ temp=bri;i=0; while (temp!=0) displayi=temp-(int)(temp/10)*10+0x40; temp=(int)(temp/10);i+; ; if(i=0) i=1; display6=i; ; if (new&0x01) /*显示设置结果:“确定”显示新设置的值,“取消”显示上次设置的值*/ need=1;new&=0xfe; /*将new清零,显示更新标志need置1*/ display4=2; display0=0x0; temp=r2;i=0; while (temp!=0) displayi=temp-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《企业制度与发》课件
- 艺术创作活动审批程序
- 在线教育行业AI作文批改应用效果调研报告
- X射线机高压电缆绝缘应纳入安全防范措施
- 湘潭岳塘 2026 年工厂普工入厂安全考试试卷 招聘 59 人
- 2026新教材语文 1观潮教学教学课件
- 2026新教材语文 第18课 父爱之舟 教学教学课件
- 某汽车制造厂员工奖惩细则
- 山东菏泽牡丹 2026 乡村振兴岗公务员招录测评试题 招聘 5 人
- 2.3 一元二次方程的根与系数的关系 教学课件 北师大版数学九年级上册
- 2026年护理三基三严与护理创新测试题含答案
- 2026中国医疗信息化行业市场现状分析及投资前景与发展策略报告
- 2026年山东省环保发展集团有限公司及权属企业社会招聘(77人)笔试模拟考试及答案详解
- 2026秋小学鲁科版(五四制)新教材英语四年级上册教学计划含教学进度表
- 2026年新疆高考历史考试真题附答案
- 盾构穿越重要管线(燃气、给水、电力、通信)保护方案
- 2026年重庆市中考物理试卷(含答案及解析 )
- 2023年全国研究生考试英语二真题及详细答案
- GB/T 5596-1996电容器用陶瓷介质材料
- GB/T 3098.11-2002紧固件机械性能自钻自攻螺钉
- GB/T 23163-2008铍铜合金工具类防爆性能试验方法
评论
0/150
提交评论