目次
前
次
単相誘導電動機処理
単相誘導電動機を動かすために、次のブロック図
を見て、始動処理、速度制御を考えます。
左が交流→直流のコンバータで、右が直流→交流のインバータです。
コンバータには、ブリッジダイオードが使えます。
インバータには、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 ;
}
インバータに接続した誘導電動機の回転は、ロータリー
エンコーダをセンサーとしてマイコンにパルス入力します。
目次
前
次