其中包含原理圖,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ō)明:
第一行數(shù)據(jù)為目標(biāo)值(初始為10000脈沖的位置); 第二行為目前數(shù)值(初始為10000脈沖的位置故初始電機(jī)不動(dòng)作);
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (219.56 KB, 下載次數(shù): 105)
下載附件
2021-8-15 15:30 上傳
51hei.png (43.99 KB, 下載次數(shù): 100)
下載附件
2021-8-15 15:29 上傳
51hei.png (17.66 KB, 下載次數(shù): 84)
下載附件
2021-8-15 15:32 上傳
51hei.png (5.7 KB, 下載次數(shù): 89)
下載附件
2021-8-15 15:32 上傳
51hei.png (6.81 KB, 下載次數(shù): 84)
下載附件
2021-8-15 15:32 上傳
STM32單片機(jī)源程序如下:
- #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; //改變倍數(shù)選擇
- u16 Target=30000; //初始化目標(biāo)值
- float Kp=120,Ki=0,Kd=360;//pid參數(shù)初始設(shè)定
- unsigned char i; //計(jì)數(shù)變量
- unsigned char Send_Count; //串口需要發(fā)送的數(shù)據(jù)個(gè)數(shù)
- void gui(void);//oled界面函數(shù)
- void blup(void);//上位機(jī)傳輸函數(shù)
- void blue_recive(void);//藍(lán)牙接收函數(shù)
- int main(void)
- {
- delay_init(); //延時(shí)函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷分組
- TIME_init(); //定時(shí)器,定時(shí)中斷初始化
- PWM_init();//pwwm初始化
- usart2_init(115200);//串口2初始化 只用到發(fā)送
- uart_init(9600);//串口1初始化
- LED_Init(); //相關(guān)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調(diào)節(jié)測(cè)試程序ok");
- }
- }
-
- /************************************************
- 名稱(chēng):藍(lán)牙接收程序
- 介紹:接收來(lái)自app的串口數(shù)據(jù)
- 應(yīng)用:串口1
- ************************************************/
- void blue_recive()
- {
-
- if(USART_RX_STA&0x8000) //如果串口有數(shù)據(jù)發(fā)來(lái)
- {
-
- 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發(fā)來(lái)的 tardgt的位置
- if(USART_RX_BUF[0]=='s') modle=1;//改變倍數(shù)*0.01
- if(USART_RX_BUF[0]=='S') modle=2;//改變倍數(shù)*0.1
- if(USART_RX_BUF[0]=='M') modle=3;//改變倍數(shù)*1
- if(USART_RX_BUF[0]=='L') modle=4; //改變倍數(shù)*10
-
- if(USART_RX_BUF[0]=='B') Target+=2000; //響應(yīng)正步進(jìn)2000
- if(USART_RX_BUF[0]=='b') Target-=2000; //響應(yīng)負(fù)步進(jìn)2000
-
-
- if(modle==1)//倍數(shù)*0.01
- {
- if(USART_RX_BUF[0]=='P'&USART_RX_BUF[1]=='+') {Kp+=0.01;}//如果發(fā)來(lái)的數(shù)據(jù)以p為幀頭則為p的變量以下同理
- if(USART_RX_BUF[0]=='I'&USART_RX_BUF[1]=='+') {Ki+=0.01;}//此部分可以用str函數(shù)進(jìn)行
- 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)//倍數(shù)*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)//倍數(shù)*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)//倍數(shù)*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; //清除中斷 標(biāo)志位
- }
- }
- /************************************************
- 名稱(chēng):上位機(jī)波形顯示程序
- 介紹:向上位機(jī)發(fā)送波形信息
- 應(yīng)用:串口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];
- }
- }
- /************************************************
- 名稱(chēng):oled界面程序
- 介紹:編輯oled界面提示相關(guān)信息
- 應(yīng)用: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
- }
復(fù)制代碼
上位機(jī)和app沒(méi)有代碼,只有單片機(jī)有代碼
資料51hei下載地址:
PID演示調(diào)節(jié)資料.7z
(12.17 MB, 下載次數(shù): 155)
2021-8-15 15:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
PID調(diào)節(jié)演示pcb.zip
(3.67 MB, 下載次數(shù): 103)
2021-8-15 12:30 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|