1、B甲03846小组全国电赛 自由摆论文编号:B甲03846基于自由摆的平板控制系统(B题)参赛队员: 王东祥 周万军 段敬博专 业: 光信息科学与技术 学 校: 哈尔滨工业大学(威海)指导老师: 基于自由摆的平板 控制系统关键词:自由摆 平板控制 加速度传感器 IIC总线 AT89S52步进电机 L298驱动芯片MMA7445 目录1 方案论证与比较 31.0电源模块 31.1电机模块 31.2检测模块 31.3通讯模块 41.4系统结构 42理论分析和计算 62.1平板测量方法 62.2 从机检测电路设计 112.3 程序设计 123.电路和程序设计 143.1电路图 143.2程序 144
2、测试方案和结果 225结论和总结 23参考资料 231 方案论证与比较1.0电源模块方案一:使用蓄电池,方案二:使用220v转5V电源适配器. 我们选择的是22V转5V电源适配器.1.1电机模块方案一:使用步进电机 方案二:使用 舵机.比较以上两种方案,考虑到舵机不能转360度,所以我们选择步进电机,同时我们采用L298进行电机驱动,驱动加些外围电路.1.2检测模块方案一:采用角速度传感器,能够很好的给出角度的数字信号. 方案二:采用加速度传感器MMA7445,5V 直流电压供电,内部能给出各个方向的加速度,加速度的形式是数模数据,但给出的是补码形式. 比较上述两种方案,显然角速度传感器的输出
3、能很直接的给出角速度,能使得程序更加简单。由于我们买到角速度传感器,而有加速度传感器,再加上我们对加速度传感器之前就有了解,在达到利用好自己身边的元器件的同时,也能达到同样的效果。1.3通讯模块 方案一:单片机采取SPI接口方式读取数值,检测其运动和方向. 方案二:单片机采取IIC接口方式读取数值,IIC 是一种二线制串行总线接口,工作在主/从模式。二线通信信号分别为开漏 SCL 和 SDA 串行时钟和串行数据。主器件为时钟源。数据传输是双向的,其方向取决于读/写位的状态。每个从器件拥有一个唯一的 7 或 10 位地址。主器件通过一个起始位发起一次传输,通过一个停止位终止一次传输。起始位之后为
4、唯一的从器件地址,再后为读/写位。I2C允许多个主器件工作在同一总线上。多个主器件可以轻松同步其时钟,因此所有主器件均采用同一时钟进行传输。多个主器件可以通过数据仲裁检测哪一个主器件正在使用总线,从而避免数据破坏。由于 I2C总线只有两条导线,因此新从器件只需接入总线即可,而无需附加逻辑。比较上述两种方案,我们选择是IIC总线接口的方式读取数据.1.4系统结构 在单摆架子的上面,利用AT89S52单片机作为控制器,将加速度传感器的所获得数据通过IIC总线的传输方式,并将此数据传输到L298驱动器上,L 298将信息转化为角度,进而对电机的运动的运动方式进行控制.最终方案为:1. 电源模块: 采
5、用220V转5V电源适配器。2. 驱动模块: 采用28byj-48减速型步进电机和L298模块驱动电机.3. 检测模块: 采用MMA7455加速度传感器模块4. 通讯模块: 采用的是IIC总线的读取方式。2理论分析和计算2.1平板测量方法第一个要求:我们对摆杆拉到60o时的周期进行测量,再由摆杆的周期再进行理论计算电机需要怎么转.将加速度传感器安装在摆杆上,加速度传感器给出的X,Y,Z的加速度的数据的补码形式,通过程序的换算,我们将且用AX,AY,AZ作为通过程序处理后各个方向的加速度,再进行计算.首先我们将摆杆拉到600,手动将平板调整到和摆杆垂直,此时通过叫传感器给出的加速度,算出角度si
6、n=/(其中g为重力加速度.) g=9.78049(1 + 0.0052884 (Sin)2 - 0.0000059 *(Sin2) 2) - 0.00000286h为纬度.电机的偏转角=1-2得出的角度就是电机所需要转的角度.同时通过AY,由于AY在最下方的时候达到一个极值,所以只需要测试AY的增减情况来判断电机是否需要反转.这样就达到了测量平板的位置以及它所需要转的角度.最终实现平板和水平面平行.3.电路和程序设计3.1电路图3.2程序步进电机绕圈程序/* 名称:步进电机 编写:shifang 日期:2009.5 修改: 2011/9/1 内容:4相步进电机常规驱动 单方向运转 */#in
7、clude sbit A1=P10; /定义步进电机连接端口sbit B1=P11;sbit C1=P12;sbit D1=P13;#define Coil_A1 A1=1;B1=0;C1=0;D1=0;/A相通电,其他相断电#define Coil_B1 A1=0;B1=1;C1=0;D1=0;/B相通电,其他相断电#define Coil_C1 A1=0;B1=0;C1=1;D1=0;/C相通电,其他相断电#define Coil_D1 A1=0;B1=0;C1=0;D1=1;/D相通电,其他相断电#define Coil_AB1 A1=1;B1=1;C1=0;D1=0;/AB相通电,其他
8、相断电#define Coil_BC1 A1=0;B1=1;C1=1;D1=0;/BC相通电,其他相断电#define Coil_CD1 A1=0;B1=0;C1=1;D1=1;/CD相通电,其他相断电#define Coil_DA1 A1=1;B1=0;C1=0;D1=1;/D相通电,其他相断电#define Coil_OFF A1=0;B1=0;C1=0;D1=0;/全部断电unsigned int Speed;/*- uS延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号字符变量,其值的范围是 065535 这里使用晶振12M,精确延时
9、请使用汇编,大致延时 长度如下 T=tx2+5 uS -*/void DelayUs2x( int t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs( int t) while(t-) /大致延时2mS DelayUs2x(190); /*- 主函数-*/void main() unsigned int i=512;/旋转一周时间 Speed=1; while(1) /正向 Coil_A1 /遇到C
10、oil_A1 用A1=1;B1=0;C1=0;D1=0;代替 DelayMs(Speed); /改变这个参数可以调整电机转速 , /数字越小 力矩越小 Coil_AB1 DelayMs(Speed); Coil_B1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_D1 DelayMs(Speed); Coil_DA1 DelayMs(Speed); 自由摆保持平衡程序/*/ 名称: 自由摆保持平衡程序 编写: duan 日期: 2011/9/2 内容:
11、 三轴加速度传感器传感,使用步进电机保持平板平衡/*/#include #include /要用到_nop_();函数#include sbit A1=P10; /定义步进电机连接端口sbit B1=P11;sbit C1=P12;sbit D1=P13;#define Coil_A1 A1=1;B1=0;C1=0;D1=0;/A相通电,其他相断电#define Coil_B1 A1=0;B1=1;C1=0;D1=0;/B相通电,其他相断电#define Coil_C1 A1=0;B1=0;C1=1;D1=0;/C相通电,其他相断电#define Coil_D1 A1=0;B1=0;C1=0;
12、D1=1;/D相通电,其他相断电#define Coil_AB1 A1=1;B1=1;C1=0;D1=0;/AB相通电,其他相断电#define Coil_BC1 A1=0;B1=1;C1=1;D1=0;/BC相通电,其他相断电#define Coil_CD1 A1=0;B1=0;C1=1;D1=1;/CD相通电,其他相断电#define Coil_DA1 A1=1;B1=0;C1=0;D1=1;/D相通电,其他相断电#define Coil_OFF A1=0;B1=0;C1=0;D1=0;/全部断电#define uchar unsigned char#define uint unsigne
13、d int #define IIC_READ 0x1D /定义读指令#define IIC_WRITE 0x1D /定义写指令sbit sda=P16; /I2C 数据传送位sbit scl=P17;uchar ack_sign;unsigned int Speed;/*/* 各延时程序 */*/void iic_delay() /5us延时 _nop_(); _nop_(); _nop_(); _nop_();void delay_50us(uint t) uchar j; for(;t0;t-) for(j=19;j0;j-);void delay_50ms(uchar t) uint j
14、; for(;t0;t-) for(j=6245;j0;j-);/*- uS延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号字符变量,其值的范围是 065535 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS -*/void DelayUs2x( int t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs( int
15、 t) while(t-) /大致延时2mS DelayUs2x(190); /*/* I2C通信部分 */*/void iic_start() /函数功能:I2C通信开始 sda=1; iic_delay(); scl=1; iic_delay(); sda=0; iic_delay(); void iic_stop() /函数功能:I2C通信停止 sda=0; iic_delay(); scl=1; iic_delay(); sda=1; iic_delay(); void iic_ack() /函数功能:I2C通信查应答位 sda=1; scl=1; iic_delay(); ack_s
16、ign = sda; scl=0; void iic_write_byte(uchar wdata)/函数功能:向I2C从机写入一个字节 uchar i,temp,temp1; temp1=wdata; for(i=0;i8;i+) scl = 0; iic_delay(); temp=temp1; temp=temp&0x80; if(temp=0x80) sda=1; else sda=0; iic_delay(); scl=1; iic_delay(); scl=0; iic_delay(); temp1=temp11; char iic_read_byte(void) /函数功能:从I
17、2C从机中读出一个字节 uchar x; char data_data; for(x=0;x8;x+) data_data=data_data1; sda=1; iic_delay(); scl=0; iic_delay(); scl=1; iic_delay(); if(sda=1) data_data|=0x01; /else / data_data&=0xfe; return data_data;void iic_write(uchar byte_add,uchar wdata)/函数功能:按地址写入一字节数据 uchar t; t=(IIC_WRITE1); iic_start();
18、iic_write_byte(t); iic_ack(); iic_write_byte(byte_add); iic_ack(); iic_write_byte(wdata); iic_ack(); iic_stop();char iic_read(uchar byte_add) /函数功能:按地址读出一字节数据 uchar t; char x; t=(IIC_WRITE1); iic_start(); iic_write_byte(t); iic_ack(); iic_write_byte(byte_add); iic_ack(); t=(IIC_READ 0) for(i = 0;i n
19、;i+ ) Coil_A1 /遇到Coil_A用A1=1;B1=0;C1=0;D1=0;代替 DelayMs(Speed); /改变这个参数可以调整电机转速 , /数字越小 力矩越小 Coil_AB1 DelayMs(Speed); Coil_B1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_CD1 DelayMs(Speed); Coil_D1 DelayMs(Speed); Coil_DA1 DelayMs(Speed); else for(i = 0;i n;i+ ) Coil_DA1 Del
20、ayMs(Speed); Coil_D1 /遇到Coil_A1 用A1=1;B1=0;C1=0;D1=0;代替 DelayMs(Speed); /改变这个参数可以调整电机转速 , /数字越小,转速越大,力矩越小 Coil_CD1 DelayMs(Speed); Coil_C1 DelayMs(Speed); Coil_BC1 DelayMs(Speed); Coil_B1 DelayMs(Speed); Coil_AB1 DelayMs(Speed); Coil_A1 DelayMs(Speed); temp = iic_read(0x06); 4测试方案和结果次数12345摆杆的周期T/s2
21、23156230243232次数678910摆杆的周期T/s312212201217220去掉最大值和最小值 求平均值:T均=225通过计算,对程序进行修改,修改延时SPEED,对电机的转动的速度进行控制.测试结果分析项目功能实现情况备注 基础部分电机和单摆一同转动良好只需要两个的周期相差不大即可放置一个硬币的情况不好仍然需要调试放置八个硬币未完成发挥部分未完成未完成未完成未完成5结论和总结在本次设计的过程中,我们遇到了各种困难和许多没有预想到情况。由于我们自身水平有限和时间紧张等因素,本作品还有许多未完成的部分,做好的部分还需要很大的改进.经过此次电子设计竞赛,我们在电路的设计、调试方面得到了很好锻炼,能力也有了很大的提高,同时也深刻的体会到:实践是理论运用的最好检验,懂得了共同协作和团队精神的重要性,提高了我们分析问题、解决问题的能力。参考
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1