PWM直流電機(jī)調(diào)速單片機(jī)程序_第1頁
PWM直流電機(jī)調(diào)速單片機(jī)程序_第2頁
PWM直流電機(jī)調(diào)速單片機(jī)程序_第3頁
PWM直流電機(jī)調(diào)速單片機(jī)程序_第4頁
PWM直流電機(jī)調(diào)速單片機(jī)程序_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、*/* 程序名:PWM直流電機(jī)調(diào)速 */* 晶振:11.00592 MHz CPU型號(hào):AT89C51 */* 直流電機(jī)的PWM波控制,可以直接的調(diào)速?gòu)?到20級(jí)的調(diào)速 */*/ #include#define TH0_TL0 (65536-1000)/設(shè)定中斷的間隔時(shí)長(zhǎng)unsigned char count0 = 50;/低電平的占空比unsigned char count1 = 0;/高電平的占空比bit Flag = 1;/電機(jī)正反轉(zhuǎn)標(biāo)志位,1正轉(zhuǎn),0反轉(zhuǎn)sbit Key_add=P2 0; /電機(jī)減速sbit Key_dec=P2 1; /電機(jī)加速sbit Key_turn=P2 2;

2、 /電機(jī)換向sbit PWM1=P26;/PWM 通道 1,反轉(zhuǎn)脈沖sbit PWM2=P27;/PWM 通道 2,正轉(zhuǎn)脈沖unsigned char Time_delay;/*函數(shù)聲明*/void Delay(unsigned char x);void Motor_speed_high(void);void Motor_speed_low(void);void Motor_turn(void);void Timer0_init(void);/*延時(shí)處理*/void Delay(unsigned char x)Time_delay = x;while(Time_delay != 0);/等待中

3、斷,可減少PWM輸出時(shí)間間隔/*按鍵處理加pwm占空比,電機(jī)加速*/void Motor_speed_high(void)/if(Key_add=0) Delay(10); if(Key_add=0) count0 += 5; if(count0 = 100) count0 = 100; while(!Key_add);/等待鍵松開/*按鍵處理減pwm占空比,電機(jī)減速*/void Motor_speed_low(void)if(Key_dec=0) Delay(10); if(Key_dec=0) count0 -= 5; if(count0 = 0) count0 = 0; while(!K

4、ey_dec ); /*電機(jī)正反向控制*/void Motor_turn(void)if(Key_turn = 0) Delay(10); if(Key_turn = 0) Flag = Flag; while(!Key_turn);/*定時(shí)器0初始化*/void Timer0_init(void)TMOD=0x01; /定時(shí)器0工作于方式1TH0=TH0_TL0/256;TL0=TH0_TL0%256;TR0=1;ET0=1;EA=1;/*主函數(shù)*/void main(void)Timer0_init();while(1) Motor_turn(); Motor_speed_high();

5、Motor_speed_low();/*定時(shí)0中斷處理*/void Timer0_int(void) interrupt 1 using 1TR0 = 0;/設(shè)置定時(shí)器初值期間,關(guān)閉定時(shí)器TL0 = TH0_TL0 % 256;TH0 = TH0_TL0 / 256 ;/定時(shí)器裝初值TR0 = 1;if(Time_delay != 0)/延時(shí)函數(shù)用 Time_delay-; if(Flag = 1)/電機(jī)正轉(zhuǎn) PWM1 = 0; if(+count1 = 100) count1=0; else /電機(jī)反轉(zhuǎn) PWM2 = 0; if(+count1 = 100) count1=0; /-#inc

6、lude / SFR declarations#include / Function Prototypes/-#define CMD_RESET 0xA4 /HD7279復(fù)位#define DECODE1 0xc8 /方式0譯碼sbit cs=P13;sbit clk=P12;sbit dat=P11;sbit key=P10;sbit led_D1003=P07;sbit sw1=P17;sbit sw2=P16;sbit sw3=P15;sbit sw4=P14;void long_delay(void); /延時(shí)函數(shù)void short_delay(void);void delay10m

7、s(unsigned char);void write7279(unsigned char,unsigned char); /HD7279寫指令void send_byte(unsigned char); void delay(unsigned char);void disp1(unsigned int);void OSCILLATOR_Init (void);void PORT_Init (void);void PCA0_Init (void); void Timer0_Init(void); void Ext_Interrupt_Init (void);/-/ Global Variabl

8、es/-/-/ main() Routine/-unsigned int CEX0_Compare_Value; / Holds current PCA compare valueunsigned int tmr,Speed_evaluate; unsigned char num,num1,num2,num3,a;unsigned int Speed,pi,Speed2; unsigned int Speed110; typedef struct double SetPoint; /* 設(shè)定目標(biāo)Desired Value */ double Proportion; /* 比例常數(shù)Proport

9、ional Const */ double Integral; /* 積分常數(shù)Integral Const */ double Derivative; /* 微分常數(shù) Derivative Const */ double LastError; /* 前一項(xiàng)誤差*/ double PrevError; /* 前第二項(xiàng)誤差*/ double SumError; /* 誤差和*/ PID; double PIDCalc( PID *pp, double NextPoint ) double dError,Error,Pout; Error = pp-SetPoint - NextPoint; /*

10、? */ pp-SumError += Error; /* ?/ dError = pp-LastError - pp-PrevError; /* ? */ pp-PrevError = pp-LastError; pp-LastError = Error; /* ? */ Pout= pp-Proportion * Error + pp-Integral * pp-SumError + pp-Derivative * dError ; if(Pout1100) Pout=1000; if(Pout100) Pout=100; return (Pout); PID sPID; /定義PID結(jié)構(gòu)

11、體變量 double rOut; /PID響應(yīng)輸出 unsigned char rIn; /設(shè)置PID反饋值 double x; double sumout; unsigned char dd; /設(shè)置PID輸出 void main (void) sPID.Proportion = 0.44; /設(shè)置P sPID.Integral = 0.70; /設(shè)置I sPID.Derivative = 0.0; /設(shè)置D /sPID.SetPoint = CEX0_Compare_Value; /sPID.SetPoint = CEX0_Compare_Value; /設(shè)置PID輸出 PCA0MD =

12、0x00; / Disable watchdog timer led_D1003=0; PORT_Init (); / Initialize crossbar and GPIO OSCILLATOR_Init (); / Initialize oscillator PCA0_Init (); / Initialize PCA0 IP=0x82; /定時(shí)器中斷0高于外部中斷0 Timer0_Init(); Ext_Interrupt_Init (); for (tmr=0;tmr8; EIE1 |= 0x10; / Enable PCA interrupts / Start PCA counte

13、r CR = 1; void Ext_Interrupt_Init (void) TCON |= 0x05; / /INT 0 and /INT 1 are edge triggered IT01CF = 0x10; / /INT0 active low; /INT0 on P0.0; / /INT1 active low; /INT1 on P0.1 EX0 = 1; / Enable /INT0 interrupts void Timer0_Init(void) TH0 = 0 ; / Init Timer0 High register TL0 = 0 ; / Init Timer0 Lo

14、w register TMOD |= 0x01; / Timer0 in 16-bit mode方式1 CKCON |= 0x02; / Timer0 uses a 1:48 prescaler ET0 = 1; / Timer0 interrupt enabled TCON|=0x10;/ Timer0 ON / PCA0_ISR/-void PCA0_ISR (void) interrupt 11 CCF0 = 0; / Clear module 0 interrupt flag. PCA0CPL0 = (CEX0_Compare_Value & 0x00FF); PCA0CPH0 = (

15、CEX0_Compare_Value & 0xFF00)8;void Timer0_ISR (void) interrupt 1 int j,sum; TF0=0; / Clear interrupt flag.a+;if (a=4) Speed1pi=Speed; if(pi=3) EX0 = 0; for(j=0;j=3) pi=0; else pi+; TH0 = 0; / Reinit Timer0 High register TL0 = 0; / Reinit Timer0 Low registerif(abs(sPID.SetPoint-Speed2)=5) CEX0_Compar

16、e_Value=CEX0_Compare_Value; else rIn =Speed2; for(dd=0;dd50;dd+) x=rIn; /x = 5.0 * (double)rIn / 256.0; rOut = PIDCalc ( &sPID,x ); / sumout=rOut*256/5; if(rOut=100)sumout=0;else sumout= (0.85/1000.0)*rOut; /CEX0_Compare_Value=CEX0_Compare_Value-sumout;CEX0_Compare_Value = 65536 - (65536 * ( sumout+

17、0.15); else TH0 = 0; / Reinit Timer0 High register TL0 = 0; / Reinit Timer0 Low register void INT0_ISR (void) interrupt 0 IE0=0; / / Clear interrupt flag. Speed+; void write7279(unsigned char cmd, unsigned char dta) send_byte(cmd); send_byte(dta); void send_byte( unsigned char out_byte) unsigned cha

18、r i; cs=0; long_delay(); for (i=0;i8;i+) if (out_byte&0x80) dat=1; else dat=0; clk=1; short_delay(); clk=0; short_delay(); out_byte=out_byte*2; dat=0;void long_delay(void) unsigned char i; for (i=0;i0x30;i+);void short_delay(void) unsigned char i; for (i=0;i8;i+);void delay10ms(unsigned char time) unsigned char i; unsigned int j; for (i=0;itime;i+) for (j=0;j0x390;j+); void disp1(unsigned int d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論