其中包含原理圖,pcb,bom表 app 上位機stm32f103c8t6為主控,app控制顯示波形,上位機顯示波形,直流電機位置環。
位置PID調節使用說明簡介: 應用stm32f103c8t6最小系統與雙相編碼器電機實現電機位置pid調節。 主要功能: - 可使用app進行pid參數與目標值的設定
- 可使 上位機顯示pid調節過程的波形
- Oled顯示目標值,pid值,當前值等數據
整體結構:使用說明:
第一行數據為目標值(初始為10000脈沖的位置); 第二行為目前數值(初始為10000脈沖的位置故初始電機不動作);
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
STM32單片機源程序如下:
- #include "oled.h"
- #include "delay.h"
- #include "sys.h"
- #include "TIME.h"
- #include "usart.h"
- #include "DataScope_DP.h"
- #include "usart2.h"
- #include "string.h"
- u8 modle=3; //改變倍數選擇
- u16 Target=30000; //初始化目標值
- float Kp=120,Ki=0,Kd=360;//pid參數初始設定
- unsigned char i; //計數變量
- unsigned char Send_Count; //串口需要發送的數據個數
- void gui(void);//oled界面函數
- void blup(void);//上位機傳輸函數
- void blue_recive(void);//藍牙接收函數
- int main(void)
- {
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷分組
- TIME_init(); //定時器,定時中斷初始化
- PWM_init();//pwwm初始化
- usart2_init(115200);//串口2初始化 只用到發送
- uart_init(9600);//串口1初始化
- LED_Init(); //相關io初始化
- OLED_Init(); //初始化OLED
- OLED_Refresh_Gram(); //更新顯示到OLED
-
- while(1)
- {
- gui();
- blup();
- blue_recive();
- delay_ms(70);
- printf("%d",((int)((TIM2->CNT)*0.02)));
- //printf("PID調節測試程序ok");
- }
- }
-
- /************************************************
- 名稱:藍牙接收程序
- 介紹:接收來自app的串口數據
- 應用:串口1
- ************************************************/
- void blue_recive()
- {
-
- if(USART_RX_STA&0x8000) //如果串口有數據發來
- {
-
- if(USART_RX_BUF[0]=='T') {Target=(USART_RX_BUF[1]-'0')*10000+(USART_RX_BUF[2]-'0')*1000+
- (USART_RX_BUF[3]-'0')*100+(USART_RX_BUF[4]-'0')*10+(USART_RX_BUF[5]-'0')*1;} //解碼app發來的 tardgt的位置
- if(USART_RX_BUF[0]=='s') modle=1;//改變倍數*0.01
- if(USART_RX_BUF[0]=='S') modle=2;//改變倍數*0.1
- if(USART_RX_BUF[0]=='M') modle=3;//改變倍數*1
- if(USART_RX_BUF[0]=='L') modle=4; //改變倍數*10
-
- if(USART_RX_BUF[0]=='B') Target+=2000; //響應正步進2000
- if(USART_RX_BUF[0]=='b') Target-=2000; //響應負步進2000
-
-
- if(modle==1)//倍數*0.01
- {
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=0.01;}//如果發來的數據以p為幀頭則為p的變量以下同理
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=0.01;}//此部分可以用str函數進行
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=0.01;}
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=0.01;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=0.01;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=0.01;}
- }
- if(modle==2)//倍數*0.1
- {
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=0.1;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=0.1;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=0.1;}
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=0.1;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=0.1;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=0.1;}
- }
- if(modle==3)//倍數*1
- {
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=1;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=1;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=1;}
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=1;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=1;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=1;}
- }
- if(modle==4)//倍數*10
- {
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=10;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=10;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='+') {Kd+=10;}
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='-') {Kp-=10;}
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='-') {Ki-=10;}
- if(USART_RX_BUF[0]=='D'&USART_RX_BUF[1]=='-') {Kd-=10;}
- }
- USART_RX_STA=0; //清除中斷 標志位
- }
- }
- /************************************************
- 名稱:上位機波形顯示程序
- 介紹:向上位機發送波形信息
- 應用:串口2
- ************************************************/
- void blup(void)
- {
- DataScope_Get_Channel_Data(TIM2->CNT, 1 );
- DataScope_Get_Channel_Data(Target, 2 );
- Send_Count = DataScope_Data_Generate(2);
- for( i = 0 ; i < Send_Count; i++)
- {
- while((USART2->SR&0X40)==0);
- USART2->DR = DataScope_OutPut_Buffer[i];
- }
- }
- /************************************************
- 名稱:oled界面程序
- 介紹:編輯oled界面提示相關信息
- 應用:spi通訊
- ************************************************/
- void gui(void)
- {
- OLED_ShowString(0,0,"Target:",12);
- OLED_ShowNum(48,0,Target,5,12);
-
- OLED_ShowString(0,16,"CNT:",12);
- OLED_ShowNum(48,16,TIM2->CNT,5,12);
-
- OLED_ShowString(0,32,"PWM:",12);
- OLED_ShowNum(42,32,PWMA,4,12);
- OLED_ShowString(66,32,"/7100",12);
-
- OLED_ShowString(0,46,"Kp:",12); OLED_ShowNum(15,46,Kp,3,12);
- OLED_ShowString(50,46,"Ki:",12); OLED_ShowNum(66,46,Ki*100,2,12);
- OLED_ShowString(90,46,"Kd:",12); OLED_ShowNum(108,46,Kd,3,12);
- if(modle==1) OLED_ShowString(100,16,"s",12);
- if(modle==2) OLED_ShowString(100,16,"S",12);
- if(modle==3) OLED_ShowString(100,16,"M",12);
- if(modle==4) OLED_ShowString(100,16,"L",12);
- OLED_Refresh_Gram(); //更新顯示到OLED
- }
復制代碼
上位機和app沒有代碼,只有單片機有代碼
資料51hei下載地址:
PID演示調節資料.7z
(12.17 MB, 下載次數: 155)
2021-8-15 15:42 上傳
點擊文件名下載附件
PID調節演示pcb.zip
(3.67 MB, 下載次數: 103)
2021-8-15 12:30 上傳
點擊文件名下載附件
|