www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]#i nclude#i nclude//電動車雙閉環(huán)程序,采用雙閉環(huán)方式控制電機(jī),以得到最好的zh轉(zhuǎn)速性能,并且可以//限制電機(jī)的最大電流。本應(yīng)用程序用到兩個CCP部件,其中CCP1用于PWM輸出,以控//制電機(jī)電壓;CCP2用于觸發(fā)AD,定

#i nclude

#i nclude

//電動車雙閉環(huán)程序,采用雙閉環(huán)方式控制電機(jī),以得到最好的zh轉(zhuǎn)速性能,并且可以

//限制電機(jī)的最大電流。本應(yīng)用程序用到兩個CCP部件,其中CCP1用于PWM輸出,以控

//制電機(jī)電壓;CCP2用于觸發(fā)AD,定時器TMR2、TMR1,INT中斷,RB口電平變化中斷,

//看門狗以及6個通用I/O口

#define AND 0xe0 //狀態(tài)采集5,6,7位

#define CURA 0X0a //電流環(huán)比例和積分系數(shù)之和

#define CURB 0X09 //電流環(huán)比例系數(shù)

#define THL 0X6400 //電流環(huán)最大輸出

#define FULLDUTY 0X0FF //占空比為1時的高電平時間

#define SPEA 0X1d //轉(zhuǎn)速環(huán)比例和積分系數(shù)之和

#define SPEB 0X1c //轉(zhuǎn)速環(huán)比例系數(shù)

#define GCURHILO 0X0330 //轉(zhuǎn)速環(huán)最大輸出

#define GCURH 0X33 //最大給定電流

#define GSPEH 0X67 //最大轉(zhuǎn)速給定

#define TSON 0X38 //手柄開啟電壓1.1 V,TSON*2為剎車后手柄開啟電壓,即

//2.2 V

#define VOLON 0X4c //低電壓保護(hù)重開電壓3.0 V即33 V

#define VOLOFF 0X49 //低電壓保護(hù)關(guān)斷電壓2.86 V即31.5 V

volatile unsigned char DELAYH,DELAYL,oldstate,speed,

speedcount,tsh,count_ts,count_vol,gcur,currenth,

voltage; //寄存器定義

static bit sp1,spe,ts,volflag,spepid,lowpower,

off,shutdown,curpid; //標(biāo)志位定義

static volatile unsigned char new[10]={0xaf,0xbe,0xff,0x7e,0xcf,

0xff,0xd7,0x77,0xff,0xff}; //狀態(tài)寄存器表

//------------PIC16F877初始化子程序------------

void INIT877()

{

PORTC=0X0FF; //關(guān)斷所有MOSFET

TRISC=0X02; //設(shè)置C口輸出

PIE1=0X00; //中斷寄存器初始化,關(guān)斷所有中斷

TRISA=0XCF; //設(shè)置RA4,RA5 輸出

TRISB=0XEF; //RB 口高三位輸入,采集電機(jī)三相的霍爾信號

PORTC=new[(PORTB&AND)>>5];//采集第一次霍爾信號,并輸出相應(yīng)的信號,導(dǎo)通

//兩個MOS管

T2CON=0X01; //TMR2 4分頻

CCPR1L=0X0FF; //初始時PWM輸出全高

CCP1CON=0X0FF; //CCP1設(shè)置為PWM方式

CCP2CON=0X0B; //CCP2設(shè)置為特殊方式,以觸發(fā)AD

ADCON0=0X81; //AD時鐘為32分頻,且AD使能,選擇AN0通道采集手

//柄電壓

TMR2=0X00; //TMR2寄存器初始化

TMR1H=0X00; //TMR1寄存器初始化

TMR1L=0X00;

T1CON=0X00; //TMR1為

CCPR2H=0X08;

CCPR2L=0X00; //電流采樣周期設(shè)置為TAD=512 μs

PR2=0XC7; //PWM頻率設(shè)置為5 kHz

ADCON1=0X02; //AD結(jié)果左移

OPTION=0XFB; //INT上升沿觸發(fā)

TMR2ON=1; //PWM開始工作

INTCON=0XD8; //中斷設(shè)置GIE=1,PEIE=1,RBIE=1

ADIE=1; //AD中斷使能

speedcount=0x00; //轉(zhuǎn)速計數(shù)寄存器

speed=0x7f; //轉(zhuǎn)速保持寄存器

spe=1; //低速標(biāo)志位

sp1=1; //低速標(biāo)志位

oldstate=0x0ff; //初始狀態(tài)設(shè)置,區(qū)別于其他狀態(tài)

count_ts=0x08; //電流采樣8次,采集1次手柄

count_vol=0x00; //采樣256次手柄,采集1次電池電壓

ts=1; //可以采集手柄值的標(biāo)志位

ADGO=1; //AD采樣使能

TMR1ON=1; //CCP2部件開始工作

}

//------------延時子程序---------------

#pragma interrupt_level 1

void DELAY1(x)

char x;

{

DELAYH=x; //延時參數(shù)設(shè)置

#asm

DELAY2 MOVLW 0X06

MOVWF _DELAYL

DELAY1 DECFSZ _DELAYL

GOTO DELAY1

DECFSZ _DELAYH

GOTO DELAY2

#endasm

}

//-----------狀態(tài)采集子程序----------------------

void sample()

{

char state1,state2,state3,x;

do {

x=1;

state1=(PORTB&AND); //霍爾信號采集

DELAY1(x);

state2=(PORTB&AND);

}while(state1-state2); //當(dāng)三次采樣結(jié)果不相同時繼續(xù)采集狀態(tài)

if(state1-oldstate!=0) //看本次采樣結(jié)果是否與上次相同,不同

//則執(zhí)行

{oldstate=state1; //將本次狀態(tài)設(shè)置為舊狀態(tài)

state1=(oldstate>>5);

PORTC=new[state1]; //C口輸出相應(yīng)的信號觸發(fā)兩個MOS管

if(sp1==1){spe=1;sp1=0;}

else { //如果轉(zhuǎn)速很低,則spe置1

spe=0;sp1=0;

speedcount<<=1;

state3=(TMR1H>>2); //否則,spe=0,計轉(zhuǎn)速

speed=speedcount+state3; //speed寄存器為每256 μs加1

}

speedcount=0;

}

}

//-----------------AD采樣子程序----------------------

void AD()

{

char x;

ADIF=0; //清AD中斷標(biāo)志位

if(ts==1){ //如果為手柄采樣,則采樣手柄值

CHS0=1; //選擇電流采樣通道

count_vol=count_vol+1; //電池采樣計數(shù)寄存器

spepid=1; //置轉(zhuǎn)速閉環(huán)運算標(biāo)志

ts=0;tsh=ADRESH; //存手柄值

if(count_vol==0) { //如果電池采樣時間到,則選擇AN2通道,采集電池電壓

CHS0=0;CHS1=1;volflag=1;x=1;DELAY1(x);ADGO=1;

}

}

else if(volflag==1) { //電池采樣完畢,進(jìn)行相應(yīng)的處理

CHS1=0;CHS0=1;volflag=0;voltage=ADRESH;lowpower=1;

}

else

{ //否則,中斷為采樣電流中斷

speedcount=speedcount+1; //speedcount寄存器加1,作為測量轉(zhuǎn)速用

if(speedcount>0x3d)

sp1=1; //如果轉(zhuǎn)速低于1 000 000 μs/(512 μs*3eh*3)

// 則認(rèn)為為低速狀態(tài)

currenth=ADRESH;

curpid=1;

count_ts=count_ts-1;

if(count_ts==0) { //如果手柄時間到,則轉(zhuǎn)入手柄采樣通道

CHS0=0;count_ts=0x08;ts=1;x=1;DELAY1(x);ADGO=1;

}

}

}

//-------------剎車處理子程序------------------

void BREAKON()

{

char x;

off=0; //off清零,如果是干擾則不復(fù)位

shutdown=0;

if(RB0==1) { //如果剎車信號為真,則停止輸出電壓

ADIE=0; //關(guān)AD中斷

INTE=0; //關(guān)剎車中斷

CCPR1L=FULLDUTY; //輸出電壓0

TMR1ON=0; //關(guān)CCP2,不再觸發(fā)AD

for(;ADGO==1;) continue; //如正在采樣,則等待采樣結(jié)束

ADIF=0; //ADIF位清零

CHS0=0; //選擇通道0采樣手柄

CHS1=0;

x=1;

DELAY1(x);

do {

ADGO=1;

for(;ADIF==0;)continue;

ADIF=0;

CCPR1L=FULLDUTY;

asm("CLRWDT");

tsh=(ADRESH>>1);

}while(tsh>TSON||RB0==1); //當(dāng)手柄值大于2.2 V或剎車仍舊繼續(xù)時,執(zhí)行以

//上語句

off=1; //置復(fù)位標(biāo)志

}

}

//---------欠保護(hù)子程序-------------------

void POWER()

{

char x;

lowpower=0;

voltage>>=1; //電壓值換為7位,以利于單字節(jié)運算

if(voltage ADIE=0;

INTE=0;

TMR1ON=0;

CCPR1L=FULLDUTY;

for(;ADGO==1;)continue;

ADIF=0;

CHS0=0;CHS1=1;

x=1;

DELAY1(x);

do{ADGO=1;

for(;ADIF==0;)continue;

ADIF=0;

voltage=(ADRESH>>1);

CCPR1L=FULLDUTY;

asm("CLRWDT");

}while(voltage off=1; //置復(fù)位標(biāo)志

}

}

//------------電流環(huán)運算子程序-----------------

void CURPI()

{

static int curep=0x00,curek=0x00,curuk=0x00;

union data{int pwm;

char a[2];}b; //定義電流環(huán)運算寄存器

curpid=0; //清電流運算標(biāo)志

curep=curek*CURB; //計算上一次偏差與比例系數(shù)的積

if(currenth<2)currenth=2; //如果采樣電流為零,則認(rèn)為有一個小電

流以利于

//使轉(zhuǎn)速下降

currenth>>=1;

curek=gcur-currenth; //計算本次偏差

curuk=curuk+curek*CURA-curep; //按閉環(huán)PI運算方式得到本次輸出結(jié)果,

//面對結(jié)果進(jìn)行處理

if(curuk<0x00) { //如果輸出小于零,則認(rèn)為輸出為零

curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0;

}

else if(curuk-THL>=0)

{ //如果輸出大于限幅值,則輸出最大電壓

curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;

}

else { //否則,按比例輸出相應(yīng)的高電平時間到CCPR1寄存器

b.pwm=THL-curuk;

b.pwm<<=1;

CCPR1L=b.a[1]; //CCPR1L=(b.pwm>>8)&0x0ff;將PWM寄存器的高半字節(jié)

if(b.pwm&0x80!=0) CCP1X=1;

else CCP1X=0;

if(b.pwm&0x40!=0) CCP1Y=1;

else CCP1Y=0;

}

}

//---------------轉(zhuǎn)速環(huán)運算子程序-----------------------

void SPEPI()

{

static int speep=0x00,speek=0x00,speuk=0x00;

int tsh1,speed1; //轉(zhuǎn)速寄存器定義

spepid=0; //清轉(zhuǎn)速運算標(biāo)志

if(spe==1)

speed1=0x00; //若轉(zhuǎn)速太低,則認(rèn)為轉(zhuǎn)速為零

else speed1=0x7f-speed; //否則計算實際轉(zhuǎn)速

if(speed1<0) speed1=0;

speep=speek*SPEB;

tsh1=tsh-0x38; //得到計算用的手柄值

speek=tsh1-speed1;

if(tsh1<0) {speuk=0;gcur=0;} //當(dāng)手柄值低于1.1 V時,則認(rèn)為手柄給定為零

else { //否則,計算相應(yīng)的轉(zhuǎn)速環(huán)輸出

if(tsh1>=GSPEH) //限制最大轉(zhuǎn)速

tsh1=GSPEH;

speuk=speuk+speek*SPEA-speep; //計算得轉(zhuǎn)速環(huán)輸出

if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//轉(zhuǎn)速環(huán)輸出處理

else if(speuk>GCURHILO) { //轉(zhuǎn)速環(huán)輸出限制,即限制最大電流約12

A

speuk=GCURHILO;gcur=GCURH;}

else { //調(diào)速狀態(tài)時的輸出

gcur=(speuk>>4)&0x0ff;

}

}

}

//-----------主程序-------------------------

main()

{

for(;;){

INIT877(); //單片機(jī)復(fù)位后,先對其進(jìn)行初始化

off=0; //清復(fù)位標(biāo)志

for(;off==0;) { //復(fù)位標(biāo)志為零,則執(zhí)行下面程序,否則復(fù)位

if(curpid==1) CURPI(); //電流PI運算

else if(spepid==1) SPEPI(); //轉(zhuǎn)速PI運算

else if(lowpower==1) POWER();

else if(shutdown==1) BREAKON();

asm("CLRWDT");

}

}

}

//---------中斷服務(wù)子程序---------------------

#pragma interrupt_level 1

void interrupt INTS(void)

{

if(RBIF==1) {RBIF=0;sample();}

else if(ADIF==1) AD();

else if(INTF==1)

{shutdown=1;INTF=0;} //剎車中斷來,置剎車標(biāo)志

}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在這篇文章中,小編將為大家?guī)韱纹瑱C(jī)的相關(guān)報道。如果你對本文即將要講解的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: 單片機(jī) AVR PIC

在支持冷啟動的寬輸入電壓范圍內(nèi)為負(fù)載提供穩(wěn)定且受保護(hù)的輸出

關(guān)鍵字: 電動工具 電動自行車 電池組

拉斯維加斯2025年1月9日 /美通社/ -- 2025年1月9日,愛瑪科技集團(tuán)(AIMA Tech)在拉斯維加斯的 CES 展會上發(fā)布了全新的電動自行車系列。這不僅展示了愛瑪在全球市場的拓展成果,也體現(xiàn)了品牌如何在國際...

關(guān)鍵字: CE BSP AN 電動自行車

3.0版本讓驅(qū)動系統(tǒng)的設(shè)置和監(jiān)控變得更容易

關(guān)鍵字: 藍(lán)牙 示波器 驅(qū)動系統(tǒng)

【2024年10月25日, 德國慕尼黑訊】在電機(jī)驅(qū)動和開關(guān)模式電源(SMPS)等電池供電應(yīng)用中,電源架構(gòu)通常要求在模塊發(fā)生故障時能夠斷開該模塊與主電源軌的連接。為實現(xiàn)這一功能,往往會采用MOSFET等高邊斷開開關(guān),以防止...

關(guān)鍵字: 驅(qū)動器 機(jī)器人 電動自行車

全新挑戰(zhàn)賽鼓勵參與者設(shè)計能夠“動”起來的項目

關(guān)鍵字: 電動自行車 可穿戴設(shè)備

自動電壓調(diào)節(jié)器 (AVR) 用于通過補償輸入電壓的任何波動來調(diào)節(jié)供電電壓水平。AVR 也通常稱為電壓穩(wěn)定器,可用于許多工業(yè)和住宅應(yīng)用。例如,AVR 用于船舶發(fā)電機(jī)組、應(yīng)急電源和石油鉆井平臺,以在電力需求波動期間穩(wěn)定電壓水...

關(guān)鍵字: AVR 電壓調(diào)節(jié)

e絡(luò)盟向客戶供應(yīng)廣泛的TDK電子元件,適用于電動自行車

關(guān)鍵字: 電動自行車 傳感器 電容

2024年4月12日,中國--服務(wù)多重電子應(yīng)用領(lǐng)域、全球排名前列的半導(dǎo)體公司意法半導(dǎo)體(STMicroelectronics,簡稱ST;紐約證券交易所代碼:STM)宣布,松下自行車科技有限公司(Panasonic)宣布采...

關(guān)鍵字: 人工智能 電動自行車

基于氮化鎵器件的EPC9194逆變器參考設(shè)計顯著提高了電機(jī)驅(qū)動系統(tǒng)的效率、扭矩而同時使得單位重量功率(比功率)增加了一倍以上。該逆變器非常微型,可集成到電機(jī)外殼中,從而實現(xiàn)最低的電磁干擾、最高的密度和最輕的重量。

關(guān)鍵字: 電機(jī)驅(qū)動器 電動自行車 機(jī)器人 無人機(jī)
關(guān)閉