欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STM32直流電機位置PID調節程序 上位機顯示波形,直流電機位置環 [打印本頁]

作者: 51小白冬    時間: 2021-8-15 12:31
標題: STM32直流電機位置PID調節程序 上位機顯示波形,直流電機位置環
其中包含原理圖,pcb,bom表 app 上位機stm32f103c8t6為主控,app控制顯示波形,上位機顯示波形,直流電機位置環。
位置PID調節使用說明
簡介:
應用stm32f103c8t6最小系統與雙相編碼器電機實現電機位置pid調節。
主要功能:
整體結構:
使用說明:

第一行數據為目標值(初始為10000脈沖的位置);
第二行為目前數值(初始為10000脈沖的位置故初始電機不動作);

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



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)


作者: xyw@6    時間: 2021-11-2 11:03
樓主想問一下,可以實現精準控制電機轉動角度,或者距離嗎
作者: 51小白冬    時間: 2021-12-20 21:14
xyw@6 發表于 2021-11-2 11:03
樓主想問一下,可以實現精準控制電機轉動角度,或者距離嗎

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

作者: mick32    時間: 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
作者: xzp0630    時間: 2022-4-23 21:13
請問可以借鑒下上位機和APP代碼嗎?
作者: mick32    時間: 2022-4-24 01:29
" Does it work on WIN10 X64 ?"

This program must be run under Win32
found with ultraedit...
作者: 51小白冬    時間: 2022-4-28 22:04
xzp0630 發表于 2022-4-23 21:13
請問可以借鑒下上位機和APP代碼嗎?

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

作者: cuihaodianzi    時間: 2022-11-18 15:02
好東西,下載完了評論點贊




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1