View Single Post
Old 21-09-2011, 10:16 PM   #1
ducmanh
Nhập môn đệ tử
 
Tham gia ngày: Sep 2011
Bài gửi: 2
:
HI-TECH PICC 9.82 lỗi khi dịch

Xin chào anh em trên diễn đàn , nhờ anh em hướng dẫn thành viên mới.

em đang sử dụng MPlab IDE v8.70 và HI-TECH PICC 9.82
để dịch chương trình ứng dụng kiểm tra thiết bị mô hình viết cho 16f883 từ trang
http://www.raconik.com/e-chex-multi-...vices-checker/
http://www.raconik.com/wp-content/up...2011/03/main.c
nhưng bị lỗi sau:

Executing: "C:\Program Files\HI-TECH Software\PICC\9.82\bin\picc.exe" --pass1 C:\main.c -q --chip=16F883 -P --runtime=default --opt=default -D__DEBUG=1 --rom=default --ram=default -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Warning [361] C:\main.c; 102.1 function declared implicit int
Error [192] C:\main.c; 199.1 undefined identifier "RBPU"
Error [192] C:\main.c; 432.1 undefined identifier "GODONE"
Warning [361] C:\main.c; 909.1 function declared implicit int

********** Build failed! **********


// man.c
//----------------------------------

// Project : E-CHEX

// PIC16F883 @ 8MHz internal

// Hi-tech PICC Pro 9.6PL5

// Last updated : November 17, 2009

//----------------------------------

#include <htc.h>

#include"delay.h"



// Configuration bit

// - Use internal RC for Oscillator

// - Watch-Dog Disabled

// - Power-up Timer Enabled

// - Internal reset MCLR pin use as I/O

// - Internal/External Switchover Disabled because using INTIO

// - Fail-Safe Clock Monitor Disabled because using INTIO



__CONFIG(INTIO&WDTDIS&PWRTEN&MCLRDIS&CP&DUNPROTECT &BORDIS&IESODIS&FCMDIS&LVPDIS&DEBUGDIS);

__CONFIG(BORV21);







#define Bemf_Rratio 12.02941176

#define BEC_Rratio 5.7

#define LiPo_Rratio 11.0

#define DeadBand 5

#define T0_Interval 48

#define NumberOfMode 5

#define MaxMode NumberOfMode - 1

#define MaxPole 14



#define Digit1 RA4 // pin 6

#define Digit2 RA6 // pin 10

#define Digit3 RA7 // pin 9



#define Switch RE3 // Pin 1

#define RX RB5 // Pin 26

#define ServoBit RB7 // Pin 28

#define DotMark 0xF7 // 11110111





// 7-Segment code commond anode

const char SegCode[16] = {0x28,0xF9,0x8A,0x98,0x59,0x1C,0x0C,0xF8,0x08,0x18 ,0xFF,0x1E,0xE8,0x8D,0x0E,0xCF};



volatile char DigitX[3]; // Buffer to store 7-segment code for each digit

static unsigned char DigitCnt,Debounce,FrameCnt,UpdateDisplayCnt;

volatile static char Mode;

static unsigned char StepInc;

static bit Update,DisplayModeFlag,ssw_flag,TimeSynFlag;

static unsigned char swState,SweepState,TimeSyn,Mode4State;

static bit ErrorPulseWidth,ShowPole,ServoEnabled,EnableReadSW ;

static char Pole;

unsigned int ppmWidth,NewVal;

unsigned int Cell[6];

static unsigned int Mode5Timer;



volatile static unsigned char ServoVal;



void Initial_IO(void);

void DisplayNumber(void);

void HTO7S(unsigned int Num);

void HTO7S2(unsigned int Num);

unsigned int ReadADC(unsigned char ch);

void TesterMode(void);

void MeasureMode(void);

unsigned int ReadPPM(void);

void ReadSwitch(void);

void CheckForUpdateDisplay(void);

void CenterMode(void);

void SweepMode(void);

void DisplayBatt(void);

void DisplayAllCell(unsigned int Volt);

void DisplayBECVolt(void);

void DisplayLine(void);

void KVMode(void);

unsigned int ReadVR(void);





//------------------------------------

// Main program

//------------------------------------

main(){



OSCCON = OSCCON | 0b01110000; // Enable Internal Clock at 8MHz



ServoEnabled = 0;

Initial_IO();



// check to see if ADC4 is Lipo inseted or not(Checking Cell 1 only)

if ((ReadADC(4) >= 20) && (ReadADC(10) >= 20)){



DisplayBatt();

}





DisplayBECVolt(); // Display BEC voltage





// Defualt mode is 0 after power on

// and display Mode Number on 7-segment 1Sec

DisplayModeFlag = 1;

DelayBigMs(1000);// Delay for showing Mode "1"

DisplayModeFlag = 0;



EnableReadSW = 1; // start to read Switch

//Mode = 4;

while(1){

switch (Mode){

case 0:{TesterMode();break;}

case 1:{CenterMode();break;}

case 2:{SweepMode();break;}

case 3:{MeasureMode();break;}

case 4:{KVMode();break;}

}

}

}





//-------------------------------------------------

// Interrupt Service Routine

// Timer 0 interrupt ever 6.667mS

//-------------------------------------------------

void interrupt isr(void){



if (T0IF){

T0IF=0;

TMR0 = T0_Interval;

DisplayNumber(); // Display every 6.667mS

CheckForUpdateDisplay(); // update display every about 33 mS

if (EnableReadSW){ ReadSwitch(); }





//----------------------------------

// Use in RX measurement mode only

//----------------------------------

TimeSyn ++;

if (TimeSyn>3){

TimeSyn = 0;

TimeSynFlag = 1;

}





if (ServoEnabled){

FrameCnt++;

if (FrameCnt>2){

FrameCnt=0;



//Set short timer1

PR2 = ServoVal - 2;



// Enable Timer 2.- every Timer 0 interrupt or 20ms = 1 short.

TMR2 = 0;



TMR2ON = 1;

TMR2IF = 0;



// Do not delete two this lines

NOP(); // optimize time interval for 0.7mS - 2.3mS

NOP(); // optimize time interval for 0.7mS - 2.3mS





ServoBit = 1;

ssw_flag = 1; // use in sweep mode to syn with servo

}

}

}



if (TMR2IF){

TMR2IF = 0;

TMR2ON = 0;

ServoBit=0;



}



}



//----------------------------------

// Initial I/O

//----------------------------------

void Initial_IO(void){

UpdateDisplayCnt = 0;

Pole = 7;

ShowPole = 0;

DigitCnt= 3;

EnableReadSW = 0;

Mode = 0;

swState = 0;

Update = 0;

ServoBit = 0;



// ANS0 for back emf

// ANS3 for Vdc/2

// ANS1,ANS2,ANS4-ANS7 for 6 cell lipo

ANSEL = 0b11111111;



// ANS9 for BEC

// ANS11 for VR 10K

ANSELH = 0b00011111;

RBPU = 0; // Pull-up on PortB

WPUB = 0b00100000; // RB5 pull-up for RX pin



//RE3 = 1;

//TRISE3 = 1; // Switch



/*

TRISA0 = 1; // input for ADC back emf

TRISA1 = 1; // Cell 6

TRISA2 = 1; // Cell 5

TRISA3 = 1; // Vdc/2

TRISA4 = 0; // Digit 1

TRISA5 = 1; // Cell 1

TRISA6 = 0; // Digit 2

TRISA7 = 0; // Digit 3

*/

TRISA = 0b00101111;



PORTC = 0xFF;

TRISC = 0x00; // PortC as output to control Digit row A to G, except RC7 use for switch



// RB7 servo, RB6 unused, RB5 RX, RB4 VR, RB3 BEC,

// RB2 Cell 3 AN8

// RB1 Cell 2 AN10

// RB0 Cell 4 AN12

//PORTB = 0b00110000;

RB6 = 0;

TRISB = 0b00111111; //



ADCON0 = 0b10000001; // AD conversion clock Fosc/32 = 4uS

ADCON1 = 0b10000000; // Right justified





T1CON = 0x00;



T2CON = 0b00100001;

TMR2IF = 0;

TMR2IE = 0;



//-----------------------------------

// Setup multi tasking

//-----------------------------------

T0CS = 0;

T0SE = 0;

PSA = 0;

PS2=1; PS1=0; PS0=1;

TMR0 = T0_Interval;

T0IE=1;

PEIE=1;

GIE=1;

}



//-----------------------------------

// Display Digit which is called by ISR

//-----------------------------------

void DisplayNumber(void){



if(DisplayModeFlag){

DigitX[0] = SegCode[Mode+1];// display number of mode(1-4)

DigitX[1] = SegCode[10]; // display blank

DigitX[2] = SegCode[10]; // display blank

}else if (ErrorPulseWidth){

DigitX[2] = SegCode[14]; // display "E"

DigitX[1] = SegCode[15]; // display "r"

DigitX[0] = SegCode[15]; // display "r"

}else if(ShowPole){

DigitX[2] = 0x42; // display "P."

DigitX[1] = SegCode[Pole/10]; // display "0"

DigitX[0] = SegCode[Pole%10]; // display "0"

}





DigitCnt++;

if (DigitCnt>2){

DigitCnt=0;

}



//Digit1=~Digit1;

//Digit2=~Digit2;

//Digit3=0;

//PORTC=~PORTC;



//-----------------------------

// Turn off all digits

//-----------------------------

Digit1=0; Digit2=0; Digit3=0;

PORTC = 0xFF;

//-----------------------------



switch(DigitCnt){

case 0:{PORTC = DigitX[0]; ; Digit1 = 1;break;}

case 1:{PORTC = DigitX[1]; ; Digit2 = 1;break;}

case 2:{PORTC = DigitX[2]; ; Digit3 = 1;break;}

}





}



//--------------------------------------

// Convet HEX 2 byte into 7-Segment code

// 3 digits x.xx

//--------------------------------------

void HTO7S(unsigned int Num){



unsigned int res;



DigitX[2]=(SegCode[Num/100] & DotMark);

res=Num%100;

DigitX[1]=SegCode[res/10];

res=res%10;

DigitX[0]=SegCode[res];





}



//--------------------------------------

// Convet HEX 2 byte into 7-Segment code

// 3 digits xx.x

//--------------------------------------

void HTO7S2(unsigned int Num){



unsigned int res;



DigitX[2]=SegCode[Num/100];

res=Num%100;

DigitX[1]=SegCode[res/10] & DotMark;

res=res%10;

DigitX[0]=SegCode[res];

}



//-------------------------------------

// Display Lipo and A123 Battery

//-------------------------------------

void DisplayBatt(void){



unsigned int V1,V2,V3,V4,V5,V6;



unsigned int TotalVolt;



unsigned char i,BattCnt;





BattCnt=0;





V1 = ReadADC(4);

if (V1>20){BattCnt++;}

V2 = ReadADC(10);

if (V2>20){BattCnt++;}

V3 = ReadADC(8);

if (V3>20){BattCnt++;}

V4 = ReadADC(12);

if (V4>20){BattCnt++;}

V5 = ReadADC(2);

if (V5>20){BattCnt++;}

V6 = ReadADC(1);

if (V6>20){BattCnt++;}



// display number of cell

DigitX[2] = SegCode[BattCnt]; // Display number of batt cell

DigitX[1] = 0xFF; // display "Blank"

DigitX[0] = 0x1E; // display "C"



DelayBigMs(1000); // delay 1 second



DisplayLine(); // display "---"





while(1){



V1 = ReadADC(4);

Cell[0] = V1 - 0;



V2 = ReadADC(10);

Cell[1] = V2 - V1;



V3 = ReadADC(8);

if (V3>V2){

Cell[2] = V3 - V2;

}else{

Cell[2] = 0;

}



V4 = ReadADC(12);

if(V4>V3){

Cell[3] = V4 - V3;

}else{

Cell[3] = 0;

}



V5 = ReadADC(3);

if (V5>V4){

Cell[4] = V5 - V4;

}else{

Cell[4] = 0;

}



V6 = ReadADC(1);

if (V6>V5){

Cell[5] = V6 - V5;

}else{

Cell[5] = 0;

}



for (i=0;i<BattCnt;i++){

DigitX[0] = SegCode[i+1]; // display number of cell(1-6)

DigitX[1] = 0x85; // display "o."

DigitX[2] = 0x68; // display "N"

DelayBigMs(500);

HTO7S((unsigned int)(Cell[i] * 0.003225806 * LiPo_Rratio * 100.0));

DelayBigMs(1000);



}

TotalVolt = Cell[0]+Cell[1]+Cell[2]+Cell[3]+Cell[4]+Cell[5];

DisplayAllCell(TotalVolt);

}

}





//------------------------------------

// Read ADC

// return 16th average 10 bit ADC value

//------------------------------------

unsigned int ReadADC(unsigned char ch){



unsigned char i;

unsigned int ADC;



ADCON0 = ((ADCON0 & 0b11000011) | (ch << 2));

NOP();NOP();NOP();NOP();NOP();



ADC = 0;

for (i=0;i<16;i++){

GODONE = 1;

while(GODONE) continue; // wait for conversion complete

ADC = ADC + ((ADRESH<<8) | ADRESL);

}



return (ADC>>4);

}





//--------------------------------------

// Read Pulse Width

// return : Pulse width 0.5mS - 2.5mS

// : 0 if pulse high or low > 2.5mS

//

// Actual Standard Pulse is 1mS - 2mS

//

//--------------------------------------

unsigned int ReadPPM(void){



TimeSyn = 0;

TimeSynFlag = 0;



while(!TimeSynFlag) continue;

TimeSynFlag = 0;



while(RX){

if (TimeSynFlag){

return 0;

}

}



//-----------------------------------------------

// Timer prescaler 1:1

// Fosc/4 = 0.5uS

// Timer 1 will count from

// EC78 to FFFF

// So time interval for counting is

// FFFFh - EC78h + 1 = 1388h

// or

// 65535 - 60536 + 1 = 5000

// 5000 * (prescaler 1:1) * 0.5uS = 2500uS = 2.5mS

//-------------------------------------------------

TMR1H = 0xEC;

TMR1L = 0x78;

TMR1ON = 1;



// wait high pulse

while(!RX){

if (TimeSynFlag){

return 0;

}

}





NOP();NOP();

while(RX){

if (TimeSynFlag){

return 0;

}

}



return ((((TMR1H<<8) | TMR1L) - 0xEC78) >> 1) ;





}



//------------------------------------

// Read Switch for changing mode

//------------------------------------

void ReadSwitch(void){



if (swState==0){

if (!Switch){

swState=1;

Debounce=0;

}

}else if(swState==1){

Debounce++;

if (Debounce>1){

if (!Switch){

DisplayModeFlag=1;

swState=2;

Debounce=0;

}else{

swState=0;

}

}

}else if(swState==2){

if (Switch){ // check to see switch released or not

swState=3; // Yes switch released goto next state

Debounce=0;

}else{

Debounce++;

if (Debounce>150){

Debounce=0;

if (Mode==4){

if (!Switch){

DisplayModeFlag=0;

ShowPole = 1;

swState=6;

}

}

}

}

}else if(swState==3){

Debounce++; // debounce when switch released

if (Debounce>1){

Debounce=0;

swState=4;

}

}else if(swState==4){ // checking switch pressed again or not in 1 Sec

Debounce++;

if (Debounce>150){

DisplayModeFlag=0;

Debounce=0;

swState=0;



}else if(!Switch){

swState=5;

Debounce=0;

}

}else if(swState==5){

Debounce++;

if (Debounce>1){

if (!Switch){

Mode++;

if (Mode>MaxMode){Mode=0;}

swState = 2;



}else{

swState=0;

}

}

}



//------------------------------------

// Use in Mode 4(KVM mode only)

//------------------------------------

else if(swState==6){

if (Switch){

Debounce = 0;

swState = 7;

}

}else if(swState==7){ // delay switch after switch released

Debounce++;

if (Debounce>2){

Mode5Timer = 0;

swState = 8;

}

//------------------------------------

}else if(swState==8){

Mode5Timer++;

if (Mode5Timer>300){

DisplayModeFlag=0;

ShowPole = 0;

swState = 0;

}else if (!Switch){

Debounce = 0;

swState = 9;

}



}else if(swState==9){

Debounce++;

if (Debounce>2){

Debounce = 0;

if (!Switch){

Pole++;

if (Pole>=(MaxPole+1)){

Pole = 1;

}

Mode5Timer = 0;

swState = 10;

}else{

swState = 8;

}

}

}else if(swState==10){

if (Switch){

Debounce = 0;

swState = 11;

}

}else if(swState==11){

Debounce++;

if (Debounce>2){

swState = 8;

}

}



}



//--------------------------------------

// Check before update display every 100mS

// Use on Tester Mode and Measure Mode only

//--------------------------------------

void CheckForUpdateDisplay(void){

UpdateDisplayCnt++;

if (UpdateDisplayCnt>15){

UpdateDisplayCnt = 0;

Update = 1;

}

}







//---------------------------------------

// Display All Cell of Batt

//---------------------------------------

void DisplayAllCell(unsigned int Volt){



DigitX[0] = 0x2F; // Display "L"

DigitX[1] = 0x2F; // display "L"

DigitX[2] = 0x48; // display "A"

DelayBigMs(500);



HTO7S2((unsigned int)(Volt * 0.003225806 * LiPo_Rratio * 10.0));

DelayBigMs(1000);



}





//---------------------------------------

// Display "---"

//---------------------------------------

void DisplayLine(void){

DigitX[0] = 0xDF; // Display "-"

DigitX[1] = 0xDF; // display "-"

DigitX[2] = 0xDF; // display "-"

DelayBigMs(1000);

}



//------------------------------------

// Read VR

//------------------------------------

unsigned int ReadVR(void){

return (ReadADC(11);

}





//--------------------------------------

// Display BEC after power on in test mode

//--------------------------------------

void DisplayBECVolt(void){



DigitX[0] = 0x2E; // Display "C"

DigitX[1] = 0x0E; // display "E"

DigitX[2] = 0x0D; // display "b"

DelayBigMs(1000);



HTO7S((unsigned int)(ReadADC(9) * 0.003225806 * BEC_Rratio * 100.0));

DelayBigMs(1000);



DisplayLine();



}





//------------------------------------

// Servo Tester Manual Mode

// Send pulse with 0.7mS - 2.3mS to servo

// Mode : 1

//------------------------------------

void TesterMode(void){



while(DisplayModeFlag) continue;

FrameCnt = 0;

ServoEnabled = 1;

TMR2IE = 1;

while(Mode==0){



// scale ADC value to Pulse width 700uS - 2300uS

// NewVal = ReadADC()/[(1023.0)/(2300.0-700.0))] + 700.0;

// ReadADC()

// -------------- + 700

// (1023 - 0)

// ----------

// (2300-700)

//NewVal = (unsigned int)(ReadVR()*1.56402737) + 700; // Vcc 3.3V

NewVal = (unsigned int)(ReadVR()*1.56555773) + 700; // Vcc 3.25V



if (NewVal>2300){ NewVal = 2300;}



ServoVal = NewVal/10;

//ServoVal =70;



if (Update){

Update = 0;

HTO7S(ServoVal); // display can show only 3 digits, so last digit cutted by divide by 10

}

}

ServoEnabled = 0;

}



//--------------------------------------

// Center Mode

// Mode : 2

//--------------------------------------

void CenterMode(void){

unsigned int VRPos;



while(DisplayModeFlag) continue;

FrameCnt = 0;

ServoEnabled = 1;

TMR2IE = 1;

ServoVal = 150;

while(Mode==1){



VRPos = ReadVR(); // VR return 0-1023 ,so half is 511.5

if (VRPos<=500){

ServoVal = 150;

}else if (VRPos>=521){

ServoVal = 152;

}



if (Update){

HTO7S(ServoVal); // display can show only 3 digits, so last digit cutted by divide by 10

Update = 0;

}

}



ServoEnabled = 0;

}



//-------------------------------------

// Sweep Mode

// Mode : 3

//-------------------------------------

void SweepMode(void){

unsigned char DelayStop;



while(DisplayModeFlag) continue;

FrameCnt = 0;

ServoEnabled = 1;

TMR2IE = 1;



//ServoVal = 70;

//DelayMs(100);



SweepState=0;



while(Mode==2){



if (ssw_flag){

ssw_flag=0;



StepInc = (unsigned char)((ReadVR()/((1023.0)/(9.0)))) + 1; // scale ADC value to 1-10

if(SweepState==0){

ServoVal = ServoVal + StepInc;

if (ServoVal>230){

ServoVal = 230;

SweepState=1;

DelayStop = 0;

}

}else if (SweepState==1){

DelayStop++;

if (DelayStop>15){

SweepState=2;

}

}else if (SweepState==2){

ServoVal = ServoVal - StepInc;

if (ServoVal<70){

ServoVal = 70;

SweepState=3;

DelayStop = 0;

}

}else if (SweepState==3){

DelayStop++;

if (DelayStop>15){

SweepState=0;

}

}

}



if (Update){

HTO7S(ServoVal); // display can show only 3 digits, so last digit cutted by divide by 10

Update = 0;

}

}

ServoEnabled = 0;

}







//------------------------------------

// Measure Mode

// Pulse width 0.7mS - 2.3mS is OK

// Display : Err if pulse are not in range

//

// Option (just option no need in this version)

// display "U-x" if pulse under 0.7mS

// display "O-x" if pulse over 2.3ms

// when x is error code

// Mode : 4

//------------------------------------

void MeasureMode(void){



ServoEnabled = 0;

T1CON = 0b11000000;

T1GSS = 1;

while(Mode==3){

ppmWidth = ReadPPM() ;

if (ppmWidth==0){

ErrorPulseWidth = 1; // Error caused by High or low too long(>2.5mS)

}else if ((ppmWidth>=700) && (ppmWidth<=2300)){

ErrorPulseWidth =0;

}

if (Update){

Update = 0;

HTO7S(ppmWidth/10); // display can show only 3 digits, so last digit cutted by divide by 10

}

}

ErrorPulseWidth =0;

T1CON = 0x00;

T1GSS = 0;

}





//--------------------------------------

// KV Measurement mode

// Use measuere Back EMF method

// Send pulse 1mS - 2mS to ESC

// Error < +/-5%

// Input : P Magnet Pole Pairs enter by user

// : Back EMF by measuring

// : Vdc by measuring

// Mode 5

//--------------------------------------

void KVMode(void){

unsigned int KVmotor, MecRPM, Bemf, Vdc;

unsigned int Ton, Toff, Ttotal, TCnt;

float FMecRPM, FBemf, FVdc;



while(DisplayModeFlag) continue;



ServoVal = 70;

FrameCnt = 0;

ServoEnabled = 1;



DelayBigMs(300);

Mode4State = 0;





// Comparator 1 on, Internal output, Non-invert, referrence form C1IN+ pin(Vdc/2)

// C12IN0- pin of C1 connects to C1VIN-

CM2CON0 = 0b00000000;



T1GSS = 0; // Timer1 gate source is SYNCC2OUT

C2SYNC = 1; // Output is synchronous to falling edge of Timer1 clock



// Timer 1

// Prescaler 1:8 TMR1L = 00-FF or 0 - 1mS (256 * 8 * 0.5uS ~ 1mS)

// So max frequency about 1kHz = 1/1mS

// Count Fosc/4 when gate high

//

T1CON = 0b11100001;

MecRPM = 0;

Bemf = 0;

KVmotor = 0;

Vdc = 0;



C2IE = 0; // disable comparator 2 intterupt

C2ON = 1; // Comparator 2 on



while(Mode==4){

//------------------------------------

// Checking for update display

//------------------------------------

if (Update){

Update = 0;

//HTO7S(MecRPM);

//HTO7S(Bemf);

HTO7S(KVmotor);

//HTO7S(Vdc);

}



if (Mode4State==0){

if (ReadVR()<10){

Mode4State=1;

DelayMs(100);

}

}else if (Mode4State==1){ // Measure pulse high



// scale 0 - 3.25V to 1mS - 2mS

NewVal = (unsigned int)((ReadVR() * 0.978473581) + 1000); // Vcc 3.25V

if (NewVal>2000){ NewVal = 2000;}

ServoVal = NewVal/10;



if (ServoVal>=199){

Mode4State=2;

Ton = 0;

Toff = 0;

TCnt = 0;

}

}else if (Mode4State==2){

C2POL = 0;

for (TCnt=0;TCnt<16;TCnt++){

while(!TimeSynFlag) continue;



TimeSynFlag = 0;

while(C2OUT){

if (TimeSynFlag){

break;

}

}





TMR1H = 0;

TMR1L = 0;

TMR1ON = 1;

// wait high pulse

while(!C2OUT){

if (TimeSynFlag){

break;

}

}



NOP();NOP();

while(C2OUT){

if (TimeSynFlag){

break;

}

}





Ton = Ton + ((TMR1H<<8) | TMR1L);

}

Ton = Ton>>4;

Mode4State=3;



}else if (Mode4State==3){ // Measure pulse low

C2POL = 1;

for (TCnt=0;TCnt<16;TCnt++){

while(!TimeSynFlag) continue;



TimeSynFlag = 0;

while(C2OUT){

if (TimeSynFlag){

break;

}

}



TMR1H = 0;

TMR1L = 0;

TMR1ON = 1;

// wait high pulse

while(!C2OUT){

if (TimeSynFlag){

break;

}

}



NOP();NOP();

while(C2OUT){

if (TimeSynFlag){

break;

}

}



Toff = Toff + ((TMR1H<<8) | TMR1L);

}

Mode4State=4;



}else if (Mode4State==4){ // Measure pulse low

C2POL = 0;

Bemf = 0;

for (TCnt=0;TCnt<16;TCnt++){

while(!TimeSynFlag) continue;

TimeSynFlag = 0;

while(C2OUT){

if (TimeSynFlag){

break;

}

}

NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();

Bemf = Bemf + ReadADC(0);

}



Bemf = Bemf>>4;



//------------------------------------------------------------------------------

// FZero period is Ttotal = Ttotal * 2

//

// FZero = 1 = 500000

// -------------------- -------- Hz

// Ttotal * 4 * 0.5uS Ttotal

//

// When Ttotal = Ton + Toff

//

//

// 500000 60

// Mechanical rpm = -------- * ----------- (RPM)

// Ttotal Pole Pairs

//

//

// 30000000

// Mechanical rpm = --------------------

// Ttotal * Pole Pairs

//

// But Actual Ttotal of FZero obtained by

// Ttotal = 2 * Ttotal

// So new Mechanical rpm is

//

// 30000000 15000000

// Mechanical rpm = ------------------------ = ----------------------

// 2 * Ttotal * Pole Pairs Ttotal * Pole Pairs

//--------------------------------------------------------------------



//--------------------------------------------------------------------

// MecRPM

// KVmotor = ------

// Bemf

//

// 15000000

// = -------------------

// Ttotal * Pole Pairs

// --------------------------------------

// ReadADC(0) * 0.003225806 * 12.02941176

//

// 2

// Actual Bemf = --- * Measured Bemf

// 3

// = 0.6666666 * Measured Bemf(average measured voltage at coil terminal)

//----------------------------------------------------------------------



//Bemf = (unsigned int)(ReadADC(0) * 0.003225806 * BemfRratio * 100.0); // for display

//Vdc = (unsigned int)(((ReadADC(2) * 0.003225806 * 23.72727273)/ 2.0) * 100.0); // for display

//MecRPM = (unsigned int)(15000000.0/(Ttotal * Pole * 10.0)); // for display





Ttotal = Ton + (Toff>>4); // This is period for 360 eletric degree for FZero

FBemf = Bemf * 0.003225806 * Bemf_Rratio * (2.0/3.0);

//FVdc = (unsigned int)(((ReadADC(2) * 0.003225806 * 23.72727273)/ 2.0) + 0.3);

FMecRPM = 15000000.0/(Ttotal * Pole);

KVmotor = (unsigned int)(FMecRPM/FBemf)/10;





Mode4State=1;

}



}

C2ON = 0;

ServoEnabled = 0;

}
ducmanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn