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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4838|回復: 7
收起左側

STM32直流電機位置PID調節程序 上位機顯示波形,直流電機位置環

  [復制鏈接]
ID:474195 發表于 2021-8-15 12:31 | 顯示全部樓層 |閱讀模式
其中包含原理圖,pcb,bom表 app 上位機stm32f103c8t6為主控,app控制顯示波形,上位機顯示波形,直流電機位置環。
位置PID調節使用說明
簡介:
應用stm32f103c8t6最小系統與雙相編碼器電機實現電機位置pid調節。
主要功能:
  •       可使用app進行pid參數與目標值的設定
  •       可使 上位機顯示pid調節過程的波形
  •       Oled顯示目標值,pid值,當前值等數據
整體結構:
使用說明:
  • 首先連接電源線連接電腦USB


  •   連接完畢后可見oled顯示如下:
第一行數據為目標值(初始為10000脈沖的位置);
第二行為目前數值(初始為10000脈沖的位置故初始電機不動作);

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png 51hei.png
51hei.png 51hei.png

STM32單片機源程序如下:
  1. #include "oled.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "TIME.h"
  5. #include "usart.h"         
  6. #include "DataScope_DP.h"
  7. #include "usart2.h"
  8. #include "string.h"

  9. u8 modle=3;        //改變倍數選擇  
  10. u16 Target=30000; //初始化目標值
  11. float Kp=120,Ki=0,Kd=360;//pid參數初始設定
  12. unsigned char i;          //計數變量
  13. unsigned char Send_Count; //串口需要發送的數據個數
  14. void gui(void);//oled界面函數
  15. void blup(void);//上位機傳輸函數
  16. void blue_recive(void);//藍牙接收函數
  17. int main(void)
  18. {         

  19.         delay_init();                     //延時函數初始化         
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷分組
  21.         TIME_init(); //定時器,定時中斷初始化
  22.         PWM_init();//pwwm初始化
  23.         usart2_init(115200);//串口2初始化 只用到發送
  24.         uart_init(9600);//串口1初始化
  25.         LED_Init();  //相關io初始化
  26.         OLED_Init();                          //初始化OLED      
  27.         OLED_Refresh_Gram();                //更新顯示到OLED  
  28.          
  29.         while(1)
  30.         {            
  31.   gui();
  32.         blup();
  33.         blue_recive();
  34.         delay_ms(70);         
  35.         printf("%d",((int)((TIM2->CNT)*0.02)));
  36.         //printf("PID調節測試程序ok");
  37.         }
  38. }
  39.   
  40. /************************************************
  41. 名稱:藍牙接收程序
  42. 介紹:接收來自app的串口數據
  43. 應用:串口1
  44. ************************************************/

  45. void blue_recive()
  46. {      

  47.     if(USART_RX_STA&0x8000)                                             //如果串口有數據發來
  48.     {                     
  49.                         
  50.                                 if(USART_RX_BUF[0]=='T') {Target=(USART_RX_BUF[1]-'0')*10000+(USART_RX_BUF[2]-'0')*1000+
  51.                                                         (USART_RX_BUF[3]-'0')*100+(USART_RX_BUF[4]-'0')*10+(USART_RX_BUF[5]-'0')*1;}                //解碼app發來的 tardgt的位置
  52.                                                         if(USART_RX_BUF[0]=='s')  modle=1;//改變倍數*0.01
  53.                                                         if(USART_RX_BUF[0]=='S')  modle=2;//改變倍數*0.1
  54.                                                         if(USART_RX_BUF[0]=='M')  modle=3;//改變倍數*1
  55.                                                         if(USART_RX_BUF[0]=='L')  modle=4; //改變倍數*10
  56.                                                                                                                                        
  57.                                                         if(USART_RX_BUF[0]=='B')  Target+=2000;  //響應正步進2000
  58.                                                         if(USART_RX_BUF[0]=='b')  Target-=2000;  //響應負步進2000
  59.                                                         
  60.                                                 
  61.                   if(modle==1)//倍數*0.01
  62.                                                                  {
  63.                                                            if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=0.01;}//如果發來的數據以p為幀頭則為p的變量以下同理
  64.                                                                   if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=0.01;}//此部分可以用str函數進行                                         
  65.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=0.01;}               
  66.                  if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=0.01;}
  67.                                                            if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=0.01;}
  68.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=0.01;}
  69.                                                                  }     
  70.                   if(modle==2)//倍數*0.1
  71.                                                                  {
  72.                                                            if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=0.1;}
  73.                                                                   if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=0.1;}                                                
  74.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=0.1;}               
  75.                  if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=0.1;}
  76.                                                            if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=0.1;}
  77.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=0.1;}
  78.                                                                  }   
  79.                   if(modle==3)//倍數*1
  80.                                                                  {
  81.                                                            if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=1;}
  82.                                                                   if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=1;}                                                
  83.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=1;}               
  84.                  if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=1;}
  85.                                                            if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=1;}
  86.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=1;}
  87.                                                                  }   
  88.                   if(modle==4)//倍數*10
  89.                                                                  {
  90.                                                            if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=10;}
  91.                                                                   if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=10;}                                                
  92.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=10;}               
  93.                  if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=10;}
  94.                                                            if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=10;}
  95.                                                            if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=10;}
  96.                                                                  }                                                                                    
  97.                USART_RX_STA=0;                                       //清除中斷 標志位
  98.     }
  99. }

  100. /************************************************
  101. 名稱:上位機波形顯示程序
  102. 介紹:向上位機發送波形信息
  103. 應用:串口2
  104. ************************************************/
  105. void blup(void)
  106. {

  107.         DataScope_Get_Channel_Data(TIM2->CNT, 1 );
  108.         DataScope_Get_Channel_Data(Target, 2 );
  109.         Send_Count = DataScope_Data_Generate(2);
  110.         for( i = 0 ; i < Send_Count; i++)
  111.         {
  112.         while((USART2->SR&0X40)==0);  
  113.         USART2->DR = DataScope_OutPut_Buffer[i];
  114.         }
  115. }


  116. /************************************************
  117. 名稱:oled界面程序
  118. 介紹:編輯oled界面提示相關信息
  119. 應用:spi通訊
  120. ************************************************/
  121. void gui(void)
  122. {

  123.   OLED_ShowString(0,0,"Target:",12);  
  124.         OLED_ShowNum(48,0,Target,5,12);        
  125.                                 
  126.         OLED_ShowString(0,16,"CNT:",12);  
  127.         OLED_ShowNum(48,16,TIM2->CNT,5,12);        
  128.                
  129.         OLED_ShowString(0,32,"PWM:",12);  
  130.         OLED_ShowNum(42,32,PWMA,4,12);        
  131.         OLED_ShowString(66,32,"/7100",12);                  
  132.                
  133.         OLED_ShowString(0,46,"Kp:",12);       OLED_ShowNum(15,46,Kp,3,12);        
  134.   OLED_ShowString(50,46,"Ki:",12);      OLED_ShowNum(66,46,Ki*100,2,12);        
  135.   OLED_ShowString(90,46,"Kd:",12);                  OLED_ShowNum(108,46,Kd,3,12);        
  136.         if(modle==1)        OLED_ShowString(100,16,"s",12);  
  137.         if(modle==2)        OLED_ShowString(100,16,"S",12);  
  138.         if(modle==3)        OLED_ShowString(100,16,"M",12);  
  139.         if(modle==4)        OLED_ShowString(100,16,"L",12);  
  140.   OLED_Refresh_Gram();                //更新顯示到OLED
  141. }
復制代碼

上位機和app沒有代碼,只有單片機有代碼
資料51hei下載地址:
PID演示調節資料.7z (12.17 MB, 下載次數: 155)
PID調節演示pcb.zip (3.67 MB, 下載次數: 103)

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:812760 發表于 2021-11-2 11:03 | 顯示全部樓層
樓主想問一下,可以實現精準控制電機轉動角度,或者距離嗎
回復

使用道具 舉報

ID:474195 發表于 2021-12-20 21:14 | 顯示全部樓層
xyw@6 發表于 2021-11-2 11:03
樓主想問一下,可以實現精準控制電機轉動角度,或者距離嗎

可以的 精度取決于你的負載和pid參數
回復

使用道具 舉報

ID:228452 發表于 2022-4-2 18:38 | 顯示全部樓層
Hello
after trying MiniBalance.exe I am getting error

Data Scope cannot operate normally because it cannot create the necessary configuration information!
Please try to run DataScope as a sound agent

Does it work on WIN10 X64 ?

Thank you
回復

使用道具 舉報

ID:806701 發表于 2022-4-23 21:13 | 顯示全部樓層
請問可以借鑒下上位機和APP代碼嗎?
回復

使用道具 舉報

ID:228452 發表于 2022-4-24 01:29 | 顯示全部樓層
" Does it work on WIN10 X64 ?"

This program must be run under Win32
found with ultraedit...
回復

使用道具 舉報

ID:474195 發表于 2022-4-28 22:04 | 顯示全部樓層
xzp0630 發表于 2022-4-23 21:13
請問可以借鑒下上位機和APP代碼嗎?

上位機不是 我寫的 你可以用qt做一個
回復

使用道具 舉報

ID:149144 發表于 2022-11-18 15:02 | 顯示全部樓層
好東西,下載完了評論點贊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久出精品 | 激情六月丁香 | h视频网站在线观看 | 黄色毛片免费 | 日韩成人在线免费视频 | 天天综合网天天综合色 | 日韩精品一区在线观看 | 亚洲码欧美码一区二区三区 | 亚洲一区视频 | 亚洲一级淫片 | 日本一区二区视频 | 日韩精品在线观看一区二区 | 99在线免费视频 | 国产一区二区三区四区hd | 欧美福利精品 | 久久精品国产久精国产 | av天天澡天天爽天天av | 亚洲午夜精品一区二区三区他趣 | 91麻豆精品一区二区三区 | 最新中文字幕在线 | 国产真实精品久久二三区 | 欧美黑人狂野猛交老妇 | 午夜成人在线视频 | 一区二区精品 | 欧美日高清视频 | av黄色在线| 国产精品资源在线 | 天天操夜夜操 | 黑人巨大精品 | 亚州午夜精品 | 国产欧美精品一区二区色综合朱莉 | 成人国产精品久久 | av网站在线播放 | 欧美爱爱视频 | 91久久精品国产 | 欧美三级三级三级爽爽爽 | 天天操天天摸天天干 | 日韩欧美在线播放 | 国产99久久 | 国产大片黄色 | 亚洲午夜精品一区二区三区他趣 |