忍者ブログ

Azukish

消えゆく世界と流れる未来に最後の灯を since 2006/4/3

2024/04/29

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

2020/04/26

MSP-EXP430FR2433でステッパモータを回す

表題のとおりですが、MSP-EXP430FR2433でステッパモータを回してみた。
買ったのは下記のキット。

ULN2003という、非常に簡単なトランジスタが7個並列に並んだだけのIC(と言えるのか?)で、LEDが付いた小基板とユニポーラのモータがセットになったものが付いているやつ。
1000円と廉価(なんか値上がりしてるけど、似たようなキット買うよろし)なので、遊んで見る分にはちょうど良いと思われる。

2020/11/29追記:
コードの51行目の条件はP1OUT&BIT0かあるいは適当なフラグを定義して使うのが適切かも。
あと、eZ-FETとMSP430本体をつなぐジャンパJ101のTXDとRXDがプルアップされることがあるようなので、これらのジャンパを外すことを推奨。
当方の環境では、RXD(P1.5)のL出力が1.6V程度になってしまい、ULQ2003AのL閾値を満たさなかったため。



接続は下記のYoutubeの1:16くらいを参考にして欲しい。

小基板の入力、LEDの発光部、モーターの入力はそれぞれ
IN1→A→青
IN2→B→ピンク
IN3→C→黄
IN4→D→オレンジ
となっているため、それぞれ、IN1とIN3が対、IN2とIN4が対になっていることに注意

MSP-EXP430FR2433はP1.1とP1.2がそれぞれTA0.1とTA0.2、P1.4とP1.5はTA1.1とTA1.2に対応しているため、例えばP1.1→IN1、P1.2→IN3、P1.4→IN2、P1.5→IN4のように接続すると良い。

以下書き込むプログラム:
#include <msp430.h>

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	CSCTL1 |= DCORSEL1;

	// GPIO Interruption
	P1DIR |= BIT0;
P2OUT |= BIT3;                          // Configure P2.3 as pulled-up
P2REN |= BIT3;                          // P2.3 pull-up register enable
P2IES |= BIT3;                          // P2.3 Hi->Low edge
P2IE  |= BIT3;                          // P2.3 interrupt enabled

	P1OUT = 0;
	P1DIR  |= BIT1 | BIT2 | BIT4 | BIT5;    // P1.1-P1.2, P1.4-P1.5 output
P1SEL1 |= BIT1 | BIT2 | BIT4 | BIT5;    // P1.1-P1.2, P1.4-P1.5 options select

// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
P2IFG &= ~BIT3;

// P1.1: TA0.1
// P1.2: TA0.2
TA0CCR0 = 0xc000;                       // PWM Period
TA0CCTL1 = OUTMOD_2;                    // CCR1 reset/set
TA0CCR1 = 0x3fff;                       // CCR1 PWM duty cycle
TA0CCTL2 = OUTMOD_6;                    // CCR2 reset/set
TA0CCR2 = 0x3fff;                       // CCR2 PWM duty cycle
TA0CTL = TASSEL__SMCLK | MC__CONTINUOUS | TACLR;  // SMCLK, up mode, clear TAR

// P1.4: TA1.1
// P1.5: TA1.2
TA1CCR0 = 0x8000;                       // PWM Period
TA1CCTL1 = OUTMOD_6;                    // CCR1 reset/set
TA1CCR1 = 0;                            // CCR1 PWM duty cycle
TA1CCTL2 = OUTMOD_2;                    // CCR2 reset/set
TA1CCR2 = 0;                            // CCR2 PWM duty cycle
TA1CTL = TASSEL__SMCLK | MC__CONTINUOUS  | TACLR;  // SMCLK, up mode, clear TAR

__bis_SR_register(LPM0_bits | GIE);     // Enter LPM0
__no_operation();                       // For debugger
}

// Port 2 interrupt service routine
// Reverse rotation polarity
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
P2IFG &= ~BIT3;                         // Clear P2.3 IFG
if (TA0CCTL1 == OUTMOD_2) {
  TA0CCTL1 = OUTMOD_6;
  TA0CCTL2 = OUTMOD_2;
} else {
  TA0CCTL1 = OUTMOD_2;
  TA0CCTL2 = OUTMOD_6;
}
P1OUT ^= BIT0;
}
制御としては下記のような図になると思う。

要は同じタイマ源を使って適当に位相を90度ずらしてやれば良いというわけ。
MSP430G2553みたいな安いやつだとタイマ出力が4つ(2x2)付いていないことがあるので、そこはデータシート読むなりして対策する必要がある。
で、P2.3のボタンを押すとTA0.1/TA0.2の波形が逆になることで逆回転を始めるような感じ。
ただし、手持ちのボードではチャタリングかなにかでうまく動かないことがあった。
フィルタかデジタル式のデグリッチを入れる必要があると思う。

拍手

コメント













カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

アーカイブ

AD

Azkishはamazon.co.jpを宣伝しリンクすることによって サイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。