📄 ex7_bldc_hall_test.c
字号:
// ***********************************************************************
// File : Hall Test Program for Exercise 7
// Purpose :
// ***********************************************************************
#define __dsPIC30F4011__
#include <timer.h>
#include <math.h>
#include <p30F4011.h>
#include "APP009V2_LCD.h"
#define FCY 7372800 * 2
//---------------------------------------------------------------------------
// Configuration bits
// _FOSC(CSW_FSCM_OFF & EC_PLL4); //XT with 4xPLL oscillator, Failsafe clock off
// _FWDT(WDT_OFF); //Watchdog timer disabled
// _FBORPOR(PBOR_OFF & MCLR_EN); //Brown-out reset disabled, MCLR reset enabled
// _FGS(CODE_PROT_OFF); //Code protect disabled
#define LED13 LATDbits.LATD0
#define LED14 LATDbits.LATD1
#define LED15 LATFbits.LATF0
#define LED16 LATFbits.LATF1
#define DIR_LED13 TRISDbits.TRISD0
#define DIR_LED14 TRISDbits.TRISD1
#define DIR_LED15 TRISFbits.TRISF0
#define DIR_LED16 TRISFbits.TRISF1
#define HALL_A LATBbits.LATB3
#define HALL_B LATBbits.LATB4
#define HALL_C LATBbits.LATB5
#define DIR_HALL_A TRISBbits.TRISB3
#define DIR_HALL_B TRISBbits.TRISB4
#define DIR_HALL_C TRISBbits.TRISB5
#define AD_S1 0x2B4
#define AD_S2 0x259
#define AD_S3 0x1FB
#define AD_S4 0x13B
#define ADC_MAX 0x3FF
void DelayNmSec(unsigned int ) ;
void InitADC10(void);
void Initial_Timer1( void );
void Timer3_Initial( void ) ;
void S1_Process(void) ;
void S2_Process(void) ;
void S3_Process(void) ;
void S4_Process(void) ;
void Set_HALLs(void) ;
void Display_PWM(void) ;
unsigned char TxData[10] = {0,0,0,0,0,0,0,0,0,0} ;
int AN0_Result[256] ;
int AN1_Result[256] ;
int T1IF_Flag ;
int T1IF_Counter ;
int ADC_Value ;
int HALL_Position ;
int S1_Counter ;
int S2_Counter ;
int S3_Counter ;
int S4_Counter ;
int NoS_Counter ;
int KeyPressed ;
int PWM_Status_Buffer[6] ;
int T3OV ;
union
{
int PORTE_Value ;
struct
{
unsigned PWM1L : 1 ;
unsigned PWM1H : 1 ;
unsigned PWM2L : 1 ;
unsigned PWM2H : 1 ;
unsigned PWM3L : 1 ;
unsigned PWM3H : 1 ;
};
}PWM_InBuffer ;
union
{
int PORTE_Value ;
struct
{
unsigned PWM1L : 1 ;
unsigned PWM1H : 1 ;
unsigned PWM2L : 1 ;
unsigned PWM2H : 1 ;
unsigned PWM3L : 1 ;
unsigned PWM3H : 1 ;
};
}Old_PWM_InBuffer ;
void __attribute__((__interrupt__)) _T3Interrupt(void)
{
T3OV = 1 ; // Set Timer3 overflow Flag !!
IFS0bits.T3IF = 0 ;
}
void __attribute__((__interrupt__)) _ADCInterrupt(void)
{
IFS0bits.ADIF = 0 ;
}
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
T1IF_Counter += 1 ;
if ( T1IF_Counter > 1000)
{
T1IF_Counter = 0 ;
T1IF_Flag = 1 ;
}
IFS0bits.T1IF = 0 ;
}
void __attribute__((__interrupt__)) _PWMInterrupt(void)
{
IFS2bits.PWMIF = 0 ;
}
int main( void )
{
// Make FLTA = 0 first ................
TRISEbits.TRISE8 = 0 ;
LATEbits.LATE8 = 0 ;
DIR_LED13 = 0 ;
DIR_LED14 = 0 ;
DIR_LED15 = 0 ;
DIR_LED16 = 0 ;
HALL_A = 0 ;
HALL_B = 0 ;
HALL_C = 1 ;
DIR_HALL_A = 0 ;
DIR_HALL_B = 0 ;
DIR_HALL_C = 0 ;
OpenLCD( ) ;
InitADC10( ) ;
Initial_Timer1( ) ;
Timer3_Initial( ) ;
T1IF_Flag = 0 ;
T1IF_Counter = 0 ;
HALL_Position = 1 ;
setcurLCD(0,1) ;
putrsLCD("HALL POSITION ") ;
setcurLCD(14,1) ;
putcLCD(HALL_Position+'0');
TRISE = 0xffff ;
Set_HALLs( ) ;
while (1)
{
while ( T1IF_Flag == 0 )
{
if ( T3OV )
{
PWM_InBuffer.PORTE_Value = PORTE ;
if ( (PWM_InBuffer.PWM1L != Old_PWM_InBuffer.PWM1L)&& PWM_Status_Buffer[0] < 1000 )
PWM_Status_Buffer[0]+= 1 ;
if ( (PWM_InBuffer.PWM1H != Old_PWM_InBuffer.PWM1H)&& PWM_Status_Buffer[1] < 1000 )
PWM_Status_Buffer[1] += 1 ;
if ( (PWM_InBuffer.PWM2L != Old_PWM_InBuffer.PWM2L)&& PWM_Status_Buffer[2] < 1000 )
PWM_Status_Buffer[2] += 1 ;
if ( (PWM_InBuffer.PWM2H != Old_PWM_InBuffer.PWM2H)&& PWM_Status_Buffer[3] < 1000 )
PWM_Status_Buffer[3] += 1 ;
if ( (PWM_InBuffer.PWM3L != Old_PWM_InBuffer.PWM3L)&& PWM_Status_Buffer[4] < 1000 )
PWM_Status_Buffer[4] += 1 ;
if ( (PWM_InBuffer.PWM3H != Old_PWM_InBuffer.PWM3H)&& PWM_Status_Buffer[5] < 1000 )
PWM_Status_Buffer[5] += 1 ;
Old_PWM_InBuffer.PORTE_Value = PWM_InBuffer.PORTE_Value ;
T3OV = 0 ;
}
}
Display_PWM( ) ;
T1IF_Flag = 0 ;
IFS0bits.T1IF = 0 ;
LED13 = ! LED13 ;
LED14 = ! LED14 ;
// Convert AN8 to get the KeyValue ...................
IFS0bits.ADIF = 0 ;
ADCON1bits.SAMP = 0; // start Converting
while (!IFS0bits.ADIF); // conversion done?
ADC_Value = ADCBUF0; // yes then get ADC value
if ( KeyPressed )
{
if ( ADC_Value > ADC_MAX-20)
{
NoS_Counter+= 1 ;
if ( NoS_Counter >= 3 )
{
KeyPressed = 0 ;
NoS_Counter = 0 ;
}
}
}
else
{
if ( ( ADC_Value < AD_S1+10 ) && ( ADC_Value > AD_S1-10) )
S1_Process( ) ;
else if ( ( ADC_Value < AD_S2+10 ) && ( ADC_Value > AD_S2-10) )
S2_Process( ) ;
else if ( ( ADC_Value < AD_S3+10 ) && ( ADC_Value > AD_S3-10) )
S3_Process( ) ;
else if ( ( ADC_Value < AD_S4+10 ) && ( ADC_Value > AD_S4-10) )
S4_Process( ) ;
}
}
}
void S1_Process(void)
{
S1_Counter += 1 ;
S2_Counter = 0 ;
S3_Counter = 0 ;
S4_Counter = 0 ;
NoS_Counter = 0 ;
if ( S1_Counter >= 3 )
{
S1_Counter = 0 ;
KeyPressed = 1 ;
HALL_Position += 1 ;
if ( HALL_Position >= 7 )
HALL_Position = 1 ;
Set_HALLs( ) ;
setcurLCD(14,1) ;
putcLCD(HALL_Position+'0');
}
}
void S2_Process(void)
{
S2_Counter += 1 ;
S1_Counter = 0 ;
S3_Counter = 0 ;
S4_Counter = 0 ;
NoS_Counter = 0 ;
if ( S2_Counter >= 3 )
{
S2_Counter = 0 ;
KeyPressed = 1 ;
if ( HALL_Position == 1 )
HALL_Position = 6 ;
else
HALL_Position -= 1 ;
Set_HALLs( ) ;
setcurLCD(14,1) ;
putcLCD(HALL_Position+'0');
}
}
void S3_Process(void)
{
S3_Counter += 1 ;
S1_Counter = 0 ;
S2_Counter = 0 ;
S4_Counter = 0 ;
NoS_Counter = 0 ;
if ( S3_Counter >= 3 )
{
S3_Counter = 0 ;
KeyPressed = 1 ;
}
}
void S4_Process(void)
{
S4_Counter += 1 ;
S1_Counter = 0 ;
S2_Counter = 0 ;
S3_Counter = 0 ;
NoS_Counter = 0 ;
if ( S4_Counter >= 3 )
{
S4_Counter = 0 ;
KeyPressed = 1 ;
}
}
void Display_PWM(void)
{
setcurLCD(0,0) ;
if ( PWM_Status_Buffer[0] > 10 ) putcLCD('X') ;
else if (PWM_InBuffer.PWM1L) putcLCD('1') ;
else putcLCD('0') ;
if ( PWM_Status_Buffer[1] > 10 ) putcLCD('X') ;
else if (PWM_InBuffer.PWM1H) putcLCD('1') ;
else putcLCD('0') ;
putcLCD(' ');
if ( PWM_Status_Buffer[2] > 10 ) putcLCD('X') ;
else if (PWM_InBuffer.PWM2L) putcLCD('1') ;
else putcLCD('0') ;
if ( PWM_Status_Buffer[3] > 10 ) putcLCD('X') ;
else if (PWM_InBuffer.PWM2H) putcLCD('1') ;
else putcLCD('0') ;
putcLCD(' ');
if ( PWM_Status_Buffer[4] > 10 ) putcLCD('X') ;
else if (PWM_InBuffer.PWM3L) putcLCD('1') ;
else putcLCD('0') ;
if ( PWM_Status_Buffer[5] > 10 ) putcLCD('X') ;
else if (PWM_InBuffer.PWM3H) putcLCD('1') ;
else putcLCD('0') ;
}
void DelayNmSec(unsigned int N)
{
unsigned int j;
while(N--)
for(j=0;j < 1000;j++);
}
void InitADC10(void)
{
ADPCFG = 0xFEFF; // all PORTB = Digital; RB8 = analog
ADCON1 = 0x2006; // 0b0010 0000 0000 0110
// SAMP bit = 0 ends sampling ..and starts converting
ADCHS = 0x0008; // Connect RB8/AN8 as CH0 input ..
// in this example RB0/AN0 is the input
ADCSSL = 0;
ADCON3 = 0x040f; // Manual Sample, Tad = internal 2 Tcy
ADCON2 = 0x0000;
IFS0bits.ADIF = 0 ;
IEC0bits.ADIE = 0 ;
IPC2bits.ADIP = 0 ;
ADCON1bits.ADON = 1; // turn ADC ON
}
void Initial_Timer1( void )
{
ConfigIntTimer1( T1_INT_PRIOR_7 & T1_INT_ON ) ;
OpenTimer1( T1_ON & T1_IDLE_STOP & T1_GATE_OFF & T1_PS_1_1 & T1_SYNC_EXT_OFF & T1_SOURCE_INT ,
683 ) ;
}
void Timer3_Initial( void )
{
ConfigIntTimer3( T3_INT_PRIOR_7 & T3_INT_ON ) ;
OpenTimer3( T3_ON & T3_IDLE_STOP & T3_GATE_OFF & T3_PS_1_1 & T3_SOURCE_INT ,
400 ) ;
}
void Set_HALLs(void)
{
int i ;
for ( i= 0 ; i < 6 ; i ++ )
PWM_Status_Buffer[i] = 0 ;
PWM_InBuffer.PORTE_Value = PORTE ;
Old_PWM_InBuffer.PORTE_Value = PWM_InBuffer.PORTE_Value ;
switch ( HALL_Position )
{
case 1:
HALL_A = 1 ;
HALL_B = 0 ;
HALL_C = 0 ;
break ;
case 2:
HALL_A = 1 ;
HALL_B = 1 ;
HALL_C = 0 ;
break ;
case 3:
HALL_A = 0 ;
HALL_B = 1 ;
HALL_C = 0 ;
break ;
case 4:
HALL_A = 0 ;
HALL_B = 1 ;
HALL_C = 1 ;
break ;
case 5:
HALL_A = 0 ;
HALL_B = 0 ;
HALL_C = 1 ;
break ;
case 6:
HALL_A = 1 ;
HALL_B = 0 ;
HALL_C = 1 ;
break ;
default :
break ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -