OpenEdv-开源电子网

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

这是点机的PID调速程序哪位程序大神能给翻译下呢?

[复制链接]

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-12-30
在线时间
7 小时
发表于 2018-1-3 16:05:20 | 显示全部楼层 |阅读模式
1金钱
#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;  
    }
  
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2018-1-4 00:49:48 | 显示全部楼层
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-12-30
在线时间
7 小时
 楼主| 发表于 2018-1-10 11:17:53 | 显示全部楼层
大神何在啊???
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2015-8-11
在线时间
17 小时
发表于 2018-1-10 15:01:24 | 显示全部楼层
..............一堆代码。还要翻译,,,你一个函数一个函数理解不就好了
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-12-30
在线时间
7 小时
 楼主| 发表于 2018-1-10 16:59:09 | 显示全部楼层
hnwangkg@163.co 发表于 2018-1-10 15:01
..............一堆代码。还要翻译,,,你一个函数一个函数理解不就好了

大神有没有PID怎样控制电机的资料呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-1 11:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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