OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8348|回复: 6

红外公循迹+PID控制电机的小车

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-1-5
在线时间
4 小时
发表于 2018-1-6 14:24:32 | 显示全部楼层 |阅读模式
1金钱
想学习做一个红外光循迹黑白线来控制的小车,pid控制电机的方法
有没有大神能够分享一下的心得,资料的

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-1-7 01:30:22 | 显示全部楼层
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-12-30
在线时间
7 小时
发表于 2018-1-7 17:54:38 | 显示全部楼层
#include <reg51.H>
#define SPEEDMAX 1000
sbit ENA = P1^2;
sbit CS  = P1^3;
sbit CLK = P1^4;
sbit DO  = P1^5;
unsigned char seg_data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //&sup1;&sup2;&Ograve;&otilde;&frac14;&laquo;&Ecirc;&yacute;&Acirc;&euml;&sup1;&Uuml;&para;&Icirc;&Ouml;&micro;
unsigned char bit_tab[4]={0xfe,0xfd,0xfb,0xf7};     //&Icirc;&raquo;&Ntilde;&iexcl;&iquest;&Oslash;&Ouml;&AElig;&Icirc;&raquo;
unsigned int mod[4]={1000,100,10,1};  //&Egrave;&iexcl;&Auml;&pound;&iquest;&Oslash;&Ouml;&AElig;&Aacute;&iquest;&pound;&not;&Icirc;&ordf;&Aacute;&Euml;·&frac12;±&atilde;&frac14;&AElig;&Euml;&atilde;&Ecirc;&reg;&frac12;&oslash;&Ouml;&AElig;&Ecirc;&yacute;&micro;&Auml;&Atilde;&iquest;&Ograve;&raquo;&Icirc;&raquo;&Ecirc;&yacute;×&Ouml;
float s1,s2,s3,s4,s5;                        //&Euml;&aelig;&raquo;ú&para;¨&Ograve;&aring;&micro;&Auml;&Euml;&Ugrave;&para;&Egrave;±&auml;&Aacute;&iquest;&pound;&not;±&cedil;&Oacute;&Atilde;
unsigned int rate;                                  //&Icirc;&acute;&Ecirc;&sup1;&Oacute;&Atilde;
unsigned int timer0_cnt;                            //&para;¨&Ecirc;±&AElig;÷0&para;¨&Ecirc;±&Ouml;&ETH;&para;&Iuml;&frac14;&AElig;&Ecirc;&yacute;&pound;&not;&Icirc;&ordf;&Aacute;&Euml;&iquest;&Oslash;&Ouml;&AElig;&Otilde;&frac14;&iquest;&Otilde;±&Egrave;&Ecirc;&sup1;&Oacute;&Atilde;
          int button_set_data;                       //°&acute;&frac14;ü&Eacute;è&Ouml;&Atilde;&Euml;&Ugrave;&para;&Egrave;&Ouml;&micro;
unsigned char button;                               //°&acute;&frac14;ü&Ouml;&micro;
unsigned char flag;                                 //±ê&Ouml;&frac34;&Icirc;&raquo;&pound;&not;&Auml;&iquest;&Ccedil;°&Icirc;&acute;&Ecirc;&sup1;&Oacute;&Atilde;
unsigned char timer2_cnt;                           //&para;¨&Ecirc;±&AElig;÷2&frac14;&AElig;&Ecirc;&yacute;&AElig;÷&pound;&not;&Oacute;&Atilde;&Agrave;&acute;&frac14;&AElig;&Ecirc;±500ms
unsigned char pot;                                  //&raquo;&not;&para;&macr;±&auml;×è&AElig;÷&micro;&ccedil;&Ntilde;&sup1;&Ouml;&micro;
unsigned int motor_plus;                            //1s&Auml;&Uacute;&pound;&not;&micro;&ccedil;&raquo;ú±à&Acirc;&euml;&AElig;÷&Acirc;&ouml;&sup3;&aring;&cedil;&ouml;&Ecirc;&yacute;
unsigned int driver_data;                           //&Otilde;&frac14;&iquest;&Otilde;±&Egrave;&Ccedil;&yacute;&para;&macr;&micro;÷&Otilde;&ucirc;
unsigned int pot_data;                              //&raquo;&not;&para;&macr;±&auml;×è&AElig;÷&micro;&ccedil;&Ntilde;&sup1;&Ouml;&micro;&para;&Ocirc;&Oacute;&brvbar;&micro;&Auml;×&ordf;&Euml;&Ugrave;
unsigned int speed;                                 //&micro;&ccedil;&raquo;ú×&ordf;&Euml;&Ugrave;
          int pid_val;                               //PID&iquest;&Oslash;&Ouml;&AElig;&Ecirc;&auml;&sup3;&ouml;&Ouml;&micro;
typedef struct  
{
     unsigned int set_point;
     
     float P;
     float I;
     float D;
     
     unsigned int last_error;
     unsigned int prev_error;
     unsigned int sum_error;
}
PID;                                           //PID&Euml;&atilde;·¨&frac12;á&sup1;&sup1;&Igrave;&aring;
PID motor_pid;                                  //&para;¨&Ograve;&aring;&micro;&ccedil;&raquo;úPID&iquest;&Oslash;&Ouml;&AElig;±&auml;&Aacute;&iquest;                  
//PID&frac14;&AElig;&Euml;&atilde;
int PidCalculate(PID *ppid, int next_point)     //PID&frac14;&AElig;&Euml;&atilde;&ordm;&macr;&Ecirc;&yacute;
{
     float derror,error;
     float val;
     
     error=ppid->set_point-next_point;           //&micro;±&Ccedil;°&Ecirc;±&iquest;&Igrave;&sup2;&icirc;&Ouml;&micro;
     ppid->sum_error+=error;                     //&raquo;&yacute;·&Ouml;&Ouml;&micro;&pound;&not;&raquo;&yacute;·&Ouml;&Ouml;&micro;&frac34;&Iacute;&Ecirc;&Ccedil;&sup2;&icirc;&Ouml;&micro;&micro;&Auml;&Agrave;&Ucirc;&frac14;&Oacute;
     derror=ppid->last_error - ppid->prev_error; //&Icirc;&cent;·&Ouml;&Ouml;&micro;&pound;&not;&Icirc;&cent;·&Ouml;&frac34;&Iacute;&Ecirc;&Ccedil;&micro;±&Ccedil;°&Ecirc;±&iquest;&Igrave;&micro;&Auml;&sup2;&icirc;&Ouml;&micro;-&Ccedil;°&Ograve;&raquo;&Ecirc;±&iquest;&Igrave;&micro;&Auml;&sup2;&icirc;&Ouml;&micro;
     
     ppid->prev_error=ppid->last_error;          //&acute;&aelig;&acute;&cent;&micro;±&Ccedil;°&Ecirc;±&iquest;&Igrave;&micro;&Auml;&sup2;&icirc;&Ouml;&micro;&pound;&not;±&auml;&sup3;&Eacute;&Ccedil;°&Ograve;&raquo;&Ecirc;±&iquest;&Igrave;&sup2;&icirc;&Ouml;&micro;&pound;&not;&Icirc;&ordf;&Iuml;&Acirc;&acute;&Icirc;&frac14;&AElig;&Euml;&atilde;×&ouml;×&frac14;±&cedil;
     ppid->last_error=error;
     
     val=ppid->P*error + ppid->I * ppid->sum_error + ppid->D*derror;
     return (int)val;
}
void PidInit (PID *ppid)                //PID&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&ordm;&macr;&Ecirc;&yacute;
{
     ppid->set_point=0;
     ppid->P=0.6;
     ppid->I=1;
     ppid->D=0.2;
}
     
void delay(unsigned int x)              //&Ntilde;&Oacute;&Ecirc;±&ordm;&macr;&Ecirc;&yacute;
{
     unsigned int i;
     for(i=0;i<x;i++);
}
unsigned char AD0831_ReadChar(void)     //ADC&para;&Aacute;&Egrave;&iexcl;&Ecirc;&yacute;&frac34;&Yacute;
{
     unsigned char val;
     unsigned char i;
     val=0;
     CS=0;
     for(i=0;i<9;i++)
     {
         CLK=1;
         delay(1);
         CLK=0;
         val<<=1;
         val|=DO;
     }
     CS=1;
     delay(1);
     return val;
}
void main(void)
{
     unsigned char i,j;
     
     IT0=1;
     EX0=1;
     TMOD=0X12;
     TH0=256-70;
     TL0=256-70;
     ET0=1;
     EA=1;
     TR0=1;
     TH1=(65536-50000)/256;
     TL1=(65536-50000)%256;
     ET1=1;
     TR1=1;
     P1=0x00;
     DO=1;
     
     PidInit(&motor_pid);
     
     while(1)
     {
         P1|=0x01;
         j++;
         if(j==100)
         {
             pot = AD0831_ReadChar();            
             pot_data=(unsigned int)(((float)(pot)/256)*1000);
             j=0;
         }
        
         button=P3;
         button=button & 0x03;
         if(button!=0x03)
         {
             delay(10);
             button=P3;
             button=button & 0x03;
             if(button!=0x03)
             {
                 if(button==0x02)
                 {
                     button_set_data=button_set_data+100;
                 }
                 if(button==0x01)
                 {
                     button_set_data=button_set_data-100;
                 }
                 if(button_set_data>1000)
                     button_set_data=1000;
                 if(button_set_data<0)
                     button_set_data=0;
                 
             }
             while(button!=0x03)
             {
                 button=P3;
                 button=button & 0x03;
             }
         }
         
         
         for(i=0;i<4;i++)
         {
             P0=seg_data[(speed/mod[i])%10];
             P2=bit_tab[i];
             delay(100);
             P2=0xff;
         }
         
         motor_pid.set_point=pot_data;
     }
}
void timer0() interrupt 1
{
     timer0_cnt++;
     if(timer0_cnt==1000)
     {
         timer0_cnt=0;
     }
     if(timer0_cnt<driver_data)
     {
         ENA=1;
     }
     else
     {
         ENA=0;
     }
}
void int0() interrupt 0
{
     motor_plus++;
}
void timer1() interrupt 3
{
     TH1=(65536-50000)/256;
     TL1=(65536-50000)%256;
     timer2_cnt++;
     if(timer2_cnt==10)
     {
         timer2_cnt=0;
         
         speed=((float)(motor_plus)*(float)60)/(float)24.0;
         motor_plus=0;
         
         pid_val=PidCalculate(&motor_pid,speed);
         if(pid_val>1000)
             pid_val=1000;
         if(pid_val<0)
             pid_val=0;
         driver_data=(unsigned int)pid_val;  
     }
   
}
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-1-5
在线时间
4 小时
 楼主| 发表于 2018-1-7 20:36:39 | 显示全部楼层
xy123 发表于 2018-1-7 17:54
#include
#define SPEEDMAX 1000
sbit ENA = P1^2;

大佬,有没有stm32的?
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-1-5
在线时间
4 小时
 楼主| 发表于 2018-1-7 20:38:07 | 显示全部楼层
想要stm32的,红外光循迹还能走十字路口的
回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2018-1-8 11:12:02 | 显示全部楼层
苏三岁 发表于 2018-1-7 20:38
想要stm32的,红外光循迹还能走十字路口的

百度一大把
回复

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2018-3-30 17:13:45 | 显示全部楼层
xy123 发表于 2018-1-7 17:54
#include
#define SPEEDMAX 1000
sbit ENA = P1^2;

什么代码,什么功能啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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