搜索
bottom↓
回复: 22

也做个平衡小车

[复制链接]

出0入4汤圆

发表于 2012-2-24 21:09:25 | 显示全部楼层 |阅读模式
为适应四轴发展需要,我要从程序,从电路做起,有我们自己的代码,为此,写了下面的东东,希望众多高手支持、赐教

硬件:mega8+enc03+H桥
软件:我们坛子里的“标准的PID例程”,当小车朝一个方向偏离平衡点时,电机将反转以矫正小车的倾斜。电机控制没有用PWM,直接是通断信号
实验结果:抖动严重,并且只能平衡很短时间,小车会慢慢倒下。另外,比例p=1,I=1的效果与P=10,I=10的效果差不多一样
源程序:
#include <iom8v.h>
#include <macros.h>
#include "main.h"
#include "init.h"
unsigned int a=0,b=0;
signed int ad=0,adZ=0;
/*由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),
作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的"余数",做好余数补偿。*/  
#include <string.h>  
#include <stdio.h>  
/*====================================================================================================  
    PID Function  
      
    The PID (比例、积分、微分) function is used in mainly  
    control applications. PIDCalc performs one iteration of the PID  
    algorithm.  

    While the PID function works, main is just a dummy program showing  
    a typical usage.  
=====================================================================================================*/  

typedef struct PID {  

        double  SetPoint;           //  设定目标 Desired Value  

        double  Proportion;         //  比例常数 Proportional Const  
        double  Integral;           //  积分常数 Integral Const  
        double  Derivative;         //  微分常数 Derivative Const  

        double  LastError;          //  Error[-1]  
        double  PrevError;          //  Error[-2]  
        double  SumError;           //  Sums of Errors  

} PID;  

/*====================================================================================================  
   PID计算部分  
=====================================================================================================*/  

double PIDCalc( PID *pp, double NextPoint )  
{  
    double  dError,  Error;  

        Error = pp->SetPoint -  NextPoint;          // 偏差  
        pp->SumError += Error;                      // 积分  
        dError = pp->LastError - pp->PrevError;     // 当前微分  
        pp->PrevError = pp->LastError;  
        pp->LastError = Error;  
        return (pp->Proportion * Error              // 比例项  
            +   pp->Integral * pp->SumError         // 积分项  
            +   pp->Derivative * dError             // 微分项  
        );  
}  

/*====================================================================================================  
   Initialize PID Structure  
=====================================================================================================*/  

void PIDInit (PID *pp)  
{  
    memset ( pp,0,sizeof(PID));  
}  

/*====================================================================================================  
    Main Program  
=====================================================================================================*/  

double sensor (void)                    //  Dummy Sensor Function  
{  
    for(a=0;a<60;a++)
        {
          ad+=read_adc(0);//-adZ;
        }
        ad/=60;
        //ad-=read_adc(1);
        return ad;  
}  

void actuator(double rDelta)            //  Dummy Actuator Function  
{
  if(ad>-10)
         {
           PORTB|=BIT(1);
           PORTB&=~BIT(2);
           PORTB|=BIT(7);
           PORTB&=~BIT(6);
         }
         else if(ad<-15)
         {
           PORTB|=BIT(2);
           PORTB&=~BIT(1);
           PORTB&=~BIT(7);
           PORTB&=~BIT(6);
         }
         else
         {
            PORTB&=~BIT(1);
            PORTB&=~BIT(2);
                PORTB|=BIT(6);
         
         }
  ad=0;
}  

int main(void)  
{  
    PID         sPID;                   //  PID Control Structure  
    double      rOut;                   //  PID Response (Output)  
    double      rIn;                    //  PID Feedback (Input)  
   
    init_devices();
    PORTB|=BIT(6);
    adZ=read_adc(0);
    for(a=0;a<20;a++)
    for(b=0;b<65535;b++); //soft time delay,and waiting for the power stable
  
    PIDInit ( &sPID );                  //  Initialize Structure  
    sPID.Proportion = 1;              //  Set PID Coefficients  
    sPID.Integral   = 1;  
    sPID.Derivative = 0;  
    sPID.SetPoint   =934;//660;//read_adc(1);//934;            //  Set PID Setpoint  
  while(1)
  {
        rIn = sensor ();                //  Read Input  
    rOut = PIDCalc ( &sPID,rIn );   //  Perform PID Interation  
    actuator ( rOut );              //  Effect Needed Changes  

         
  }
  return 0;  
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

 楼主| 发表于 2012-2-24 21:12:52 | 显示全部楼层
上图片,小车的电路是我的垃圾雕刻机雕的。当初响应坛主的号召,在没有仔细考虑、计算的情况下造就了我今天垃圾机器,呵呵


(原文件名:IMAGE_00031.jpg)


(原文件名:IMAGE_00032.jpg)


(原文件名:IMAGE_00033.jpg)


(原文件名:IMAGE_00034.jpg)


(原文件名:IMAGE_00012.jpg)


(原文件名:IMAGE_00015.jpg)


(原文件名:IMAGE_00016.jpg)


(原文件名:IMAGE_00018.jpg)


(原文件名:IMAGE_00023.jpg)


(原文件名:IMAGE_00022.jpg)


(原文件名:IMAGE_00025.jpg)

出0入4汤圆

 楼主| 发表于 2012-2-24 21:48:02 | 显示全部楼层
视频,PID参数p=1,i=1,d=0,效果比p=I=10,差一点
http://v.youku.com/v_show/id_XMzU2Mzc3Mjky.html

出0入0汤圆

发表于 2012-2-24 22:07:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-8 11:06:34 | 显示全部楼层
这个确实挺牛的,收藏了,有空也试试

出0入0汤圆

发表于 2012-4-10 22:58:56 | 显示全部楼层
楼主做好了吗?我也做到这一步了,发现直接用差量法都比这个pid平稳

出0入4汤圆

 楼主| 发表于 2012-4-18 11:55:15 | 显示全部楼层
http://v.youku.com/v_show/id_XMzgyNzQwOTIw.html

出0入4汤圆

 楼主| 发表于 2012-4-18 11:55:42 | 显示全部楼层
这是用PI

出0入0汤圆

发表于 2012-4-18 12:51:26 | 显示全部楼层
传感器放在轮轴处好还是顶端好?
重心高点好还是低点好?

出0入4汤圆

 楼主| 发表于 2012-4-18 13:13:05 | 显示全部楼层
传感器靠上,重心偏低,已与平衡,我的理解

出0入0汤圆

发表于 2012-4-18 13:33:50 | 显示全部楼层
ZL_electric 发表于 2012-4-18 13:13
传感器靠上,重心偏低,已与平衡,我的理解

之前关于重心是偏高好还是偏低好有过讨论,从倒立摆的角度来看,偏高比较好。
不过传感器够好,电机够劲,也没什么区别。从视觉上来讲,电池放下面压底比较好。

出0入0汤圆

发表于 2012-4-18 13:34:56 | 显示全部楼层
LZ的一套家什挺不错的

出0入0汤圆

发表于 2012-4-20 15:24:26 | 显示全部楼层
雕刻机都有啊

出0入0汤圆

发表于 2012-4-23 14:31:53 | 显示全部楼层
后续呢? 没后文了?~

出0入4汤圆

 楼主| 发表于 2012-4-23 15:59:07 | 显示全部楼层
lukyers 发表于 2012-4-23 14:31
后续呢? 没后文了?~

你这个挺不错的···
你用什么传感器?

出0入0汤圆

发表于 2012-4-23 22:09:42 | 显示全部楼层
ZL_electric 发表于 2012-4-23 15:59
你这个挺不错的···
你用什么传感器?

ENC-03  和 MMA7455  目前只能平衡~  抗性差~  会前后移动 不能保持静止

出0入4汤圆

 楼主| 发表于 2012-4-23 22:55:39 | 显示全部楼层
lukyers 发表于 2012-4-23 22:09
ENC-03  和 MMA7455  目前只能平衡~  抗性差~  会前后移动 不能保持静止

我看你用的TT电机,响应速度是不是有点慢?

出0入0汤圆

发表于 2012-4-24 10:39:03 | 显示全部楼层
ZL_electric 发表于 2012-4-23 22:55
我看你用的TT电机,响应速度是不是有点慢?

应该有些影响~  不过电机现在没时间换了~ 看网上有人用TT电机做成功的~  实在不行 我就去换个电机~   你的是直接用的直流有刷电机?

出0入4汤圆

 楼主| 发表于 2012-4-24 10:59:53 | 显示全部楼层
lukyers 发表于 2012-4-24 10:39
应该有些影响~  不过电机现在没时间换了~ 看网上有人用TT电机做成功的~  实在不行 我就去换个电机~   你 ...

直流有刷

出0入0汤圆

发表于 2013-7-14 02:09:32 | 显示全部楼层
我也要做个

出0入0汤圆

发表于 2013-7-18 01:44:16 | 显示全部楼层

出0入0汤圆

发表于 2014-1-14 14:21:22 | 显示全部楼层
我也收藏一份。。。。。。。。。。。

出0入0汤圆

发表于 2014-4-22 12:35:52 | 显示全部楼层
我只是来看看的,继续吧。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 18:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表