其中包含原理图,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, 下载次数: 154)
|