久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2178|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲精品综合一区 | 国产成人艳妇aa视频在线 | 亚洲免费三区 | 国产亚洲久 | 中文字幕高清 | 精品久久久久久久久亚洲 | 久久午夜国产精品www忘忧草 | 亚洲国产一区二区三区在线观看 | 欧美激情在线一区二区三区 | 亚洲一区二区久久 | 日韩一级电影免费观看 | 在线只有精品 | 亚洲 成人 av | 欧美日韩黄| 9久久婷婷国产综合精品性色 | 久久久精选| 在线黄 | 韩国毛片视频 | 在线观看国产视频 | 国产在线对白 | 在线免费观看黄色 | 亚洲精久久久 | 国产视频中文字幕 | 亚洲一级av毛片 | 欧美亚洲国产日韩 | 精品成人免费一区二区在线播放 | 一级在线观看 | 国产精品久久久久久网站 | 国产在线小视频 | 久草久草久草 | 五月天国产视频 | 一级二级三级在线观看 | 精品在线观看一区二区 | 羞羞的视频免费在线观看 | 成人免费视频在线观看 | 精品久久香蕉国产线看观看亚洲 | 91成人在线| 欧美激情在线一区二区三区 | 国产一区二区三区 | 国产精品美女久久久久久免费 | 久久精品久久久久久 |