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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4793|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

STM32直流電機(jī)位置PID調(diào)節(jié)程序 上位機(jī)顯示波形,直流電機(jī)位置環(huán)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
其中包含原理圖,pcb,bom表 app 上位機(jī)stm32f103c8t6為主控,app控制顯示波形,上位機(jī)顯示波形,直流電機(jī)位置環(huán)。
位置PID調(diào)節(jié)使用說(shuō)明
簡(jiǎn)介:
應(yīng)用stm32f103c8t6最小系統(tǒng)與雙相編碼器電機(jī)實(shí)現(xiàn)電機(jī)位置pid調(diào)節(jié)。
主要功能:
  •       可使用app進(jìn)行pid參數(shù)與目標(biāo)值的設(shè)定
  •       可使 上位機(jī)顯示pid調(diào)節(jié)過(guò)程的波形
  •       Oled顯示目標(biāo)值,pid值,當(dāng)前值等數(shù)據(jù)
整體結(jié)構(gòu):
使用說(shuō)明:
  • 首先連接電源線連接電腦USB


  •   連接完畢后可見(jiàn)oled顯示如下:
第一行數(shù)據(jù)為目標(biāo)值(初始為10000脈沖的位置);
第二行為目前數(shù)值(初始為10000脈沖的位置故初始電機(jī)不動(dòng)作);

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



STM32單片機(jī)源程序如下:
  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;        //改變倍數(shù)選擇  
  10. u16 Target=30000; //初始化目標(biāo)值
  11. float Kp=120,Ki=0,Kd=360;//pid參數(shù)初始設(shè)定
  12. unsigned char i;          //計(jì)數(shù)變量
  13. unsigned char Send_Count; //串口需要發(fā)送的數(shù)據(jù)個(gè)數(shù)
  14. void gui(void);//oled界面函數(shù)
  15. void blup(void);//上位機(jī)傳輸函數(shù)
  16. void blue_recive(void);//藍(lán)牙接收函數(shù)
  17. int main(void)
  18. {         

  19.         delay_init();                     //延時(shí)函數(shù)初始化         
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷分組
  21.         TIME_init(); //定時(shí)器,定時(shí)中斷初始化
  22.         PWM_init();//pwwm初始化
  23.         usart2_init(115200);//串口2初始化 只用到發(fā)送
  24.         uart_init(9600);//串口1初始化
  25.         LED_Init();  //相關(guān)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調(diào)節(jié)測(cè)試程序ok");
  37.         }
  38. }
  39.   
  40. /************************************************
  41. 名稱(chēng):藍(lán)牙接收程序
  42. 介紹:接收來(lái)自app的串口數(shù)據(jù)
  43. 應(yīng)用:串口1
  44. ************************************************/

  45. void blue_recive()
  46. {      

  47.     if(USART_RX_STA&0x8000)                                             //如果串口有數(shù)據(jù)發(fā)來(lái)
  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發(fā)來(lái)的 tardgt的位置
  52.                                                         if(USART_RX_BUF[0]=='s')  modle=1;//改變倍數(shù)*0.01
  53.                                                         if(USART_RX_BUF[0]=='S')  modle=2;//改變倍數(shù)*0.1
  54.                                                         if(USART_RX_BUF[0]=='M')  modle=3;//改變倍數(shù)*1
  55.                                                         if(USART_RX_BUF[0]=='L')  modle=4; //改變倍數(shù)*10
  56.                                                                                                                                        
  57.                                                         if(USART_RX_BUF[0]=='B')  Target+=2000;  //響應(yīng)正步進(jìn)2000
  58.                                                         if(USART_RX_BUF[0]=='b')  Target-=2000;  //響應(yīng)負(fù)步進(jìn)2000
  59.                                                         
  60.                                                 
  61.                   if(modle==1)//倍數(shù)*0.01
  62.                                                                  {
  63.                                                            if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=0.01;}//如果發(fā)來(lái)的數(shù)據(jù)以p為幀頭則為p的變量以下同理
  64.                                                                   if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=0.01;}//此部分可以用str函數(shù)進(jìn)行                                         
  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)//倍數(shù)*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)//倍數(shù)*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)//倍數(shù)*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;                                       //清除中斷 標(biāo)志位
  98.     }
  99. }

  100. /************************************************
  101. 名稱(chēng):上位機(jī)波形顯示程序
  102. 介紹:向上位機(jī)發(fā)送波形信息
  103. 應(yīng)用:串口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. 名稱(chēng):oled界面程序
  118. 介紹:編輯oled界面提示相關(guān)信息
  119. 應(yīng)用: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. }
復(fù)制代碼

上位機(jī)和app沒(méi)有代碼,只有單片機(jī)有代碼
資料51hei下載地址:
PID演示調(diào)節(jié)資料.7z (12.17 MB, 下載次數(shù): 155)
PID調(diào)節(jié)演示pcb.zip (3.67 MB, 下載次數(shù): 103)

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:812760 發(fā)表于 2021-11-2 11:03 | 只看該作者
樓主想問(wèn)一下,可以實(shí)現(xiàn)精準(zhǔn)控制電機(jī)轉(zhuǎn)動(dòng)角度,或者距離嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:474195 發(fā)表于 2021-12-20 21:14 | 只看該作者
xyw@6 發(fā)表于 2021-11-2 11:03
樓主想問(wèn)一下,可以實(shí)現(xiàn)精準(zhǔn)控制電機(jī)轉(zhuǎn)動(dòng)角度,或者距離嗎

可以的 精度取決于你的負(fù)載和pid參數(shù)
回復(fù)

使用道具 舉報(bào)

地板
ID:228452 發(fā)表于 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
回復(fù)

使用道具 舉報(bào)

5#
ID:806701 發(fā)表于 2022-4-23 21:13 | 只看該作者
請(qǐng)問(wèn)可以借鑒下上位機(jī)和APP代碼嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:228452 發(fā)表于 2022-4-24 01:29 | 只看該作者
" Does it work on WIN10 X64 ?"

This program must be run under Win32
found with ultraedit...
回復(fù)

使用道具 舉報(bào)

7#
ID:474195 發(fā)表于 2022-4-28 22:04 | 只看該作者
xzp0630 發(fā)表于 2022-4-23 21:13
請(qǐng)問(wèn)可以借鑒下上位機(jī)和APP代碼嗎?

上位機(jī)不是 我寫(xiě)的 你可以用qt做一個(gè)
回復(fù)

使用道具 舉報(bào)

8#
ID:149144 發(fā)表于 2022-11-18 15:02 | 只看該作者
好東西,下載完了評(píng)論點(diǎn)贊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一级片一区二区三区 | 最新国产精品精品视频 | 国产日韩欧美在线观看 | 国产激情一区二区三区 | 精品在线一区 | 国产精品99久久久久久www | 国产香蕉视频在线播放 | 看片国产| 人人干人人干人人干 | 国产1区| 国产视频精品在线 | 日韩欧美三级在线 | 久久精品一区 | 中文字幕在线观看日韩 | 一区二区三区免费 | 国产精品久久久久久久久久免费看 | 欧美成人猛片aaaaaaa | 欧美在线一区视频 | 亚洲国产欧美国产综合一区 | 紧缚调教一区二区三区视频 | 欧美日韩综合视频 | 国产一级淫片a直接免费看 免费a网站 | 国产精品久久久久久久久久久久 | 九九热在线视频观看这里只有精品 | 99久久婷婷国产综合精品电影 | 国产精品久久久久久久久久久久 | 香蕉久久a毛片 | 欧美一级艳情片免费观看 | 亚洲一区二区三区免费观看 | 亚洲三区视频 | 欧美阿v| 久久欧美精品 | 色欧美综合| 日韩电影一区二区三区 | 一区二区三区不卡视频 | 国产精品一二区 | 亚洲一区自拍 | 久久一二 | 亚洲综合国产 | 国产色婷婷久久99精品91 | 日韩在线观看一区二区三区 |