目次

単相誘導電動機処理

 単相誘導電動機を動かすために、次のブロック図
 を見て、始動処理、速度制御を考えます。



 左が交流→直流のコンバータで、右が直流→交流のインバータです。

 コンバータには、ブリッジダイオードが使えます。



 インバータには、DCモータ用のHブリッジICを
 使えば、簡単です(耐圧に注意します)。




始動処理

 電動機の回転を始めるには、電圧を一気に与えます。  単相誘導電動機では、大電力を扱うことが少ない  ので電圧を一気に与えるだけで充分です。  ただし、機械的な衝撃が問題になるような場合  小さな直流電動機を用意して、少し回転させて  から、インバータから電圧を与えます。  エンジンスタータのように、DCモータで回転力を  与えてから、回すので確実に始動できます。

速度制御

 誘導電動機の回転は、インバータの周波数を変化  させて制御します。  インバータの周波数は0〜100Hz程度で、これを  0〜10Vに対応させて、アナログ回路で制御する  方法が利用されていました。  VCO(Voltage Controlled Oscillator)に対して、可変電圧  を与えて、発振周波数を変化させます。  生成したクロックにより、直流電圧をスイッチングし  インバータの周波数を可変します。  負荷の状態で、周波数が変動しないようにフィード  バック回路を入れて制御します。  現在は、デジタル回路が主流なので以下のように  A/Dコンバータとタイマー/カウンタを利用した  速度制御システムを構成します。  ワンチップマイコンを利用すると、A/Dコンバータや  タイマー/カウンタを内蔵しているので、外部回路  を減らせます。  ファームウエアの変更により制御内容を変えられるので  インバータはマイコンを利用するのが普通になりました。  0〜100Hzを、マイコンに与える数値で指定して  インバータの周波数を変更するファームウエアを  作成してみます。  DIPスイッチで、周波数を0〜100の数値で設定し  指定ピンからDUTY比50%のクロックを出力する  仕様を考えます。  100kHzクロックを最小分解能として、与えられた  数値分カウンタを回します。カウンタ値がH或い  はLを出力する時間になるようにしました。  DIPスイッチの値は、外部割込みによるトリガーで  マイコン内部に取り込みます。DIPスイッチの値を  インデクスにして、カウンタ値を配列から取出して  設定します。  16MHzをシステムクロックとするファームウエアは以下。 #include <avr/io.h> #include <avr/interrupt.h> #define MASKF0 0xf0 #define MASK0F 0x0f #define MASK80 0x80 #define MASK40 0x40 #define FOSC 50000 #define OFF 0 #define ON OFF+1 typedef unsigned char UBYTE ; typedef unsigned short UWORD ; typedef signed char SBYTE ; typedef signed short SWORD ; volatile UBYTE tflag ; volatile UBYTE eflag ; volatile UWORD count ; volatile UBYTE scnt ; volatile UBYTE fx ; volatile UBYTE bport ; volatile UBYTE cntx[100] ; /*--------------------------------*/ /* Insert user functions protoype */ /*--------------------------------*/ void user_initialize(void); /*------*/ /* main */ /*------*/ int main(void) { /* initialize port and variables */ user_initialize(); /* enable interrupt */ sei(); /* endless loop */ while ( ON ) { /* get divider */ if ( eflag ) { /* clear flag */ eflag = OFF ; /* get divider */ bport = PINB ; /* conversion */ if ( bport > 100 ) { bport %= 101 ; } /* store */ fx = bport ; } /* handling */ if ( tflag ) { /* clear flag */ tflag = OFF ; /* update counter */ count-- ; /* judge */ if ( count == 0 ) { /* initialize */ count = *(cntx+fx) ; /* increment */ scnt++ ; } /* impress */ if ( fx == 0 ) { PORTD &= ~MASK40 ; } else { if ( scnt & 1 ) { PORTD |= MASK40 ; } else { PORTD &= ~MASK40 ; } } } } /* dummy */ return 0 ; } /*-----------------------*/ /* Insert user functions */ /*-----------------------*/ void user_initialize(void) { UBYTE i ; /* PORT B */ PORTB = 0b11111111 ; /* 11111111 */ DDRB = 0b00000000 ; /* iiiiiiii */ /* PORT D */ PORTD = 0b00001111 ; /* 00001111 */ DDRD = 0b11110000 ; /* ooooiiii */ /* clear flags */ tflag = OFF ; eflag = OFF ; /* initialize registers */ fx = 50 ; count = FOSC / fx ; scnt = 0 ; /* generate table */ *(cntx+0) = 0 ; for ( i = 1 ; i < 101 ; i++ ) { *(cntx+i) = FOSC / i ; } /* initialize external interrupt */ { /* set prescaler INT0 falling_edge interrupt */ MCUCR = (1 << ISC01) ; /* Enable interrupt */ GIMSK = (1 << INT0) ; } /* initialize timer1 */ { /* clear counter */ TCNT1 = 0 ; /* initialize counter */ OCR1A = 159 ; OCR1B = 299 ; /* set prescaler (/1) */ /* select clock and prescaler (generate 100kHz) */ TCCR1B = (1 << WGM12) | (1 << CS10) ; /* Enable interrupt */ TIMSK = (1 << OCIE1A) ; } } /* INT0 external interrupt */ ISR(INT0_vect) { eflag = ON ; } /* Timer1 interrupt */ ISR(TIMER1_COMPA_vect) { tflag = ON ; }  インバータに接続した誘導電動機の回転は、ロータリー  エンコーダをセンサーとしてマイコンにパルス入力します。

目次

inserted by FC2 system