00001
00023 #include <ioavr.h>
00024 #include <inavr.h>
00025 #include "sensor_three_phase_BLDC.h"
00026
00033 unsigned char drvPatternsCCW[] = {
00034 0,
00035
00036 PDP2_CCW,
00037 PDP4_CCW,
00038 PDP3_CCW,
00039 PDP6_CCW,
00040 PDP1_CCW,
00041 PDP5_CCW,
00042
00043 COM0P2_CCW,
00044 COM0P4_CCW,
00045 COM0P3_CCW,
00046 COM0P6_CCW,
00047 COM0P1_CCW,
00048 COM0P5_CCW,
00049
00050 COM2P2_CCW,
00051 COM2P4_CCW,
00052 COM2P3_CCW,
00053 COM2P6_CCW,
00054 COM2P1_CCW,
00055 COM2P5_CCW
00056 };
00057
00058
00059
00066 unsigned char drvPatternsCW[] = {
00067 0,
00068
00069 PDP2_CW,
00070 PDP6_CW,
00071 PDP1_CW,
00072 PDP4_CW,
00073 PDP3_CW,
00074 PDP5_CW,
00075
00076 COM0P2_CW,
00077 COM0P6_CW,
00078 COM0P1_CW,
00079 COM0P4_CW,
00080 COM0P3_CW,
00081 COM0P5_CW,
00082
00083 COM2P2_CW,
00084 COM2P6_CW,
00085 COM2P1_CW,
00086 COM2P4_CW,
00087 COM2P3_CW,
00088 COM2P5_CW
00089 };
00090
00091
00092
00094 __regvar __no_init unsigned char *pDrvPattern @14;
00095
00096
00097
00098
00100 __regvar __no_init union _fastTemp{
00101 unsigned int word;
00102 struct{
00103 unsigned char LByte;
00104 unsigned char HByte;
00105 };
00106 } fastTemp @12;
00107
00108 __regvar __no_init unsigned char hallMask @11;
00109 __regvar __no_init unsigned char count @10;
00110
00111
00112
00127 #pragma vector = PCINT0_vect
00129 __interrupt void PCINT0_ISR( void )
00130 {
00131 unsigned char *pTemp;
00132 fastTemp.word = ((PIN_HALL & hallMask)>>1);
00133
00134
00135
00136 pTemp = pDrvPattern + fastTemp.word;
00137
00138
00139
00140 PORT_MC = *(pTemp);
00141
00142 TCCR0A = *(pTemp + PATTERN_COM0_OFFSET);
00143 TCCR2A = *(pTemp + PATTERN_COM2_OFFSET);
00144 count--;
00145 }
00146
00147
00148
00158 static void Init_MC_pin_change_interrupt( void )
00159 {
00160 PCMSK0 = (1<<PCINT1)|(1<<PCINT2)|(1<<PCINT3);
00161 PCICR = 1<<PCIE0;
00162 }
00163
00164
00165
00176 unsigned char Get_ADC8(unsigned char muxSetting)
00177 {
00178 ADMUX = muxSetting;
00179
00180 ADCSRA |= (1 << ADSC);
00181
00182 while ( ADCSRA & (1 << ADSC) );
00183 return ADCH;
00184 }
00185
00186
00188
00199 static void Init_MC_timers( void )
00200 {
00201
00202 TCCR0A = (1<<COM0A1)|(0<<COM0A0)|
00203 (1<<COM0B1)|(0<<COM0B0)|
00204 (1<<WGM01)|(1<<WGM00);
00205 TCCR0B = (0<<FOC0A)|(0<<FOC0B)|
00206 (0<<WGM02)|
00207 (0<<CS02)|(0<<CS01)|(1<<CS00);
00208
00209
00210 TCCR2A = (0<<COM2A1)|(0<<COM2A0)|
00211 (1<<COM2B1)|(0<<COM2B0)|
00212 (1<<WGM01)|(1<<WGM00);
00213 TCCR2B = (0<<FOC2A)|(0<<FOC2B)|
00214 (0<<WGM22)|
00215 (0<<CS22)|(0<<CS21)|(1<<CS20);
00216
00217
00218 TCNT0 = 0;
00219 TCNT2 = 3;
00220
00221 TIFR0 = TIFR0;
00222 TIFR1 = TIFR1;
00223 }
00224
00225
00226
00238 static void Init_ADC( void )
00239 {
00240 ADCSRA = (1 << ADEN) | (1 << ADPS1);
00241 }
00242
00243
00244
00256 static void Set_Speed(unsigned char speed)
00257 {
00258 TIFR0 = TIFR0;
00259 while( !(TIFR0 & (1<<TOV0)));
00260
00261 __disable_interrupt();
00262 OCR0A = speed;
00263 OCR0B = speed;
00264 OCR2B = speed;
00265 __enable_interrupt();
00266 }
00267
00268
00269
00281 static void Set_Direction(unsigned char direction)
00282 {
00283 if(direction == CLOCKWISE)
00284 {
00285 __disable_interrupt();
00286 pDrvPattern = drvPatternsCW;
00287 __enable_interrupt();
00288 }
00289 else
00290 {
00291 __disable_interrupt();
00292 pDrvPattern = drvPatternsCCW;
00293 __enable_interrupt();
00294 }
00295 }
00296
00297
00308 void main( void )
00309 {
00310 unsigned char speed = 0;
00311 unsigned char setspeed = 0;
00312 signed int current;
00313 MCUCR |= (1<<PUD);
00314 hallMask = HALL_MASK;
00315
00316 Set_Direction( CLOCKWISE );
00317
00318 Init_MC_timers();
00319 Init_MC_pin_change_interrupt();
00320 Init_ADC();
00321
00322 DDR_HALL |= HALL_MASK;
00323 PORT_HALL |= HALL_MASK;
00324 PORT_HALL &= ~HALL_MASK;
00325 DDR_HALL &= ~HALL_MASK;
00326 __enable_interrupt();
00327 Set_Speed(speed);
00328 DDR_MC = MC_MASK;
00329
00330 DDRC |= (1<<PC1);
00331 for(;;) {
00332
00333 current = Get_ADC8(ADC_MUX_SHUNT_H);
00334
00335 if (current > MAX_CURRENT_ADC )
00336 {
00337 PORTC &= ~(1<<OVERCURRENT_PIN);
00338 if( speed >= 2 )
00339 {
00340 speed -= 2;
00341 }
00342 }
00343 else
00344 {
00345 PORTC |= (1<<OVERCURRENT_PIN);
00346
00347
00348 setspeed = Get_ADC8(ADC_MUX_SPEED_REF)*2;
00349
00350 if( setspeed > speed )
00351 {
00352 ++speed;
00353 }
00354 else
00355 {
00356 if( setspeed < speed )
00357 {
00358 --speed;
00359 }
00360 }
00361 }
00362
00363 Set_Speed(speed);
00364 }
00365 }
00366