|
|
節(jié)氣門(閉環(huán))電機(jī)PWM調(diào)節(jié),可以采集電壓來調(diào)節(jié)電機(jī)轉(zhuǎn)速,PID控制
- #include <STC12C5A60S2.H>
- #include <intrins.H>
- #define AD_SPEEDHH 0x60 // 0110,0000 90個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define AD_SPEEDH 0x50 // 0100,0000 180個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define AD_SPEEDL 0x20 // 0010,0000 360個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define AD_SPEEDLL 0x00 // 0000,0000 540個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define AD_POWER 0x80 //1000,0000 AD電源
- #define AD_FLAG 0x10 //0001,0000 AD標(biāo)志位
- #define AD_START 0x08 //0000,1000 啟動(dòng)AD轉(zhuǎn)換
- #define AD_CHANNEl 0x07 //0000,0111 AD轉(zhuǎn)換通道選擇
- #define uint unsigned int
- #define uchar unsigned char
- sbit PWM=P2^0;
- bit f1,f2;
- char ZKB;
- uint tb_ad,jqm1_ad,jqm2_ad;
- /*******************************************************
- 延時(shí)程序
- *******************************************************/
- delay(uint ms)
- {
- while(ms--);
- return 0;
- }
- /*******************************************************
- 中斷程序
- *******************************************************/
- void timer0_init() //中斷初始化
- {
- TH0=0xff; //11.0592M晶振,定時(shí)1/60000s
- TL0=0x46; //波形頻率1200Hz
- TMOD=0x01;
- EA=1;
- ET0=1;
- TR0=1;
- }
- timer0() interrupt 1 //定時(shí)0.02ms
- {
- uchar a;
- TH0=0xff; //11.0592M晶振,定時(shí)1/60000s
- TL0=0x80;
- //TL0=0x46; //波形頻率1200Hz
- a+=1;
- if(a>=50) a=0;
- if(a<ZKB) PWM=1;
- else PWM=0;
- }
- /*******************************************************
- AD轉(zhuǎn)換程序
- *******************************************************/
- void ad_init() //AD轉(zhuǎn)換初始化函數(shù)
- {
- ADC_RES = 0; //轉(zhuǎn)換結(jié)果寄存器清空
- ADC_RESL = 0;
- P1ASF=0xff; //P1口作為模擬功能使用
- }
- uint get_AD_res(uchar ch) //AD轉(zhuǎn)換函數(shù)
- {
- ch &= AD_CHANNEl; //選擇轉(zhuǎn)換通道
- ADC_CONTR = AD_POWER|AD_SPEEDHH|ch|AD_START; //1110,1***啟動(dòng)A/D電源、選擇轉(zhuǎn)換速度、選擇通道、啟動(dòng)轉(zhuǎn)換
- _nop_(); //必要的延時(shí),至少四個(gè)空指令
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR&AD_FLAG)); //0001,0000等待轉(zhuǎn)換完成
- ADC_CONTR &= 0xe7; //1110,0111 AD標(biāo)志位清0,關(guān)閉AD轉(zhuǎn)換
- return ADC_RES; //返回 A/D 高 8 位轉(zhuǎn)換結(jié)果
- }
- /*******************************************************
- PID程序
- *******************************************************/
- PID(uint jqm_ad)
- {
- if(tb_ad<55)
- tb_ad=55;
- if((tb_ad-10)<jqm_ad<(tb_ad+10))
- ZKB=tb_ad/4.2;
- if(jqm_ad<(tb_ad-10))
- ZKB=(tb_ad+3*tb_ad-3*jqm_ad)/4.2;
- if(jqm_ad>(tb_ad+10))
- ZKB=(tb_ad+3*tb_ad-3*jqm_ad)/4.2;
- if(ZKB<=0)
- ZKB=0;
- if(ZKB>=50)
- ZKB=50;
- return 0;
- }
- /*******************************************************
- 主函數(shù)
- *******************************************************/
- main()
- {
- P2M1=0X00;
- P2M0=0X01;
- ad_init();
- timer0_init();
- P1=0;
- ZKB=0;
- delay(1000);
- while(1)
- {
- jqm1_ad=get_AD_res(2);
- delay(30);
- jqm2_ad=get_AD_res(0);
- delay(30);
- if((10<jqm1_ad<240)||(10<jqm2_ad<240))
- f1=1;
- else f1=0;
- while(f1)
- {
- jqm1_ad=get_AD_res(2);
- delay(30);
- jqm2_ad=get_AD_res(0);
- delay(30);
- jqm2_ad=250-jqm2_ad;
- tb_ad=get_AD_res(6);
- delay(30);
- if((20<jqm1_ad)&&(jqm1_ad<240))
- {
- f1=1;
- PID(jqm1_ad);
- }
- …………余下代碼請(qǐng)下載附件…………
復(fù)制代碼
完整源碼下載:
pid采集電壓電機(jī)控制.zip
(47.17 KB, 下載次數(shù): 91)
2017-3-20 16:37 上傳
點(diǎn)擊文件名下載附件
|
|