找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1177|回复: 13
收起左侧

单片机+PID调速调不了,lcd显示不了实时转速

[复制链接]
ID:1045221 发表于 2022-11-5 17:30 | 显示全部楼层 |阅读模式
如题,想问问大佬怎么回事,对我来说太难搞了用的同站大佬的程序调试的

实物连接

实物连接

电机转,实施转速不显示

电机转,实施转速不显示
回复

使用道具 举报

ID:121859 发表于 2022-11-6 08:42 | 显示全部楼层
应该是接线问题,没有检测到实际速度。
回复

使用道具 举报

ID:1045221 发表于 2022-11-6 12:33 | 显示全部楼层
zhxiufan 发表于 2022-11-6 08:42
应该是接线问题,没有检测到实际速度。

该怎么接线呢
回复

使用道具 举报

ID:1045221 发表于 2022-11-6 12:50 | 显示全部楼层
而且加速键和减速键都不能用,有大佬指点一下吗
回复

使用道具 举报

ID:844772 发表于 2022-11-6 17:57 来自手机 | 显示全部楼层
总要让人看清霍尔那里^_^几根是怎么接的啊
回复

使用道具 举报

ID:1045221 发表于 2022-11-6 19:46 | 显示全部楼层
glinfei 发表于 2022-11-6 17:57
总要让人看清霍尔那里^_^几根是怎么接的啊

霍尔六根线,电机线接l298,编码器电源接开发板供电,中间两相接单片机的中断器接口和普通接口
回复

使用道具 举报

ID:606226 发表于 2022-11-6 21:52 | 显示全部楼层
没有程序,也没有见你的实物连接是什么样子,只有几张图片,我只能猜可能是接线问题,可能是程序问题。
回复

使用道具 举报

ID:1045221 发表于 2022-11-7 09:03 | 显示全部楼层
c00156155 发表于 2022-11-6 21:52
没有程序,也没有见你的实物连接是什么样子,只有几张图片,我只能猜可能是接线问题,可能是程序问题。

程序用的是同站一个大佬的这个的代码
  1. #include <reg51.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit qidong=P3^2;//启动键
  6. sbit tingzhi=P1^4;//停止键
  7. sbit fangxiang=P1^5;//转向键
  8. sbit AddSpeed=P1^6;//加速键
  9. sbit SubSpeed=P1^7;//减速键
  10. sbit RS = P0^7;//LCD1602数据命令选择端口
  11. sbit RW = P0^6;//LCD1602读写选择端口
  12. sbit EN = P0^5;//LCD1602使能端口
  13. sbit IN2=P1^1;//L298输入端2
  14. sbit IN1=P1^0;//L298输入端1
  15. sbit PWM_FC=P1^2;//L298使能端口
  16. uchar aa[]={'T','a','r','g','e','t',' ',' ',' ',' ',' ','r','/','s','e','c'};//目标转速:Target  r/sec
  17. uchar cc[]={'A','c','t','u','a','l',' ',' ',' ',' ',' ','r','/','s','e','c'};//实测转速: Actual  r/sec
  18. uchar displayflag;//显示标志位变量
  19. uint SetSpeed=1000;//声明设定速度变量
  20. uint ActualSpeed=0;//声明实际速度变量
  21. int e ,e1 ,e2 ;//声明当前偏差值变量、之后偏差值变量、再后偏差值变量
  22. int out=0;//PID调节后输出偏差值变量
  23. uint cnt=0;//定时器1中断次数变量
  24. uint Inpluse=0;//声明脉冲计数变量、
  25. uint PWMTime=100;//声明脉冲宽度时间变量
  26. float uk ,uk1 ,duk ;//声明目前总偏差值变量、之后偏差值总变量、偏差值总变量
  27. float Kp=0.36,Ki=0.05,Kd=0.016;//pid控制系数p=0.1,i=0.05,d=0.016。
  28.   void delay(uchar x)
  29. {
  30.    uint i,j;
  31.    for(i=x;i>0;i--)
  32.     for(j=50;j>0;j--);
  33.    }
  34.   void DelayUs2x(unsigned char t)
  35. {   
  36.    while(--t);
  37.   }
  38.   void DelayMs(unsigned char t)
  39. {
  40.    while(t--)
  41. {
  42.     DelayUs2x(245);
  43.     DelayUs2x(245);
  44.    }
  45. }
  46.   void write_com(uchar com)//写命令
  47. {
  48.    RS=0;
  49.    RW=0;
  50.    P2=com;
  51.    DelayMs(5);
  52.    EN=1;
  53.    DelayMs(5);
  54.    EN=0;
  55.   }
  56.   void write_data(uchar date)//写一个字符
  57. {
  58.    RS=1;
  59.    RW=0;
  60.    P2=date;
  61.    DelayMs(5);
  62.    EN=1;
  63.    DelayMs(5);
  64.    EN=0;
  65.   }
  66.   void init()//初始化
  67. {
  68.    write_com(0x38);
  69.    write_com(0x0c);
  70.    write_com(0x06);
  71.    write_com(0x01);
  72.   }
  73.   void LCD_Write_String(uchar x,uchar y,uchar *s)//写字符串
  74. {     
  75.    if (y == 0)
  76. {     
  77.     write_com(0x80 + x);     
  78.    }
  79.    else
  80. {     
  81.     write_com(0xC0 + x);     
  82.    }        
  83.    while (*s)
  84. {     
  85.      write_data( *s);     
  86.      s++;     
  87.    }
  88. }
  89.   void PIDControl()//pid偏差计算
  90. {
  91.    e=SetSpeed-ActualSpeed;//计算当前偏差值变量
  92.    duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2));//PID连续系统离散化增量型PID算法,算出总偏差值变量。
  93.    uk=duk+uk1;//计算偏差值总变量加上之后偏差值总变量之和赋给目前总偏差值变量
  94.    out=(int)uk;//强制类型转化为整数型的目前总偏差值变量赋给PID调节后输出偏差值变量
  95.    if(out>100)//判断PID调节后输出偏差值变量是否大于100
  96. {
  97.     out=100;//PID调节后输出偏差值变量为100
  98.    }
  99.    else if(out<0)//判断PID调节后输出偏差值变量是否小于0
  100. {
  101.     out=0;//PID调节后输出偏差值变量为0
  102.   }
  103.    uk1=uk;//目前总偏差值变量赋给之后偏差值总变量
  104.    e2=e1;//之前偏差值变量赋给之后偏差值变量
  105.    e1=e;//当前偏差值变量赋给之前偏差值变量
  106.    PWMTime=out;//PID调节后输出偏差值变量赋给脉冲宽度时间变量
  107. }
  108.   void PWMOUT()
  109. {
  110.    if(cnt<PWMTime)//判断定时器1中断次数变量是否小于脉冲宽度时间变量
  111. {
  112.     PWM_FC=1;//脉冲宽度输入端口输出高电平
  113.    }
  114.    else
  115. {
  116.     PWM_FC=0;//脉冲宽度输入端口输出低电平
  117.    }
  118.    if(cnt>100)//判断定时器1中断次数变量是否大于100
  119.    cnt=0;//定时器1中断次数变量归0
  120. }
  121.   void SystemInit()//定时器0定时器1外部中断0初始化函数
  122. {
  123.    TMOD=0X21;//定时器0方式1,定时器1方式2。  
  124.    TH0=0xf8;//初装定时器0高八位寄存器定时数值
  125.    TL0=0x50 ;//初装定时器0低八位寄存器定时数值,即2毫秒。
  126.    TH1=0xC0;//初装定时器1高八位寄存器定时数值
  127.    TL1=0XC0;//初装定时器1低八位寄存器定时数值,即16毫秒。
  128.    EA=1;//开总中断
  129.    EX0=1;//开外部中断0
  130.    IT0=1;//外部中断0下降沿触发
  131.    ET0=1;//开定时器0中断允许
  132.    ET1=1;//开定时器1中断允许
  133.    TR0=1;//开定时器0中断
  134.    TR1=1;//开定时器1中断
  135.    e =0;//偏差值变量为0
  136.    e1=0;//之后偏差值变量为0
  137.    e2=0;//再后偏差值变量为0
  138.    IN1=1;
  139.    IN2=1;
  140.   }
  141.   void SpeedSet()//设定速度函数
  142. {
  143.    if(qidong==0)
  144. {
  145.     delay(10);
  146.     if(qidong==0)
  147.   {
  148.      IN1=0;
  149.      IN2=1;
  150.      while(qidong==1);
  151.     }
  152.    }
  153.    if(tingzhi==0)
  154. {
  155.     delay(10);
  156.     if(tingzhi==0)
  157.   {
  158.      IN1=1;
  159.      IN2=1;
  160.      EN=1;
  161.      while(tingzhi==1);
  162.     }
  163.    }
  164.    if(fangxiang==0)
  165. {
  166.     delay(10);
  167.     if(fangxiang==0)
  168.   {
  169.      IN1=~IN1;
  170.      IN2=~IN2;
  171.      while(fangxiang==1);
  172.     }   
  173.    }
  174.    if(AddSpeed==0)//判断加速键是否按下
  175. {
  176.     delay(10);//延时
  177.     if(AddSpeed==0)//再次判断加速键是否按下
  178.   {
  179.      SetSpeed+=100;//设定速度变量每次加100
  180.      if(SetSpeed>1000)//判断设定速度变量是否大于3500
  181.    {
  182.       SetSpeed=1000;//设定速度变量归为3500
  183.      }
  184.     }
  185.    }
  186.    if(SubSpeed==0)//判断减速键是否按下
  187. {
  188.     delay(10);//延时
  189.     if(SubSpeed==0)//再次判断减速键是否按下
  190.   {
  191.      SetSpeed-=100;//设定速度变量每次减100
  192.      if(SetSpeed<0)//判断设定速度变量是否小于0
  193.      SetSpeed=0;//设定速度变量归0
  194.     }
  195.    }   
  196.     aa[7]=SetSpeed/1000+'0';
  197.     aa[8]=SetSpeed/100%10+'0';
  198.     aa[9]=SetSpeed/10%10+'0';
  199.     aa[10]=SetSpeed%10+'0';
  200.     LCD_Write_String(0,0,aa);
  201.   }
  202.   /**************主函数************/
  203.   void main()
  204. {
  205.    SystemInit();
  206.    init();
  207.    LCD_Write_String(0,0,aa);
  208.    displayflag=1;
  209.    while(1)
  210. {
  211.     SpeedSet();
  212.     if(displayflag==1)
  213.   {
  214.      displayflag=0;
  215.      cc[7]=ActualSpeed/1000+'0';
  216.      cc[8]=ActualSpeed/100%10+'0';
  217.      cc[9]=ActualSpeed/10%10+'0';
  218.      cc[10]=ActualSpeed%10+'0';
  219.      LCD_Write_String(0,1,cc);
  220.     }
  221.    }
  222.   }
  223.   void int0() interrupt 0//外部中断0函数
  224. {
  225.    Inpluse++;//脉冲计数变量加加
  226.   }
  227.   void Timer0() interrupt 1//定时器0中断服务函数
  228. {
  229.    static uint time=0;//转速测量周期变量
  230.    TH0=0xf8;//重装定时器0高八位寄存器计数值
  231.    TL0=0x50 ;//重装定时器0低八位寄存器计数值,即2毫秒。
  232.    time++;//转速测量周期变量加加
  233.    if(time>500)//判断转速测量周期变量是否大于500,等于500就是500x2毫秒=1000毫秒,也就是1s。
  234. {
  235.     time=0;//转速测量周期变量归0
  236.     displayflag=1;//显示标志位变量置1
  237.     ActualSpeed=Inpluse;//脉冲计数变量表示实际速度变量
  238.     Inpluse=0;//脉冲计数变量归0
  239.     PIDControl();//PID控制函数
  240.    }
  241.    PWMOUT();
  242. }
  243.   void Timer1() interrupt 3//定时器1中断服务函数
  244. {
  245.    cnt++;//定时器1中断次数变量
  246.   }
复制代码
回复

使用道具 举报

ID:844772 发表于 2022-11-7 11:36 | 显示全部楼层
你霍尔的中断线接错了,程序用的p32,你接到p30
回复

使用道具 举报

ID:1045221 发表于 2022-11-7 12:30 | 显示全部楼层
glinfei 发表于 2022-11-7 11:36
你霍尔的中断线接错了,程序用的p32,你接到p30

霍尔中间两相线接到了单片机两个中断口,结果可以检测到转速,但是加速减速按键不管用,这是怎么回事,求大佬指点
回复

使用道具 举报

ID:94031 发表于 2022-11-7 15:13 | 显示全部楼层
bouligand 发表于 2022-11-7 09:03
程序用的是同站一个大佬的这个的代码

程序有问题,sbit qidong=P3^2;//启动键,P3^2中断0应接编码器输出用来测速,不能接按键,按键换成P1^3,改后你再试。
回复

使用道具 举报

ID:844772 发表于 2022-11-7 16:39 | 显示全部楼层
bouligand 发表于 2022-11-7 12:30
霍尔中间两相线接到了单片机两个中断口,结果可以检测到转速,但是加速减速按键不管用,这是怎么回事,求 ...

你就直接抄程序呗,为啥要改呢,就是改的地方出错了。
回复

使用道具 举报

ID:1045221 发表于 2022-11-8 20:13 | 显示全部楼层
glinfei 发表于 2022-11-7 16:39
你就直接抄程序呗,为啥要改呢,就是改的地方出错了。

根据源程序接线,中间两相接哪,中断口是3.2,3.3,哪能不起冲突
回复

使用道具 举报

ID:844772 发表于 2022-11-9 10:23 | 显示全部楼层
bouligand 发表于 2022-11-8 20:13
根据源程序接线,中间两相接哪,中断口是3.2,3.3,哪能不起冲突

你又不测电机转向,把任意一项接到3.2,另一个悬空呗。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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