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

標題: 單片機+PID調速調不了,lcd顯示不了實時轉速 [打印本頁]

作者: bouligand    時間: 2022-11-5 17:30
標題: 單片機+PID調速調不了,lcd顯示不了實時轉速
如題,想問問大佬怎么回事,對我來說太難搞了用的同站大佬的程序調試的

51hei圖片_20221105172406.jpg (328.12 KB, 下載次數: 119)

實物連接

實物連接

51hei圖片_20221105172401.jpg (230.99 KB, 下載次數: 110)

電機轉,實施轉速不顯示

電機轉,實施轉速不顯示

作者: zhxiufan    時間: 2022-11-6 08:42
應該是接線問題,沒有檢測到實際速度。
作者: bouligand    時間: 2022-11-6 12:33
zhxiufan 發表于 2022-11-6 08:42
應該是接線問題,沒有檢測到實際速度。

該怎么接線呢

作者: bouligand    時間: 2022-11-6 12:50
而且加速鍵和減速鍵都不能用,有大佬指點一下嗎
作者: glinfei    時間: 2022-11-6 17:57
總要讓人看清霍爾那里^_^幾根是怎么接的啊
作者: bouligand    時間: 2022-11-6 19:46
glinfei 發表于 2022-11-6 17:57
總要讓人看清霍爾那里^_^幾根是怎么接的啊

霍爾六根線,電機線接l298,編碼器電源接開發板供電,中間兩相接單片機的中斷器接口和普通接口
作者: c00156155    時間: 2022-11-6 21:52
沒有程序,也沒有見你的實物連接是什么樣子,只有幾張圖片,我只能猜可能是接線問題,可能是程序問題。
作者: bouligand    時間: 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.   }
復制代碼

作者: glinfei    時間: 2022-11-7 11:36
你霍爾的中斷線接錯了,程序用的p32,你接到p30
作者: bouligand    時間: 2022-11-7 12:30
glinfei 發表于 2022-11-7 11:36
你霍爾的中斷線接錯了,程序用的p32,你接到p30

霍爾中間兩相線接到了單片機兩個中斷口,結果可以檢測到轉速,但是加速減速按鍵不管用,這是怎么回事,求大佬指點
作者: xuyaqi    時間: 2022-11-7 15:13
bouligand 發表于 2022-11-7 09:03
程序用的是同站一個大佬的這個的代碼

程序有問題,sbit qidong=P3^2;//啟動鍵,P3^2中斷0應接編碼器輸出用來測速,不能接按鍵,按鍵換成P1^3,改后你再試。
作者: glinfei    時間: 2022-11-7 16:39
bouligand 發表于 2022-11-7 12:30
霍爾中間兩相線接到了單片機兩個中斷口,結果可以檢測到轉速,但是加速減速按鍵不管用,這是怎么回事,求 ...

你就直接抄程序唄,為啥要改呢,就是改的地方出錯了。
作者: bouligand    時間: 2022-11-8 20:13
glinfei 發表于 2022-11-7 16:39
你就直接抄程序唄,為啥要改呢,就是改的地方出錯了。

根據源程序接線,中間兩相接哪,中斷口是3.2,3.3,哪能不起沖突
作者: glinfei    時間: 2022-11-9 10:23
bouligand 發表于 2022-11-8 20:13
根據源程序接線,中間兩相接哪,中斷口是3.2,3.3,哪能不起沖突

你又不測電機轉向,把任意一項接到3.2,另一個懸空唄。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩国产一区二区三区不卡 | 国产亚洲精品综合一区 | 亚洲一区二区三区在线视频 | 日韩欧美中文字幕在线观看 | 一区二区三区在线播放 | 天堂在线免费视频 | 久久久久综合 | 亚洲成人免费 | 国产国产精品 | 亚洲国产一区在线 | 亚洲国产视频一区 | 国产精品99久久久久久动医院 | 久久免费精品 | 国产网站在线播放 | 一区二区三区免费 | 一级做受毛片免费大片 | 亚洲国产成人精品女人久久久 | 成年人黄色免费视频 | 国产精品久久久久影院色老大 | 国产视频久久 | 91免费版在线观看 | 午夜免费成人 | 欧美黑人巨大videos精品 | 伊人99| 日韩精品免费视频 | 日韩电影免费在线观看中文字幕 | 国产免费福利小视频 | 天天操综合网 | 亚洲精品小视频在线观看 | 99在线资源 | 久久久久久久香蕉 | 国产高清视频 | 欧美国产精品一区二区三区 | 国产一卡二卡三卡 | 精品一区二区在线观看 | 中文久久 | 成年人视频在线免费观看 | 欧美日韩久久精品 | 日本韩国电影免费观看 | 欧美中国少妇xxx性高请视频 | 丁香综合 |