電機調速及測速程序電路圖
P1排針
VCC接A或者接B,可以實現正傳和反轉。
OUT脈沖輸出端,用于單片機測速。
電路原理圖如下:
0.png (50.25 KB, 下載次數: 24)
下載附件
2018-7-18 03:07 上傳
單片機源程序如下:
- /*--------------------------------------------------*/
- /*STC12C5A60S2 1T 系列單片機------------------------*/
- /*SYSCLK:22.1184M----------------------------------*/
- /*--------------------------------------------------*/
- #include <reg52.h>
- #include <stdio.h>
- #include <intrins.h>
- #include"pwm.h"
- #include"motor_ctr.h"
- #include"lcd1602.h"
- #include"timer.h"
- sbit IR=P3^3; //紅外接口標志
- /*------------------------------------------------
- 全局變量聲明
- ------------------------------------------------*/
- unsigned char irtime;//紅外用全局變量
- bit irpro_ok,irok;
- int cs = 0;
- unsigned char IRcord[4];
- unsigned char irdata[33];
- unsigned int FinalData = 0;
- unsigned int TempRecData[5]={0};
- unsigned char TempData[16];
- int i=0;
- int ddata=5000;
- int xdata e=0,e1=0,e2=0;
- float xdata uk=0,uk1=0,duk=0;
- float xdata kp=4,ki=1.2,kd=0.8;
- int xdata out;
- /*------------------------------------------------
- 函數聲明
- ------------------------------------------------*/
- void Ircordpro(void);
- /*------------------------------------------------
- 定時器0中斷處理
- ------------------------------------------------*/
- void tim1_isr () interrupt 3
- {
- irtime++; //用于計數2個下降沿之間的時間
- }
- /*------------------------------------------------
- 外部中斷0中斷處理
- ------------------------------------------------*/
- void EX1_ISR (void) interrupt 2 //外部中斷1服務函數
- {
- static unsigned char i; //接收紅外信號處理
- static bit startflag; //是否開始處理標志位
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
- /*------------------------------------------------
- 定時器0初始化
- ------------------------------------------------*/
- void TIM1init(void)//定時器0初始化
- {
- TMOD=0x22;//定時器0工作方式2,TH0是重裝值,TL0是初值
- TH1=0x00; //重載值
- TL1=0x00; //初始化值
- ET1=1; //開中斷
- TR1=1;
- }
- /*------------------------------------------------
- 外部中斷0初始化
- ------------------------------------------------*/
- void EX1init(void)
- {
- IT1 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
- EX1 = 1; //使能外部中斷
- EA = 1; //開總中斷
- }
- /*------------------------------------------------
- 鍵值處理
- ------------------------------------------------*/
- void Ir_work(void)
- {
- int Findata=0;
- int flag=0;
- if(IRcord[2]==0x16)
- {
- Findata=0;
- }
- if(IRcord[2]==0x0c)
- {
- Findata=1;
- }
- if(IRcord[2]==0x18)
- {
- Findata=2;
- }
- if(IRcord[2]==0x5e)
- {
- Findata=3;
- }
- if(IRcord[2]==0x08)
- {
- Findata=4;
- }
- if(IRcord[2]==0x1c)
- {
- Findata=5;
- }
- if(IRcord[2]==0x5a)
- {
- Findata=6;
- }
- if(IRcord[2]==0x42)
- {
- Findata=7;
- }
- if(IRcord[2]==0x52)
- {
- Findata=8;
- }
- if(IRcord[2]==0x4a)
- {
- Findata=9;
- }
- if(IRcord[2]==0x09)//確認信號
- {
- Findata=66;
- flag=1;
- }
- if(IRcord[2]==0x43)//暫停信號
- {
- Findata=55;
- flag=3;
- }
- if(flag==0)
- {
- TempRecData[i] = Findata;
- i++;
- }
- if(flag==3)
- {
- flag=0;
- cs++;
- if(cs==1)
- {
- START_F = 0;
- MOTOR_STOP; //快速制動
- }
- if(cs==2)
- {
- cs=0;
- PWM_EN; // 啟動
- START_F = 1;
- }
- }
- irpro_ok=0;//處理完成標志
- if(flag==1)
- {
- flag=0;
- if(i==5&&TempRecData[0]>2)
- {
- TempRecData[0]=1;
- TempRecData[1]=0;
- TempRecData[2]=0;
- TempRecData[3]=0;
- TempRecData[4]=0;
- }
- switch(i)
- {
- case 0:FinalData = 6000;break;
- case 1:FinalData = TempRecData[0];break;
- case 2:FinalData =TempRecData[0]*10+TempRecData[1];break;
- case 3:FinalData =TempRecData[0]*100+TempRecData[1]*10+TempRecData[2];break;
- case 4:FinalData =TempRecData[0]*1000+TempRecData[1]*100+TempRecData[2]*10+TempRecData[3];break;
- case 5:FinalData =TempRecData[0]*10000+TempRecData[1]*1000+TempRecData[2]*100+TempRecData[3]*10+TempRecData[4];break;
- default:break;
- }
- ddata= FinalData;
- i=0;
- TempRecData[0]=0;
- TempRecData[1]=0;
- TempRecData[2]=0;
- TempRecData[3]=0;
- TempRecData[4]=0;
- }
- if(i==6)
- {
- i=0;
- }
- }
- /*------------------------------------------------
- 紅外碼值處理
- ------------------------------------------------*/
- void Ircordpro(void)//紅外碼值處理函數
- {
- unsigned char i, j, k;
- unsigned char cord,value;
- k=1;
- for(i=0;i<4;i++) //處理4個字節
- {
- for(j=1;j<=8;j++) //處理1個字節8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
- value|=0x80;
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//處理完畢標志位置1
- }
- /************************************************************************/
- //10ms處理程序
- /************************************************************************/
- void DS10MS_CNT(void)
- {
- if( JS10MS_F ) //10ms到
- {
- JS10MS_F = 0;//標志位清零
- Key(); //按鍵掃描
- }
- }
- /************************************************************************/
- //10ms處理程序
- /************************************************************************/
- void DS50MS_CNT(void)
- {
- if( JS50MS_F ) //10ms到
- {
- JS50MS_F = 0; //標志位清零
- pca_pro(); //轉速處理
- PID_Adjust(); //PID調節
- }
- }
- /************************************************************************/
- //100ms處理程序
- /************************************************************************/
- void DS100MS_CNT(void)
- {
- if(JS100MS_F)//200ms到
- {
- JS100MS_F = 0;
- Key_symbol_process(); //按鍵處理
- }
- }
- /****************************************************/
- //1000ms處理程序
- /***************************************************/
- void DS1MIN_CNT(void)
- {
- if(JS1MIN_F) //1000ms到
- {
- JS1MIN_F = 0; //標志位清零
- //Data_Display(); //更新數據顯示
- }
- }
- ////////////////////////主函數///////////////////////
- void main()
- {
-
- PWM_Init(); //PWM初始化
- Motor_Ctr_Int(); //控制初始化
- lcd_init(); //160液晶初始化
- Timer0_Init();
- EX1init(); //初始化外部中斷
- TIM1init(); //初始化定時器
- EA = 1;//開總中斷
- DIR=!DIR;
- PWM_EN; // 啟動
- START_F = 1;
- while (1)
- {
-
- DS10MS_CNT();
- DS50MS_CNT();
- DS100MS_CNT();
- DS1MIN_CNT();
- if(irok) //如果接收好了進行紅外處理
- {
- Ircordpro();
- irok=0;
- }
- if(irpro_ok) //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
- {
- Ir_work();
- }
- e = ddata - rpm;
- duk = (kp*(e-e1)+ki*e+kd*(e-2*e1+e2))/100;
- uk = uk1+duk;
- out = (int)uk;
- if(out>250)
- {
- out = 250;
- }
- if(out<1)
- {
- out = 0;
- }
-
- uk1 = uk;
- e2=e1;
- e1=e;
- PWM0_TEMP = out;
- }
- }
復制代碼
0.png (41.76 KB, 下載次數: 27)
下載附件
2018-7-18 03:09 上傳
所有資料51hei提供下載:
電機.rar
(7.1 MB, 下載次數: 32)
2018-7-17 20:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|