这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 湖北理工TEA » B8组 (康夏涛,符友,罗积昌) 两轮平衡小车

共38条 3/4 1 2 3 4 跳转至
菜鸟
2016-04-20 22:10:40     打赏
21楼
      目前我们最大的难关就是自平衡了,百度查资料都是说一些算法的,感觉不知道从哪入手,然后希望大家能多给我们指点指点,相信我们能成功的!!!

菜鸟
2016-04-20 23:21:58     打赏
22楼
观摩大神,赞!

专家
2016-04-21 11:51:13     打赏
23楼
继续赞

菜鸟
2016-04-21 18:30:59     打赏
24楼

陀螺仪方面已经完成了,是根据陀螺仪资料里的例程改写的,在1602上显示x,y,z轴加速度和角速度

因为是模块化编程,就只上一部分程序了

(陀螺仪头文件)

#ifndef __TLY_H__
#define __TLY_H__

#include <reg51.h>
#include "kxt.h"

sbit    SCL=P3^7;			//IIC时钟引脚定义
sbit    SDA=P3^6;			//IIC数据引脚定义

#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为读取

void  InitMPU6050();													//初始化MPU6050
void  I2C_Start();
void  I2C_Stop();
void  I2C_SendACK(bit ack);
bit   I2C_RecvACK();
void  I2C_SendByte(unsigned char dat);
unsigned char I2C_RecvByte();
void  I2C_ReadPage();
void  I2C_WritePage();
unsigned char Single_ReadI2C(unsigned char REG_Address);/读取I2C数据
void  Single_WriteI2C(unsigned char REG_Address,unsigned char REG_data);//向I2C写入数据

#endif

 

(陀螺仪I2C通信)

#include "tly.h"

void Delay10us()
{
	unsigned char a,b;
	for(b=1;b>0;b--)
		for(a=2;a>0;a--);
}
void I2C_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay10us();                //延时
    SDA = 0;                    //产生下降沿
    Delay10us();                //延时
    SCL = 0;                    //拉低时钟线
}
void I2C_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay10us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay10us();                 //延时
}
//I2C发送应答信号
void I2C_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay10us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay10us();                 //延时
}
//I2C接收应答信号
bit I2C_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay10us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay10us();                 //延时
    return CY;
}
//向I2C总线发送一个字节数据
void I2C_SendByte(uc dat)
{
    uc i;
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay10us();             //延时
        SCL = 0;                //拉低时钟线
        Delay10us();             //延时
    }
    I2C_RecvACK();
}
//从I2C总线接收一个字节数据
unsigned char I2C_RecvByte()
{
    uc i;
    uc dat = 0;
    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay10us();             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delay10us();             //延时
    }
    return dat;
}
//向I2C设备写入一个字节数据
void Single_WriteI2C(uc REG_Address,uc REG_data)
{
    I2C_Start();                  //起始信号
    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
    I2C_SendByte(REG_Address);    //内部寄存器地址,
    I2C_SendByte(REG_data);       //内部寄存器数据,
    I2C_Stop();                   //发送停止信号
}
//初始化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);
}

 

(主函数部分)

void main()
{ 
	delay(500);		//上电延时		
	LCDI();			//液晶初始化
	InitMPU6050();	//初始化MPU6050
	delay(150);
	while(1)
	{
		Display10BitData(GetData(ACCEL_XOUT_H),2,0);	//显示X轴加速度
		Display10BitData(GetData(ACCEL_YOUT_H),7,0);	//显示Y轴加速度
		Display10BitData(GetData(ACCEL_ZOUT_H),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轴角速度
		delay(500);
	}
}

 



专家
2016-04-22 20:09:58     打赏
25楼
不错

菜鸟
2016-04-23 20:52:26     打赏
26楼
屌屌屌

专家
2016-04-24 08:55:41     打赏
27楼
继续,我轱辘都买好了

专家
2016-04-25 11:01:20     打赏
28楼
大神快更新

我轱辘都买好了

就等着你这边完工呢


菜鸟
2016-04-25 16:38:14     打赏
29楼
大神作品哇~自己动手做天线失败后拆路由器继续做佩服会持续关注的

专家
2016-04-28 21:01:43     打赏
30楼

我在pid算法这里卡住了

等楼主救我


共38条 3/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]