設計內容及要求 | 內容包括: 1. 查找文獻資料,學習直流電機控制的工作原理; 2. 轉速控制系統(tǒng)方案設計 3. 硬件電路設計,繪制電路原理圖和PCB圖; 4. 設計軟件,并調試 5. 綜合調試,測試、分析誤差原因 6. 撰寫設計報告 要求: 1.矩陣鍵盤設定并顯示轉速,實時顯示實際轉速 2.按鍵控制電機起停、正反轉 3.PWM轉速閉環(huán)控制。
4.用lcd12864液晶屏顯示相關內容
| | 1.轉速調節(jié)范圍:1500轉/分--3000轉/分 2.測速誤差<10%
|
制作完成的pid直流電機轉速控制系統(tǒng)實物圖:
1525256719368.jpeg (390.97 KB, 下載次數: 214)
下載附件
2018-5-2 18:26 上傳
1525256734650.jpeg (395.49 KB, 下載次數: 193)
下載附件
2018-5-2 18:26 上傳
51單片機源程序如下:
- #include<reg51.h>
- #include "intrins.h"
- #include <lcd.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define GPIO_KEY P2
- sbit PWM=P1^4;
- sbit P10=P1^0;
- sbit P12=P1^2;
- uchar speed1[4]={"0000"};//設定轉速
- uchar speed2[3]={"000"};//占空比
- uchar speed[]={"0000"};//當前轉速
- uchar KeyValue=0;
- uint AA,count=0,flag;
- float pid_p=0.003,pid_i=0.003,pid_d=0.002; //PID三個參數 初值
- uint SpeedSet=3000,CurrentSpeed;//設定轉速 當前轉速
- unsigned char pid_val_mid;//pid_val_mid脈沖寬度
- unsigned int lastError=0;
- long int sumError=0;//sum偏差和
-
-
- void delay1(unsigned int i)
- {
- unsigned int j;
- for(;i>0;i--)
- for(j=0;j<333;j++)
- {;}
- }
- /********************* 鍵盤掃描*************/
- void KeyDown(void)
- {
- GPIO_KEY=0x0f;
- delay1(10);
- if(GPIO_KEY!=0x0f)
- {
- delay1(10);
- if(GPIO_KEY!=0x0f)
- {
- //測試列
- GPIO_KEY=0X0F;
- delay1(10);
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=1;break;
- case(0X0d): KeyValue=2;break;
- case(0X0e): KeyValue=3;break;
- }
- //測試行
- GPIO_KEY=0XF0;
- delay1(10);
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue+4;break;
- case(0Xd0): KeyValue=KeyValue+8;break;
- case(0Xe0): KeyValue=KeyValue+12;break;
- }
-
- }
- }
- }
- void timer()
- {
-
- TMOD=0x11;//定時器0工作方式1.16位,定時器1工作方式1,16位定時;
- TH0=0x4b;//50ms初值
- TL0=0xfe;
-
- TH1=0xfc;//1msPWM控制
- TL1=0x66;
-
- TR1=1; //啟動定時器1
- ET1=1; //定時器1中斷使能
- IT0=1;//外部中斷下降沿觸發(fā)
- TR0=1; //定時器啟動標志
- ET0=1; //定時器中斷使能
- EX0=1; //外部中斷使能
- EA=1; //全局中斷
- }
- /***********************lcd顯示*************/
- void display()
- {
-
- speed[0]=CurrentSpeed/1000+0x30; //當前轉速
- speed[1]=CurrentSpeed/100%10+0x30;
- speed[2]=CurrentSpeed/10%10+0x30;
- speed[3]=CurrentSpeed%10+0x30;
-
-
- speed1[0]=SpeedSet/1000+0x30;//設定轉速
- speed1[1]=SpeedSet/100%10+0x30;
- speed1[2]=SpeedSet/10%10+0x30;
- speed1[3]=SpeedSet%10+0x30;
-
- speed2[0]=pid_val_mid/100+0x30;
- speed2[1]=pid_val_mid/10%10+0x30;//占空比
- speed2[2]=pid_val_mid%10+0x30;
-
-
- DispHanzi(0,0,5,"當前轉速:");
- DispZimu(0,5,4,speed);
- DispHanzi(1,0,5,"設定轉速:");
- DispZimu(1,5,4,speed1);
- DispHanzi(3,0,4,"占空比:");//占空比
- DispZimu(3,4,3,speed2);
- DispHanzi(3,6,1,"%");//占空比
-
- }
- /************************電機控制*************/
- void keyKZ()
- {
- if(KeyValue==4)//正轉
- {
- P10=1;
- P12=0;
- }
- if(KeyValue==5)//反轉
- {
- P10=0;
- P12=1;
- }
- if(KeyValue==6)//停車
- {
- P10=0;
- P12=0;
- }
-
- if(KeyValue==12)//設定速度加50
- SpeedSet+=50;
- if(KeyValue==13)//設定速度減50
- SpeedSet-=50;
- if(KeyValue==14)//設定速度加1
- SpeedSet+=1;
- if(KeyValue==15)//設定速度減1
- SpeedSet-=1;
- KeyValue=0;
-
- }
- /************************PID控制算法*************/
- unsigned int PID()
- {
- int dError=0,Error=0,B;
-
- Error=SpeedSet-CurrentSpeed;//當前誤差
- sumError=Error+sumError;//誤差和
- dError=Error-lastError;//誤差偏差
- lastError=Error;
- B=pid_p*Error+pid_i*sumError+pid_d*dError;
-
- if(B>100) pid_val_mid=100;
- if(B<0) pid_val_mid=0;
- if(B>=0&&B<=100)
- pid_val_mid=B;
- return(0);
- }
- void Timer0_isr() interrupt 1 //定時器0中斷
- {
- AA++;
- TH0=0x4b;
- TL0=0xfe;
- if(AA==20)
- {
- CurrentSpeed=count*3;//一分鐘的轉速
- count=0;
- AA=0;
- PID();
- }
- }
- void key_int() interrupt 0 //外部中斷P32口
- {
- count++;
- }
- void Timer1() interrupt 3
- {
- static int c=0;
- TH1=0xfc;
- TL1=0x66;
- c++; //每次定時器溢出加1
-
- if(c<=pid_val_mid) PWM=1;
-
- if(c>pid_val_mid) PWM=0;
-
- if(c>=100) c=0;
- }
-
- void main()
- {
- timer();//定時器初始化
- InitLCD();//LCD初始化
- while(1)
- {
- KeyDown(); //鍵盤掃描
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (48.8 KB, 下載次數: 232)
下載附件
2018-5-2 18:41 上傳
所有資料51hei提供下載:
51單片機電機控速.zip
(41.03 KB, 下載次數: 1826)
2018-5-2 18:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|