Sei sulla pagina 1di 8

+ Khởi tạo ADC

-void InitADC10(void)
{
- ADPCFG = 0xFFF8;
// all PORTB = Digital;RB0 to RB2 = analog
ADPCFG: A/D Port Configuration Register
- ADCON1 = 0x0064;
// PWM starts conversion
Register 17-1: ADCON1: A/D Control Register 1
bit 15 ADON: A/D Operating Mode bit
0 = A/D converter is off
bit 13 ADSIDL: Stop in Idle Mode bit
0 = Continue module operation in Idle mode
bit 9-8 FORM: Data Output Format bits
00 = Integer (DOUT = 0000 00dd dddd dddd)
bit 7-5 SSRC: Conversion Trigger Source Select bits
011 = Motor Control PWM interval ends sampling and starts conversion
bit 3 SIMSAM: Simultaneous Sample Select bit (only applicable when CHPS = 01 or 1x)
0 = Samples multiple channels individually in sequence
bit 2 ASAM: A/D Sample Auto-Start bit
1 = Sampling begins immediately after last conversion completes. SAMP bit is
auto set
bit 1 SAMP: A/D Sample Enable bit
0 = A/D sample/hold amplifiers are holding
bit 0 DONE: A/D Conversion Status bit (Rev. B silicon or later)
0 = A/D conversion is NOT done
- ADCON2 = 0x0200;
// simulataneous sample 4 channels
Register 17-2: ADCON2: A/D Control Register 2
bit 15-13 VCFG: Voltage Reference Configuration bits
000 AVDD AVSS
bit 12 Reserved: User should write ‘0’ to this location
bit 10 CSCNA: Scan Input Selections for CH0+ S/H Input for MUX A Input Multiplexer Setting
bit
0 = Do not scan inputs
bit 9-8 CHPS: Selects Channels Utilized bit
1x = Converts CH0, CH1, CH2 and CH3
When SIMSAM bit (ADCON1) = 0 multiple channels sampled sequentially
bit 7 BUFS: Buffer Fill Status bit
0 = A/D is currently filling buffer 0x0-0x7, user should access data in 0x8-0xF
bit 5-2 SMPI: Sample/Convert Sequences Per Interrupt Selection bits
0000 = Interrupts at the completion of conversion for each sample/convert
sequence
bit 1 BUFM: Buffer Mode Select bit
0 = Buffer configured as one 16-word buffer ADCBUF(15...0.)
bit 0 ALTS: Alternate Input Sample Mode Select bit
0 = Always use MUX A input multiplexer settings

- ADCHS = 0x0002;
// Connect RB2/AN2 as CH0 = pot ..
// ch1 = Vbus, Ch2 = Motor, Ch3 = pot
Register 17-4: ADCHS: A/D Input Select Register
bit 15-14 CH123NB: Channel 1, 2, 3 Negative Input Select for MUX B Multiplexer Setting bits
Same definition as bits 6-7
bit 13 CH123SB: Channel 1, 2, 3 Positive Input Select for MUX B Multiplexer Setting bit
Same definition as bit 5
bit 12 CH0NB: Channel 0 Negative Input Select for MUX B Multiplexer Setting bit Same
definition as bit 4
bit 11-8 CH0SB: Channel 0 Positive Input Select for MUX B Multiplexer Setting bits Same
definition as bits 3-0
bit 7-6 CH123NA: Channel 1, 2, 3 Negative Input Select for MUX A Multiplexer Setting bits
0x = CH1, CH2, CH3 negative input is VREF
bit 5 CH123SA: Channel 1, 2, 3 Positive Input Select for MUX A Multiplexer Setting bit
0 = CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive
input is AN2
bit 4 CH0NA: Channel 0 Negative Input Select for MUX A Multiplexer Setting bit
bit 3-0 CH0SA: Channel 0 Positive Input Select for MUX A Multiplexer Setting bits
0010 = Channel 0 positive input is AN2

- ADCON3 = 0x0080;
// Tad = internal RC (4uS)
Register 18-3: ADCON3: A/D Control Register 3
bit 12-8 SAMC: Auto Sample Time bits
bit 7 ADRC: A/D Conversion Clock Source bit
1 = A/D internal RC clock
bit 5-0 ADCS: A/D Conversion Clock Select bits
000000 = TCY/2 • (ADCS + 1) = TCY/2
- IFS0bits.ADIF = 0;
Register 6-5: IFS0: Interrupt Flag Status Register 0
bit 11 ADIF: A/D Conversion Complete Interrupt Flag Status bit
1 = Interrupt request has occurred
0 = Interrupt request has not occurred
- IEC0bits.ADIE = 1;
Register 6-8: IEC0: Interrupt Enable Control Register 0
bit 11 ADIE: A/D Conversion Complete Interrupt Enable bit
1 = Interrupt request enabled
0 = Interrupt request not enabled
- ADCON1bits.ADON = 1;
// turn ADC ON
bit 15 ADON: A/D Operating Mode bit
1 = A/D converter module is operating
0 = A/D converter is off

}
+ Khởi tạo PWM
- void InitMCPWM(void)
{
- PTPER = FCY/FPWM - 1; // PWM Time Base Period register
- PWMCON1 = 0x0700; // disable PWMs
Register 15-5:PWMCON1: PWM Control Register 1
bit 11-8 PMOD4:PMOD1: PWM I/O Pair Mode bits
1 = PWM I/O pin pair is in the independent output mode
0 = PWM I/O pin pair is in the complementary output mode
bit 7-4 PEN4H-PEN1H: PWMxH I/O Enable bits(1)
1 = PWMxH pin is enabled for PWM output
0 = PWMxH pin disabled. I/O pin becomes general purpose I/O
bit 3-0 PEN4L-PEN1L: PWMxL I/O Enable bits(1)
1 = PWMxL pin is enabled for PWM output
0 = PWMxL pin disabled. I/O pin becomes general purpose I/O

- OVDCON = 0x0000; // allow control using OVD


Register 15-11: OVDCON: Override Control Register
bit 15-8 POVD4H-POVD1L: PWM Output Override bits
1 = Output on PWMxx I/O pin is controlled by the PWM generator
0 = Output on PWMxx I/O pin is controlled by the value in the corresponding POUTxx
bit
bit 7-0 POUT4H-POUT1L: PWM Manual Output bits
1 = PWMxx I/O pin is driven ACTIVE when the corresponding POVDxx bit is cleared
0 = PWMxx I/O pin is driven INACTIVE when the corresponding POVDxx bit is cleared

- PDC1 = 100; // init PWM 1, 2 and 3 to 100


- PDC2 = 100; // PWM Duty Cycle register
- PDC3 = 100;
- SEVTCMP = PTPER;
SEVTCMP: PWM Special Event Compare register
- PWMCON2 = 0x0F00; // 16 postscale values
Register 15-6: PWMCON2: PWM Control Register 2
bit 11-8 SEVOPS: PWM Special Event Trigger Output Postscale Select bits
1111 = 1:16 Postscale
bit 2 IUE: Immediate Update Enable bit(1)
1 = Updates to the active PDC registers are immediate
0 = Updates to the active PDC registers are synchronized to the PWM
time base
bit 1 OSYNC: Output Override Synchronization bit
1 = Output overrides via the OVDCON register are synchronized to the
PWM time base
0 = Output overrides via the OVDCON register occur on next TCY
boundary
bit 0 UDIS: PWM Update Disable bit
1 = Updates from duty cycle and period buffer registers are disabled
0 = Updates from duty cycle and period buffer registers are enabled

- PTCON = 0x8000; // start PWM


Register 15-1: PTCON: PWM Time Base Control Register
bit 15 PTEN: PWM Time Base Timer Enable bit
1 = PWM time base is ON
0 = PWM time base is OFF
bit 13 PTSIDL: PWM Time Base Stop in Idle Mode bit
1 = PWM time base halts in CPU Idle mode
0 = PWM time base runs in CPU Idle mode
bit 7-4 PTOPS: PWM Time Base Output Postscale Select bits
0000 = 1:1 Postscale
bit 3-2 PTCKPS: PWM Time Base Input Clock Prescale Select bits
00 = PWM time base input clock period is TCY (1:1 prescale)
bit 1-0 PTMOD: PWM Time Base Mode Select bits
00 = PWM time base operates in a free running mode

}
+ Khởi tạo TMR3
( Timer 3 register )
- void InitTMR3(void)
{
- T3CON = 0x0030; // internal Tcy/256 clock
TGATE = 0 : Gated time accumulation disabled
TCKPS1 = 1
TCKPS0 = 1
TCS = 0
- TMR3 = 0;
- PR3 = 0xFFFF; // Period Register 3
}
+ Khởi tạo UART
void InitUART(void)
{
// Initialize the UART1 for BAUD = 19,200
- U1MODE = 0x8000;
UARTEN = 1: UARTEN: UART Enable bit
1 = UART is enabled. UART pins are controlled by UART as defined by UEN
and UTXEN control bits.

- U1STA = 0x0000;
- U1BRG = ((FCY/16)/BAUD) - 1; // set baud to 19200
- IEC0bits.U1RXIE = 1;
U1RXIE: UART1 Receiver Interrupt Enable bit
1 = Interrupt request enabled
- RXPtr = &InData[0]; // point to first char in string
- Flags.CheckRX = 0;
- Flags.SendTX = 0;
- U1STAbits.UTXEN = 1; // Initiate transmission
UTXEN: Transmit Enable bit
1 = UART transmitter enabled, UxTX pin controlled by UART (if UARTEN = 1)

}
+ Ngắt CN
- void __attribute__((interrupt, no_auto_psv)) _CNInterrupt (void)
{
- IFS0bits.CNIF = 0; // clear flag
Register 6-5: IFS0: Interrupt Flag Status Register 0
0 = Interrupt request has not occurred
- HallValue = PORTB & 0x0038; // mask RB3,4 & 5
- HallValue = HallValue >> 3; // shift right 3 times
- OVDCON = StateLoTableAntiClk[HallValue];
- if (HallValue == INDEX) // has the same position been sensed?
- if (polecount++ == POLEPAIRS) //has one mech rev elasped?
{ // yes then read timer3
-timer3value = TMR3;
-TMR3 = 0;
-timer3avg = ((timer3avg + timer3value) >> 1);
-polecount = 1;
}
+ Ngắt U1TX
- void __attribute__((interrupt, no_auto_psv)) _U1TXInterrupt(void)
{x
- IFS0bits.U1TXIF = 0; // clear interrupt flag
Register 6-5: IFS0: Interrupt Flag Status Register 0
bit 10 U1TXIF: UART1 Transmitter Interrupt Flag Status bit
0 = Interrupt request has not occurred

}
+ Ngắt U1RX

- void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void)


{
- IFS0bits.U1RXIF = 0; // clear interrupt flag
bit 9 U1RXIF: UART1 Receiver Interrupt Flag Status bit
0 = Interrupt request has not occurred

- *RXPtr = U1RXREG;
- if (*RXPtr == CR)
- {Flags.CheckRX = 1;RXPtr = &InData[0];}
- else *RXPtr++;
}
+ Ngắt ADC
- void __attribute__((interrupt, no_auto_psv)) _ADCInterrupt (void)
{
- IFS0bits.ADIF = 0;
bit 11 ADIF: A/D Conversion Complete Interrupt Flag Status bit
0 = Interrupt request has not occurred
- if (Flags.RunMotor)
{
- PDC1 = ADCBUF0 >> 1; // get value ...
- PDC2 = PDC1; // and load all three PWMs
- PDC3 = PDC1; // duty cycles
- Flags.SndSpeed = 1; // send speed info serially
}
+ Main
int main(void)
{
o LATE = 0x0000;
o TRISE = 0xFFC0; // PWMs are outputs
o CNEN1 = 0x00E0; // CN5,6 and 7 enabled
o CNPU1 = 0x00E0; // enable internal pullups
o IFS0bits.CNIF = 0; // clear CNIF
o IEC0bits.CNIE = 1; // enable CN interrupt
o InitMCPWM();
o InitADC10();
o InitUART();
o InitTMR3();
o timer3avg = 0;
o while(1)
{
- while (!S2); // wait for start key hit
- while (S2) // wait till key is released
- DelayNmSec(10);
// read hall position sensors on PORTB
- HallValue = PORTB & 0x0038; // mask RB3,4 & 5
- HallValue = HallValue >> 3; // shift right to get
value 1, 2 ... 6
- OVDCON = StateLoTableAntiClk[HallValue]; // Load the overide
control register
- PWMCON1 = 0x0777; // enable
PWM outputs
- Flags.RunMotor = 1; // set flag
- T3CONbits.TON = 1; // start tmr3
- polecount = 1;
- DelayNmSec(100);
- while (Flags.RunMotor) // while motor is running
{
- if (S2) // if S2
is pressed
{
o PWMCON1 = 0x0700; // disable PWM outputs
o OVDCON = 0x0000; // overide PWM low.
o Flags.RunMotor = 0; // reset run flag
o while (S2) // wait for key release
o DelayNmSec(10);
}
- if (Flags.SndSpeed)
- SendSpeed();
}
} // end of while (1)
}

Potrebbero piacerti anche