2015年全国大学生电子设计竞赛
风力摆控制系统(B题)
2015年8月15日
摘 要
风力摆控制系统是一电机驱动测控系统,本系统以STC89C52单片机为控制核心,由轴流风机进行驱动,MPU6050三维角度传感器进行检测,应用PID控制算法,轴流风机调速使摆臂在一定角度范围内做自由摆及圆周运动,同时可以通过显示模块显示风力摆所处状态的各种参数。本系统结构简洁分明,达到了赛题所要求的基本功能。
关键词:风力摆;STC89C52;轴流风机;PID;
II
目 录
一、 系统方案论证与选择 .................................. 1
1.系统方案 .............................................................................................................. 1 2.方案比较与论证 .................................................................................................. 1
(1)控制模块的选择与论证 ............................................................................. 1 (2)电机驱动模块的论证与选择 ..................................................................... 1 (3)角度检测模块的论证与选择 ..................................................................... 1 (4)显示方案的论证与选择 ............................................................................. 2
二、系统理论分析与计算 ................................... 2
1.机械结构的设计 .................................................................................................. 2 2.风力摆状态的检测与计算 .................................................................................. 2 3.风力摆运动状态的分析 ...................................................................................... 3 4. 驱动与控制算法 ................................................................................................ 3
(1)电机驱动 ..................................................................................................... 3 (2)控制算法 ..................................................................................................... 3
三、电路及程序设计 ....................................... 4
1.电路设计 .............................................................................................................. 4
(1)风机驱动电路设计 ..................................................................................... 4 (2)显示模块 ..................................................................................................... 5 2.程序设计 .............................................................................................................. 5
四、测试结果与分析 ....................................... 6
1.测试仪器 .............................................................................................................. 6 2.测试方案与结果 .................................................................................................. 6
(1)风力摆做自由摆动的测试 ......................................................................... 6 (2)风力摆做幅度可控摆动的测试 ................................................................. 7 (3)静止状态恢复测试 ..................................................................................... 7 3.测试结果分析 ...................................................................................................... 7
五、总结 ................................................. 7 参考文献 ................................................. 9 附录A 主要元器件清单 ................................... 10
III
附录B 电路原理图....................................... 11 附录C 源程序 .......................................... 12
IV
一、 系统方案论证与选择
1.系统方案
本系统主要由单片机控制模块、电机驱动模块、角度检测模块、电源模块组成,键盘模块,显示模块组成。
2.方案比较与论证 (1)控制模块的选择与论证
方案一:采用MSP430单片机
MSP430系列单片机采用精简指令集结构,具有丰富的寻址方式,以及强大的处理能力并且具有超低的功耗。在运算速度方面,能在 8MHz 晶体的驱动下,实现 125ns 的指令周期。但是所占的指令空间较大,资料也比较少。 方案二:采用STC89C51单片机
STC89C51单片机算术运算功能强,软件编程灵活 、 自由度大,可用软件编程实现各种算法和逻辑控制 。由于其功耗低、体积小、技术 成熟和成本低等优点,各个领域应用广泛。并且由于芯片引脚少,在硬件很容易实现。
综合上述两种方案,方案二较为简单,可以满足设计要求。
(2)电机驱动模块的论证与选择
方案一:采用自搭接的H桥电路
选用大功率达林顿管或场效应管自制H桥电路,电路原理简单,具有高效,低功率等特点,但是性能不够稳定,电路调试复杂 方案二:采用L298N电机驱动模块
L298N是一款单片集成的高电压、高电流、双路全桥式电机驱动。最高工作电压可达46v,内含两个H桥的高电压大电流全桥式驱动器,采用标准逻辑电平信号控制。电子开关的速度很快,稳定性也极强。
综合考虑,我们选择方案二。
(3)角度检测模块的论证与选择
方案一:采用MPU6050芯片
MPU6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用I2C接口连接一个第三方的数字传感器。并且容易上手。 方案二:采用WDS35D芯片
WDS35D传感器其测量范围为0°~360°,输出电压范围与输入电压有关,输出精度为1mv,测量精度为0.1度,线性度好,长期稳定行好,灵敏度高,可实现对角位移
1
的精确测量。
结合我们自身综合考虑,我们选择方案一。
(4)显示方案的论证与选择
方案一:采用LED数码管显示
LED显示具有硬件电路结构简单、调试方便、软件容易实现等优点,但是数码管只能显示简单的数字,显示信息量少,不能够满足此本设计的要求。 方案二:采用1602字符液晶
LCD液晶显示具有功耗低、显示内容丰富、清晰、且显示信息量大等优点而得到广泛应用。
综合以上两种方案选择,本设计选择方案二。
二、系统理论分析与计算
1.机械结构的设计
风力摆支架采用木条自行搭建,整体高100cm,臂杆长50cm,摆杆采用长65cm的碳维纤管,并通过万向节固定在臂杆上一端。摆杆下端悬挂二个直流风机,并在其下端安装一个向下的激光笔。碳维纤管具有强度高,质量轻,低密度等优点,广泛应用于航模,转轴等机械设备。符合本设计的要求。风力摆整体结构如图2.1所示。
臂杆
摆杆 轴流风机
图2.1 风力摆结构示意图
2.风力摆状态的检测与计算
采用高精度的角度传感器MPU6050不断采集风力摆姿态角数据。MPU6050集成了
2
3轴MEMS陀螺仪,3轴MEMS加速器,以及一个可扩展的数字运动处理器DMP。MPU6050和所有设备寄存器之间的通信采用400KHz的I2C接口。实现高速通信。内置的可编程卡尔曼滤波器,采用最优化自回归数据处理算法精确测量风力摆当前姿态角。MPU6050对陀螺仪和加速计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量,通过DMP处理器读取测量数据然后通过串口输出。
3.风力摆运动状态的分析
风力摆采用4个36W的直流风机为动力驱动系统,角度检测模块采集风力摆姿态角。然后将采集到的信息传送到单片机,单片机处理姿态角信息调节输出PWM的占空比,进而控制四个电机的工作状态,从而实现对风力摆的控制。
4. 驱动与控制算法 (1)电机驱动
对于普通的直流电机,其控制方法比较简单,只需给电机的两根控制线加适当的电压即可使电机转动起来,电压越高则电机转速越高。对于直流电机的速度调节,可以采用改变电压的方法,也可采用PWM调速方法。PWM调速就是使加在直流电机两端的电压为方波形式,加在电机两端的电压就在VLoad和0V之间不停的跳变,对应的电机电压波形如图 2.4.1所示:
OV 图2.2 PWM调速原理图
Uo Th T1 此时加在电机两端的平均电压Uo=Th/(Th+Tl)*VLoad,可以通过调整PWM的占空比来改变Th和Tl的比值。这样就可以通过PWM调节加在电机两端的平均电压,从而改变电机的转速。
(2)控制算法
风力摆的运动是连续运动,摆杆的变化也是连续的渐变过程,因此我们采用PID控制算法。对直流电机为执行器件的系统中,基本采用增量试PID算法进行控制。数字PID控制算法是以模拟PID调节器控制为基础的,由于单片机是一种采样控制,只能根据采样时刻的偏差计算控制量。但是如果采样周期T取得足够小,采样数值计算方法逼近可相当准确,被控过程与连续控制十分接近。离散化后的PID算式为:
3
Tui=Kei+TiTdej+ei-ei-1+u0 Tj0i式中:K:比例系数,u0:偏差为零时的控制作用,Ti:积分时间,Td:微分时间,T:采样时间,以上公式称为位置式算法。有它可推出增量式算法:
TdTui=Kei-ei-1eiei-2ei-1ei2+u0
TiT式中各系数由反复实践后确定,实验证明,这种控制方式可以加快系统阶跃响应、减小超调量,并具有较高的精度。
三、电路及程序设计
1.电路设计
整个系统分为系统模块、编码器模块、电机驱动模块、电机模块、电源模块、键盘模块、显示模块。各模块的系统框图如图3.1所示。
图 3.1 系统框图 电源模块 键盘模块 角度检测 模块 控制模模块块风机模块 显示模块 (1)风机驱动电路设计
4
L298N是ST公司生产的一种高电压,大电流电机驱动芯片。该芯片最高工作电压课高达45V,输出电流大,瞬间峰值电流可达到3A,持续工作电流为2A,额定功率25W。内含两个H桥的高电压大电流全桥式驱动器。其电路图如图3.1.1.所示。
图3.1.1. 电机驱动模块
(2)显示模块
图3.12 LCD液晶显示模块
2.程序设计
本系统的软件部分主要有角度测量模块、驱动PWM模块、PID控制模块函数组成,当单片机上电后,进入初始化界面,根据不同的按键,单片机进入不同的工作方式,按
5
照不同的要求工作。角度检测传感器检测风力摆的姿态,输出电压信号,进而对直流风机控制,使风力摆做不同的摆动。流程框图如图3.2所示。
开始 初始化 调用键盘程序 基本要求一 基本要求二 基本要求三 基本要求四 角度检测传感器 风机驱动 模块 结束 图3.2 程序框图
四、测试结果与分析
1.测试仪器
测试仪器包括秒表,量角器,米尺,自制方向图纸
2.测试方案与结果
(1)风力摆做自由摆动的测试
从静止开始驱动风力摆,使其做类似自由摆运动,在15秒内使激光笔稳定地在自制方向图纸上画出一条长度不短于50cm的直线其线性度偏差不大于±2.5cm,并具有较好的重复性。测试结果如表1所示。
6
表1 风力摆画长于50cm直线测试
测试次数 第一次测试 第二次测试 第三次测试 完成所需时间(t) 16s 15s 13s 偏差 3cm 2.3cm 2cm 结果 失败 成功 成功 (2)风力摆做幅度可控摆动的测试
从静止开始启动风力摆,使其15秒内完场幅度可控的摆动,长度偏差不大于±2.5cm。测试结果如表2所示。
表2 风力摆做幅度可控的测试
测试次数 第一次测试 第二次测试 第三次测试 完成所需时间(t) 13s 15s 12s 偏差 2,1cm 2.3cm 2.4cm 结果 成功 成功 成功 (3)静止状态恢复测试
将风力摆拉起一定角度(30°~45°)放开,使其5秒内达到静止。测试结果如表4所示。
测试次数 第一次测试 第二次测试 第三次测试
完成所需时间(t) 6s 5s 6s 结果 失败 成功 失败 3.测试结果分析
测试结果分析,系统总体上达到较好的性能,完成了赛题要求的部分功能。但是在测试过程中,在直流风机自身的重力及较弱风力的影响下,对于部分基本功能没有能够很好的完成,直流风机驱动设计上存在部分缺陷,驱动力不足,使风力摆在部分基本功能上没有很好地完成要求。如资金充足
五、总结
风力摆是一种复杂、时变、非线性、自然不稳定的高阶系统,许多抽象的控制理念
7
概论都可以通过风力摆直观的直观的表现出来。
本设计通过分析控制器的基本原理,结合风力摆系统实际参数,然后通过控制理论设计控制器。采用PID控制算法对直流风机调速,进而控制风力摆的运动姿态,使其达到所需要的要求。在本设计中遇到的最大问题就是驱动不足,之前考虑过多种方案,但由于时间紧,任务重,系统还有一些功能未能实现,比如摆杆做类似圆周运动。若经改进,相信性能还会有进一步的提升。
本次四天三夜的竞赛极大的锻炼了我们各方面的能力,虽然在结果上没能达到预想中的程度,但总体上成功与挫折交替,困难与希望并存。我们会继续努力争取更大的进去,在此路上走的更远。
8
参考文献
[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社.2012
[2] 康华光主编. 电子技术基础[M]. 华中理工大学电子学教研室.2010 [3] 康华光、陈大钦主编. 电子技术基础数字部份[M].高等教育出版社.2010 [4] 郭天祥主编. 51单片机C语言教程[M]. 电子工业出版社.2008
[5] 王宜怀、吴瑾、蒋银珍编著.单片机原理与应用[M]. 电子工业出版社.2005 [6]蒋焕文,孙续.电子测量[M].3版.北京:中国计量出版社,2008 [7]蔡惟铮.集成电子技术.北京:高等教育出版社,2004
[8]李立功,等.现代电子测量计数[M].2版.北京:国防工业出版社,2008
[9] 辛晓宁 王晓旭. PWM调制的设计与实现 [J]. 电子设计工程2013,2(4):122~124 [10]高吉祥,唐朝京.全国大学生电子设计竞赛培训系列教程(电子仪器仪表设计)[M].北京:电子工业出版社,2007
9
附录A 主要元器件清单
序号 1 2 3 4 5 6 7 8 9 10 11 12 13
10
元器件名称 电阻 电阻 电阻 电阻 轴流风机 角度传感器 碳维纤管 万向节 激光笔 单片机芯片 液晶显示屏 电机驱动模块 单片机最小系统 型号 50Ω 100Ω 100KΩ 200KΩ MPU6050 65cm 连接杆直径<=10mm STC89C52 1602 L298N 51系列 规格 个 个 个 个 个 片 根 个 个 片 个 个 个 数量 10 10 10 10 4 1 1 1 1 1 1 1 1
附录B 电路原理图
11
附录C 源程序
#include #include typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; // 定义51单片机端口 #define DataPort P0 //LCD1602数据端口 sbit SCL=P1^0; //IIC时钟引脚定义 sbit SDA=P1^1; //IIC数据引脚定义 sbit LCM_RS=P3^3; //LCD1602命令端口 sbit LCM_RW=P3^4; //LCD1602命令端口 sbit LCM_EN=P3^5; //LCD1602命令端口 sbit PWM1=P2^0; //1号电机 sbit PWM2=P2^1; //2号电机 // 定义MPU6050内部地址 #define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz) #define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz) #define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) #define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) #define ACCEL_XOUT_H 0x3B #define ACCEL_XOUT_L 0x3C #define ACCEL_YOUT_H 0x3D #define ACCEL_YOUT_L 0x3E #define ACCEL_ZOUT_H 0x3F #define ACCEL_ZOUT_L 0x40 #define TEMP_OUT_H 0x41 #define TEMP_OUT_L 0x42 #define GYRO_XOUT_H 0x43 #define GYRO_XOUT_L 0x44 #define GYRO_YOUT_H 0x45 #define GYRO_YOUT_L 0x46 #define GYRO_ZOUT_H 0x47 #define GYRO_ZOUT_L 0x48 #define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用) #define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读) #define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取 //定义类型及变量 uchar dis[4]; //显示数字(-511至512)的字符数组 12 int dis_data; //变量 unsigned char count; //int Temperature,Temp_h,Temp_l; //温度及高低位数据 //函数声明 void delay(unsigned int k); //延时 //LCD相关函数 void InitLcd(); //初始化lcd1602 void lcd_printf(uchar *s,int temp_data); void WriteDataLCM(uchar dataW); //LCD数据void WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令 void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符 void DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串 //MPU6050操作函数 void InitMPU6050(); //初MPU6050 void Delay5us(); void I2C_Start(); void I2C_Stop(); void I2C_SendACK(bit ack); bit I2C_RecvACK(); void I2C_SendByte(uchar dat); uchar I2C_RecvByte(); void I2C_ReadPage(); void I2C_WritePage(); void display_ACCEL_x(); void display_ACCEL_y(); void display_ACCEL_z(); uchar Single_ReadI2C(uchar REG_Address); //读取I2C数据 void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据 //整数转字符串 void lcd_printf(uchar *s,int temp_data) { if(temp_data<0) { temp_data=-temp_data; *s='-'; } else *s=' '; *++s =temp_data/100+0x30; temp_data=temp_data%100; //取余运算 *++s =temp_data/10+0x30; temp_data=temp_data%10; //取余运算 *++s =temp_data+0x30; } 13 始化 //延时 void delay(unsigned int k) { unsigned int i,j; for(i=0;i void WaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } //LCD1602写入命令 void WriteCommandLCM(uchar CMD,uchar Attribc) { if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } //**************************************** //LCD1602写入数据 //**************************************** void WriteDataLCM(uchar dataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); 14 DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } //**************************************** //LCD1602写入一个字符 //**************************************** void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } //**************************************** //LCD1602显示字符串 //**************************************** void DisplayListChar(uchar X,uchar Y,uchar *DData,L) { uchar ListLength=0; Y&=0x1; X&=0xF; while(L--) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } //************************************** //延时5微秒(STC90C52RC@12M) //不同的工作环境,需要调整此函数 //当改用1T的MCU时,请调整此延时函数 //************************************** void Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } 15 //************************************** //I2C起始信号 //************************************** void I2C_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } //************************************** //I2C停止信号 //************************************** void I2C_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时 } //************************************** //I2C发送应答信号 //入口参数:ack (0:ACK 1:NAK) //************************************** void I2C_SendACK(bit ack) { SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } //************************************** //I2C接收应答信号 //************************************** bit I2C_RecvACK() { SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 16 Delay5us(); //延时 return CY; } //************************************** //向I2C总线发送一个字节数据 //************************************** void I2C_SendByte(uchar dat) { uchar i; for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } I2C_RecvACK(); } //************************************** //从I2C总线接收一个字节数据 //************************************** uchar I2C_RecvByte() { uchar i; uchar dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat <<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时 } return dat; } //************************************** //向I2C设备写入一个字节数据 //************************************** void Single_WriteI2C(uchar REG_Address,uchar REG_data) { 17 I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //内部寄存器地址, I2C_SendByte(REG_data); //内部寄存器数据, I2C_Stop(); //发送停止信号 } //************************************** //从I2C设备读取一个字节数据 //************************************** uchar Single_ReadI2C(uchar REG_Address) { uchar REG_data; I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //发送存储单元地址,从0开始 I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=I2C_RecvByte(); //读出寄存器数据 I2C_SendACK(1); //接收应答信号 I2C_Stop(); //停止信号 return REG_data; } //************************************** //初始化MPU6050 //************************************** void InitMPU6050() { Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态 Single_WriteI2C(SMPLRT_DIV, 0x07); Single_WriteI2C(CONFIG, 0x06); Single_WriteI2C(GYRO_CONFIG, 0x18); Single_WriteI2C(ACCEL_CONFIG, 0x01); } //************************************** //合成数据 //************************************** int GetData(uchar REG_Address) { char H,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return (H<<8)+L; //合成数据 } //************************************** 18 //在1602上显示10位数据 //************************************** void Display10BitData(int value,uchar x,uchar y) { value/=64; //转换为10位数据 lcd_printf(dis, value); //转换数据显示 DisplayListChar(x,y,dis,4); //启始列,行,显示数组,显示长度 } //显示X,Y,Z角度 short get_angle(float x,float y,float z,uint dir) //根据x轴,y轴,z轴方向的加速度求出角度 { float temp; float res=0; switch(dir) { case 0://与自然Z轴的角度 temp=sqrt((x*x+y*y))/z; res=atan(temp); break; case 1://与自然x轴的角度 temp=x/sqrt((z*z+y*y)); res=atan(temp); break; case 2://与自然y轴的角度 temp=y/sqrt((x*x+z*z)); res=atan(temp); break; } return res*1800/3.14; } //显示程序 void display() { Display10BitData(get_angle(GetData(ACCEL_XOUT_H)/16.4,GetData(ACCEL_YOUT_H)/16.4,GetData(ACCEL_ZOUT_H)/16.4,0)*6.428,2,0); //显示X轴加速度 Display10BitData(get_angle(GetData(ACCEL_XOUT_H)/16.4,GetData(ACCEL_YOUT_H)/16.4,GetData(ACCEL_ZOUT_H)/16.4,1)*6.428,7,0); //显示Y轴加速度 Display10BitData(get_angle(GetData(ACCEL_XOUT_H)/16.4,GetData(ACCEL_YOUT_H)/16.4,GetData(ACCEL_ZOUT_H)/16.4,2)*6.428,12,0); //显示Z轴加速度 Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度 Display10BitData(GetData(GYRO_YOUT_H),7,1); //显示Y轴角速度 Display10BitData(GetData(GYRO_ZOUT_H),12,1); //显示Z轴角速度 19 } //PWM函数 void pwm1(uchar x) //X 为占空比 Y为函数使用时间 { uchar a,b; for(a=x;a>0;a--) PWM1=1; for(b=100-x;b>0;b--) PWM1=0; } void pwm2(uchar y) //X 为占空比 Y为函数使用时间 { uchar c,d; for(c=y;c>0;c--) PWM2=1; for(d=100-y;d>0;d--) PWM2=0; } void tinit() { TMOD=0x01; TH0=(65536-50000)/256; //50ms TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1; } //模式 //********************************************************* //主程序 //********************************************************* void main() { delay(500); //上电延 cv时 InitLcd(); //液晶初始化 InitMPU6050(); //初始化MPU6050 delay(150); tinit(); while(1) { display(); delay(500) ; } 20 } void timer0() interrupt 1 { count=0; TH0=(65536-50000)/256; //50ms TL0=(65536-50000)%256; count++; if(count==100) { count=0; pwm1(20); pwm2(20); } } 21 因篇幅问题不能全部显示,请点此查看更多更全内容