实验一转速测量与控制(一)

时间:2020-09-01 09:20:40 其他毕业论文 我要投稿

实验一转速测量与控制(一)

由速度传感器可以将测得的电机转速转换成相应的电压信号,该信号经整形
放大后送到CPU。CPU将采集来的数据经过一定的算法处理后,送给D/A转换芯片,该芯片将数字信号转换为模拟信号输出,模拟信号经信号放大后,由弱电变为强电,从而实现电机转速的控制。另外CPU与外界的交互通过I/O接口来实现。

 硬件电路设计原理
 1)信号产生与放大整形
 
①速度传感器
 转速传感器将电动机转速转化为电压信号,作为输入。
本实验中采用光电式转速传感器,其工作原理是:利用电动机带动一个圆周上有均匀分布小孔的圆盘来控制发光二极管的光强,使光的强度呈周期性变化。光电二极管的回路电流也呈周期性变化,频率f=N/60×360=6N Hz,其中N为转速,单位为 R/min。
 ②信号整形放大
 信号整形放大部分用于将传感器输出的幅值较小的电压信号进行放大整形,使其信号电压与芯片驱动电压相匹配,并除去部分干扰,使输出波形为方波的形势。
 本实验中电动机、光电传感器、信号放大整形电路都集成在一起,封装于一个圆柱形容器内。输出的信号经过经过反向器和缓冲器后输送给82C50单片机T0管脚。
 2)数据采集与处理
 电路板上有一个由555集成定时器构成的单稳态触发器,提供1秒钟的定时,来控制74HC244缓冲器的通与断,这样单片机计数器一次所累积的数即为脉冲频率,经换算后可得到电动机的转速。
 ①单稳态触发器
 
555定时器是一种多用途的时基电路,只要在外部配上几个适当的电阻、电容,就可以构成单稳态触发器。
 输出电压高电平的时间取决于RC的充电时间。
单稳态触发器的输出信号,控制缓冲器74244的通断,测得的电压信号通过缓冲器接到8052的T0端口。在这里缓冲器起到了增加驱动、消除干扰的作用。
 ②单片机
 
本实验所用CPU为8052,如上图,当为高电平时,CPU执行片内程序存储器命令。当为低电平时,CPU实行片外程序存储器命令。
在本实验中单片机主要负责数据的数据采集、数据处理、与键盘显示的交互控制、以及直流电机的控制。
 3)键盘与显示部分
 ①I2C串行总线接口7290
ZLG7290芯片功能强大,I2C 串行接口提供键盘中断信号方便与处器接口并可驱动8 位共阴数码管或64 只独立LED 和64 个按键。因为ZLG7290采用I2C串行总线,而AT89C52内部没有集成I2C总线接口,因此利用软件模拟I2C总线接口功能。本实验中采取的是24个管脚的封装形式。
 如前所述, 7290的SDA、 SCL管脚与8052P10、P11口相连,中断管脚与8052的INT0相连,Dig0—Dig8连接LED 显示位驱动及键盘扫描线;Seg0—Seg8连接LED 显示段驱动及键盘扫描线 OSC1、OSC2管脚接外部晶振,RES脚接上电复位电路。
 ②键盘及数码管
数码管的左四位显示数值为当前所处状态,右四位显示数值为对应状态的数值。以数值表示的状态含义如下:
0101――当前电机转速
0102――设置电机转速
 4ⅹ4键盘布键如下:
 
 测量当前电机转速,则按一下“电机”键,数码管右四位即表示当前电机转速;若要改变转速,则按一下设置键,这时,数码管左四位显示“0102”,即可进行设置转速,设置好后再按“确定”键。再按一次“电机”键,即可看到电机当前转速,再按一次又回到设置转速;设置时如想修改,按“取消”,即可重新输入设置值(设置值500-2500R/M,否则无效)。
  4)、控制电路
①D/A转换芯片TLV5618
 12位双通道串行接口;可编程设置转换时间,高速模式下为2.5us,低速模式下为12us;89C52将保存的设置预期转速值转换成串行数据输出到5618的SDI端,从SDI端输入的数字信号经TLV5618转换成模拟信号,由OUTB端输出,经放大后作用于直流电机,达到闭环控制目的。
 
    ②信号放大器
 直流电机的驱动电流和电压都比较大,而D/A输出的信号电压和电流比较小,电压范围为0-5V,不能直接驱动,中间要经过电压、电流放大。原理图如下:

 针对ZLG7290的I2C总线读写程序如下:
/*头文件说明*/
#include <AT89x52.h>
#include <Intrins.h>
#include <math.h>
/*定义8052的端口*/
#define iscl P1_1
#define isda P1_0
#define sdi  P1_2
#define sdo  P1_3
#define sclk P1_4
#define rd1  P3_5
/*指针定义*/
unsigned char xdata *p=0x8001;
unsigned char xdata *adp=0x8004;
unsigned char s=1,num=1,need=1,new=0,lp=1;    /*the number of project */
unsigned char display[]= /* display array */
              {0,0,0,0,1,1,3};
unsigned int r1,r2=0,r3=0x0;   /*rotate speed r1测量所得温度,r2设置所得温度*/
unsigned char f1=0;  /* times and congiguration flag ,设置完温度完成标志 f1=1*/
unsigned int  bri=0;  /* the value of configuration  设置值*/
unsigned char m1=0;   /* 设置值的最大位数 */
/*延时*/
void delay_ms(unsigned int x)
{
  unsigned int i,j;
  for (i=0;i<x;i++)
    {j=108;
     while (j--);
     };
 }
/*延时*/
/*I2C总线的操作*/
void i2cwait(void)  reentrant 
  {
        _nop_();
   }
void i2cinit(vo