打印
[8/16-bit MCU]

自平衡车基本原理----代码全部开源了

[复制链接]
2422|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cowboy2014|  楼主 | 2015-12-30 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.为什么要做自平衡车?
     当初有这个活动的时候一直在琢磨拿来做点什么?智能家居?NO,太老土了。监控系统?高端的这块板子搞不定,低端的没多大意思。。想了很多都不太满意。既然这块板子主推的是双核,那么当然用来做一种集成控制和大量运算的东西才能体现优势啦。这个东西无非就是两种:平衡车和四轴。  四轴以前没搞过,心里底气不足啊,况且也没有四轴的基本模型,投入成本太高。最后当然选中的自平衡小车啦。

相关帖子

沙发
cowboy2014|  楼主 | 2015-12-30 20:28 | 只看该作者
2.什么是自平衡车,难吗?
   从上图也能看出,自平衡车就是两个轮子,其实个人感觉自平衡车还可以做成自行车那种样子!
   自平衡车的基本原理就是利用旋转物体的定轴性,类似于陀螺仪的原理。他的基本模型就是倒立摆,当我们发现倒立摆要倒了时就是进行修正。所以理论上只要我们获取到了当前的倾斜方向就可以避免它跌倒。但是这仅仅是理论上的分析,到底是偏移了多少才能避免它跌倒则是根据各种算法计算出来,算法设计得越好,平衡小车行走越稳定。拿人来打比方可能更加清楚:对于人而言,当人体的重心向前倾斜并失去平衡时,人通过自身的感觉器官能够察觉到自己身体的倾斜(角度),于是他会做出一个反应向前迈出一步来防止自己摔倒在地上。如果身体一直前倾,为了保持平衡,人就会一步又一步地往前走。因此,如果将两个由电机驱动的车轮看成人的双腿,再加上能够测量车体相对于水平面倾角大小和速度的传感器,最后通过微处理器的控制便能够实现车体自平衡的效果。因而当人站在车上时,只要将身体带动车体一起往前倾(或后倾)就可以实现电动车载人前进(或后退)

使用特权

评论回复
板凳
cowboy2014|  楼主 | 2015-12-30 20:28 | 只看该作者
3.实现自平衡车用了LPC54102哪些资源?
       根据上面分析,我们知道自平衡小车主要是在姿态获取与姿态解算上,所以本小车的程序主要用LPC板子上的PWM模块(用来控制小车轮子),I2C模块(用来获取姿态传感器模块6050),UART模块(用来连接蓝牙模块与手机通讯)。其他的还有诸如DMA、中断等等。这些所有获取的信息再送到强大的M4内核中进行运算然后再通过PWM模块来控制小车平衡与行走!


先来看此次的重头戏,开源的代码:

使用特权

评论回复
地板
cowboy2014|  楼主 | 2015-12-30 20:29 | 只看该作者
由于时间紧迫,该代码还没有完全优化,所以还有不少改进的空间,后续还可以加个操作系统上去试试。

首先看看MAIN函数,它在TEST.C文件之中:
int main(void)
{
    SystemCoreClockUpdate();  //配置系统内核
    Board_Init();
    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 14,
                         (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 14);
    Chip_GPIO_SetPinState(LPC_GPIO, 0, 14, 0);   //配置io口的功能
    LED_Init();     
    InitMPU6050();
    while(mpu_dmp_init());//初始化LED及6050

使用特权

评论回复
5
cowboy2014|  楼主 | 2015-12-30 20:30 | 只看该作者
 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 18,
                         (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 19,
                         (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 20,
                         (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 21,
                         (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 18);
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 19);
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 20);
    Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 21);
    SCTPWM_Init();  //在初始化完成了各个IO后,初始化PWM模块,用来控制自平衡车电机
    Init_USART();//初始化串口
    SysTick_Config(100000000 / TICKRATE_HZ);
    TIME_Init();

使用特权

评论回复
6
cowboy2014|  楼主 | 2015-12-30 20:30 | 只看该作者
while(1)
    {
        BluetoothControl();          //在循环中获取手机发出的控制,并及时更新状态信息。
    }
   
}

整个MAIN函数比较简单,就是初始化各个模块,特别是姿态模块,然后进入一个死循环,不停的接收蓝牙命令。那有些人会问了,到底小车怎么自平衡的呢?其实方法有很多,我这里用的是比较笨的一种,就是在SysTick中断中不停的读取小车的状态,然后根据状态进行修正。

使用特权

评论回复
7
Ketose| | 2015-12-31 14:03 | 只看该作者
这就完了??????

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

821

帖子

5

粉丝