UMEHOSHI ITA TOP PAGE

Hブリッジ回路によるブラシ付DCモーターの駆動

DCモーターの駆動用の絶縁型Hブリッジ回路が2つあり、それぞれの出力端子がCN6とCN7になっています。
以下にCN6の制御に注目したHブリッジ制御回路図を示します。(CN7の制御も同等の手法で行われす。)

上記回路図で、RB2とRB3が共に0である場合。フォトカプラが共にOFF状態です。(CN6端子の制御です。)
上記回路図で、RB2が1でとRB3が0ある場合。フォトカプラU05がONでU06がOFFの時、赤の破線で示すように電流が流れます。
(便宜上、上記を正転とすると、下記は逆転とします。)
上記回路図で、RB2が0でとRB3が1ある場合。フォトカプラU05がOFFでU06がOOの時、青の破線で示すように電流が流れます。

以下のコードでは、CN6端子を、リセットごとに→正転→逆転→停止と切り替えるコードです。
この制御は、グローバル変数 cn6を→1→2→0と切り替えて、その情報でCN6を制御します。。
また、これを利用してLEDもcn6を→D1:OFF,D2:ON →D1:ON,D2:OFF →D1:OFF,D2:OFFと切り替えます。
(下記C言語ソースは、「umehoshiEdit」ツールで、ビルド実行できます。
右ソースは逆アセンブルしたコードで、これを参考に、後述のアセンブリソースを作っています。)

#include <xc.h>// cn6_mortor_rom.c
#include "common.h"

#define CN6B02	0x0004 //CN6のPORTBbits.RB2制御用bit
#define CN6B03	0x0008 //CN6のPORTBbits.RB2制御用bit
#define D1LED	0x8000 // RB7
#define D2LED	0x0020 // RB5

int cn6 = 0;// 0→1→2→0→1→2・・・

__attribute__((address( 0x80005000 ))) void set_boot(void);
void set_boot(){// 一回だけ実行することで、ROM(0x9D03fff0)に登録
	extern void start_boot();
	// パワーオンの場合だけ、実行する関数start_bootの登録
	_nvm_write_word(0x9D03fff0,(uint32_t)start_boot);
}

// ROM領領域置は、以下のように絶対アドレスを指定しなければならない。
__attribute__((address( 0x9D020300 ))) void start_boot(void);
void start_boot(){// パワーONオンで実行する関数定義
	cn6 = 0;
	PORTBCLR = CN6B02 | CN6B03 | D1LED | D2LED;
}

// ROM領領域で、パワーONを伴わないResetで起動する絶対番地( 0x9D020000 )
__attribute__((address( 0x9D020000 ))) void start_main (void);
void start_main()
{
	cn6++;
	if(cn6 == 1){		// 正転と、D1を0、D2を1
		PORTBCLR = CN6B03 | D1LED;
		PORTBSET = CN6B02 | D2LED;

	} else if(cn6 == 2){	// 逆転と、D1を1、D2を0
		PORTBCLR = CN6B02 | D2LED;
		PORTBSET = CN6B03 | D1LED;

	} else {
		cn6 = 0;
		PORTBCLR = CN6B02 | CN6B03 | D1LED | D2LED;// 全てOFF

	}
}



80005000 <set_boot>:
80005000:	27bdffe8 	addiu	sp,sp,-24
80005004:	afbf0014 	sw	ra,20(sp)
80005008:	afbe0010 	sw	s8,16(sp)
8000500c:	03a0f021 	move	s8,sp
80005010:	3c02a000 	lui	v0,0xa000
80005014:	344240f4 	ori	v0,v0,0x40f4
80005018:	8c420000 	lw	v0,0(v0)
8000501c:	3c039d02 	lui	v1,0x9d02
80005020:	24630300 	addiu	v1,v1,768
80005024:	3c049d03 	lui	a0,0x9d03
80005028:	3484fff0 	ori	a0,a0,0xfff0
8000502c:	00602821 	move	a1,v1
80005030:	0040f809 	jalr	v0
80005034:	00000000 	nop
80005038:	03c0e821 	move	sp,s8
8000503c:	8fbf0014 	lw	ra,20(sp)
80005040:	8fbe0010 	lw	s8,16(sp)
80005044:	27bd0018 	addiu	sp,sp,24
80005048:	03e00008 	jr	ra
8000504c:	00000000 	nop

80008000 <cn6>:
80008000:	00000000 	nop

9d020000 <start_main>:
9d020000:	27bdfff8 	addiu	sp,sp,-8
9d020004:	afbe0004 	sw	s8,4(sp)
9d020008:	03a0f021 	move	s8,sp
9d02000c:	3c028001 	lui	v0,0x8001
9d020010:	8c428000 	lw	v0,-32768(v0)
9d020014:	24430001 	addiu	v1,v0,1
9d020018:	3c028001 	lui	v0,0x8001
9d02001c:	ac438000 	sw	v1,-32768(v0)
9d020020:	3c028001 	lui	v0,0x8001
9d020024:	8c438000 	lw	v1,-32768(v0)
9d020028:	24020001 	li	v0,1
9d02002c:	14620009 	bne	v1,v0,9d020054 <start_main+0x54>
9d020030:	00000000 	nop
9d020034:	3c02bf88 	lui	v0,0xbf88
9d020038:	34038008 	li	v1,0x8008
9d02003c:	ac436124 	sw	v1,24868(v0)
9d020040:	3c02bf88 	lui	v0,0xbf88
9d020044:	24030024 	li	v1,36
9d020048:	ac436128 	sw	v1,24872(v0)
9d02004c:	0b408027 	j	9d02009c <.L3>
9d020050:	00000000 	nop
9d020054:	3c028001 	lui	v0,0x8001
9d020058:	8c438000 	lw	v1,-32768(v0)
9d02005c:	24020002 	li	v0,2
9d020060:	14620009 	bne	v1,v0,9d020088 <start_main+0x88>
9d020064:	00000000 	nop
9d020068:	3c02bf88 	lui	v0,0xbf88
9d02006c:	24030024 	li	v1,36
9d020070:	ac436124 	sw	v1,24868(v0)
9d020074:	3c02bf88 	lui	v0,0xbf88
9d020078:	34038008 	li	v1,0x8008
9d02007c:	ac436128 	sw	v1,24872(v0)
9d020080:	0b408027 	j	9d02009c <.L3>
9d020084:	00000000 	nop
9d020088:	3c028001 	lui	v0,0x8001
9d02008c:	ac408000 	sw	zero,-32768(v0)
9d020090:	3c02bf88 	lui	v0,0xbf88
9d020094:	3403802c 	li	v1,0x802c
9d020098:	ac436124 	sw	v1,24868(v0)

9d02009c <.L3>:
9d02009c:	03c0e821 	move	sp,s8
9d0200a0:	8fbe0004 	lw	s8,4(sp)
9d0200a4:	27bd0008 	addiu	sp,sp,8
9d0200a8:	03e00008 	jr	ra
9d0200ac:	00000000 	nop

9d020300 <start_boot>:
9d020300:	27bdfff8 	addiu	sp,sp,-8
9d020304:	afbe0004 	sw	s8,4(sp)
9d020308:	03a0f021 	move	s8,sp
9d02030c:	3c028001 	lui	v0,0x8001
9d020310:	ac408000 	sw	zero,-32768(v0)
9d020314:	3c02bf88 	lui	v0,0xbf88
9d020318:	3403802c 	li	v1,0x802c
9d02031c:	ac436124 	sw	v1,24868(v0)
9d020320:	03c0e821 	move	sp,s8
9d020324:	8fbe0004 	lw	s8,4(sp)
9d020328:	27bd0008 	addiu	sp,sp,8
9d02032c:	03e00008 	jr	ra
9d020330:	00000000 	nop

  以下に、上記の実際に動作した、アセンブリリストを示します。上のC言語の逆アセンブルリストをコードにしてみました。

(UMEHOSHI ITA基板で使っている制御チップのPIC32MX270F256B用(MIPS32系)アセンブリに必要な情報の概要です。)

上記のモータ制御を参考に作ったコードです。

  上記で編集したアセンブリソースを、左のボタンで「アッセンブル」できます。
番地から実行するUME専用Hexコマンドを、 最後に追加埋め込みする場合にチェックする==>

上記で生成した[UME専用Hexコマンド]のテキストを コピー(CTRL+A CTRL+C)してUMEHOSHI ITAへ転送して動かすことができます。

上記コードを、Pythonで[UMEHOSHI ITA]基板で転送して実行する手順の紹介

予め、pythonが動作するターミナル(コマンドプロンプト)を、開いて準備して置くとよいでしょう。
以下では、R:\workを作業位置(カレントディレクトリ)にして説明しています。
また、pythonプログラムでは、pyserialモジュールを追加しておく必要があります。
「pip show serial」のコマンド操作で、インストールされているか確認できます。
インストールされていない場合は、「pip install pyserial」の操作で、インストールしておくと良いでしょう。

【1】 [UMEHOSHI ITA]基板で転送するテキストファイル「command.txt」を用意します。

上記の「アセンブラ編集部」の直下にある「アセンブル」ボタンをクリックします。
(このボタン右下の、指定アドレスから実行させるコード埋め込み用のチェックボックスがチェックされていること確認して行う)

「アセンブラ編集部」のソースにエラーが無ければ、[UME専用Hexコマンド]のテキストが、その下の TextArea に表示されます。
(エラーがあれば、エラーが無くHEXコードが生成されるまで、「アセンブラ編集部」の修正とアセンブル」を繰り返します)

メモ帳などで、「command.txt」のファイルを生成して開き、
上記操作で得られたTextAreaの[UME専用Hexコマンド]のテキストを、 コピー(CTRL+A CTRL+C)操作し、
  それを「command.txt」編集画面で貼り付け((CTRL+V)して、保存します。
保存位置は、pythonが動作するターミナルの作業位置(カレントディレクトリ)です。(後述例では、R:\workで示しています)

【2】 [UMEHOSHI ITA]基板へ[command.txt」を転送するpythonファイルを用意します。

「instruct.py」の名前のソースファイルを、[command.txt」と同じ位置に作ります。
(一度作れば、次回は使うだけで、作る必要はありません。(CTRL+A CTRL+C)操作で、コピー可能)


【3】 [UMEHOSHI ITA]基板へ[command.txt」を転送して実行させる。

上記で作った「instruct.py」と[command.txt」が存在する位置で、 pythonが動作するターミナル(コマンドプロンプト)を開きます。
以下では、この作業位置(カレントディレクトリ)が、R:\workである場合の例で説明しています。

まず [UMEHOSHI ITA]基板と、PCをUSBで接続します。

次にターミナルプロンプトを『powershell』にして、
『Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption』
のコマンド操作で、USBのシリアル デバイスのCOM番号を調べます。

実行例
R:\work>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS R:\work> Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption

Caption
-------
Bluetooth リンク経由の標準シリアル (COM10)
USB シリアル デバイス (COM4)
Bluetooth リンク経由の標準シリアル (COM11)
PS R:\work>

この実行例から、USB シリアル デバイス がCOM4が使える状態になっていることが分かります。
このリンクページで示すように、デバイスマネージャで確認することもできます)
この番号の4を記憶して次の転送プログラム実行に進むのですが、 そのUSB シリアル デバイス が見つからない場合、次の点が考えられます。

  • 正しく[UMEHOSHI ITA]基板がUSBで接続されていない。
  • USBのCDCドライバがWindowsで使える状態になっていない。
       (Microchip社 USB CDC用 Driverが自動的にインストールされるはずですが、それが働いていないなど )
  • [UMEHOSHI ITA]基板で、既にUSBを介さないプログラムが動いている。
      (この場合、電源を入れ直す(またはSW1とSW2を押して、SW1を離してから2秒以内でSW2を離す操作)初期化で、USB通信が可能となります)
いずれにしても、接続でUSB シリアル デバイスCOM番号が得られないと、次に進めません。

続いて、以下の『python command.txt』の操作で、転送実行プログラム(上記のアセンブラ用の例)を実行します。
実行例 (最初に上記で得られた番号の4をキー入力しています。)
R:\work>python instruct.py
USB シリアル デバイスで、使用するCOMの番号を入力>>4
S04800080000000000000  D9チェックサム: 0
USB受信● b'S04800080000000000000D9\r\n'
USB受信● b'SET:80008000\r\n'
S108000500000E8FFBD271400BFAF1000BEAF21F0A003  17チェックサム: 0
USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n'
USB受信● b'SET:80005000\r\n'
S10800050100000A0023CF44042340000428C029D033C  B1チェックサム: 0
USB受信● b'S10800050100000A0023CF44042340000428C029D033CB1\r\n'
USB受信● b'SET:80005010\r\n'
S10800050200000036324039D043CF0FF843421286000  A9チェックサム: 0
USB受信● b'S10800050200000036324039D043CF0FF843421286000A9\r\n'
USB受信● b'SET:80005020\r\n'
S10800050300009F840000000000021E8C0031400BF8F  B0チェックサム: 0
USB受信● b'S10800050300009F840000000000021E8C0031400BF8FB0\r\n'
USB受信● b'SET:80005030\r\n'
S1080005040001000BE8F1800BD270800E00300000000  BDチェックサム: 0
USB受信● b'S1080005040001000BE8F1800BD270800E00300000000BD\r\n'
USB受信● b'SET:80005040\r\n'
S109D02000000F8FFBD270400BEAF21F0A0030180023C  34チェックサム: 0
USB受信● b'S109D02000000F8FFBD270400BEAF21F0A0030180023C34\r\n'
USB受信● b'SET:9D020000\r\n'
S109D020010000080428C010043240180023C008043AC  C1チェックサム: 0
USB受信● b'S109D020010000080428C010043240180023C008043ACC1\r\n'
USB受信● b'SET:9D020010\r\n'
S109D0200200001000224090062140000000088BF023C  DCチェックサム: 0
USB受信● b'S109D0200200001000224090062140000000088BF023CDC\r\n'
USB受信● b'SET:9D020020\r\n'
S109D0200300008800324246143AC88BF023C24000324  9Aチェックサム: 0
USB受信● b'S109D0200300008800324246143AC88BF023C240003249A\r\n'
USB受信● b'SET:9D020030\r\n'
S109D02004000286143AC2580400B000000000180023C  C7チェックサム: 0
USB受信● b'S109D02004000286143AC2580400B000000000180023CC7\r\n'
USB受信● b'SET:9D020040\r\n'
S109D020050000080438C020002240900621400000000  FEチェックサム: 0
USB受信● b'S109D020050000080438C020002240900621400000000FE\r\n'
USB受信● b'SET:9D020050\r\n'
S109D0200600088BF023C24000324246143AC88BF023C  60チェックサム: 0
USB受信● b'S109D0200600088BF023C24000324246143AC88BF023C60\r\n'
USB受信● b'SET:9D020060\r\n'
S109D0200700008800324286143AC2580400B00000000  CCチェックサム: 0
USB受信● b'S109D0200700008800324286143AC2580400B00000000CC\r\n'
USB受信● b'SET:9D020070\r\n'
S109D020080000180023C008040AC88BF023C2C800324  7Eチェックサム: 0
USB受信● b'S109D020080000180023C008040AC88BF023C2C8003247E\r\n'
USB受信● b'SET:9D020080\r\n'
S109D02009000246143AC21E8C0030400BE8F0800BD27  56チェックサム: 0
USB受信● b'S109D02009000246143AC21E8C0030400BE8F0800BD2756\r\n'
USB受信● b'SET:9D020090\r\n'
S089D0200A0000800E00300000000  15チェックサム: 0
USB受信● b'S089D0200A0000800E0030000000015\r\n'
USB受信● b'SET:9D0200A0\r\n'
S109D02030000F8FFBD270400BEAF21F0A0030180023C  31チェックサム: 0
USB受信● b'S109D02030000F8FFBD270400BEAF21F0A0030180023C31\r\n'
USB受信● b'SET:9D020300\r\n'
S109D02031000008040AC88BF023C2C800324246143AC  6Bチェックサム: 0
USB受信● b'S109D02031000008040AC88BF023C2C800324246143AC6B\r\n'
USB受信● b'SET:9D020310\r\n'
S109D0203200021E8C0030400BE8F0800BD270800E003  72チェックサム: 0
USB受信● b'S109D0203200021E8C0030400BE8F0800BD270800E00372\r\n'
USB受信● b'SET:9D020320\r\n'
S049D0203300000000000  C4チェックサム: 0
USB受信● b'S049D0203300000000000C4\r\n'
USB受信● b'SET:9D020330\r\n'
R008000500000  61チェックサム: 0
実行スタートの Enter >>
USB受信● b'R00800050000061\r\n'
USB受信● b'START:80005000\r\n'
終了確認の Enter >>>
R:\work>

[command.txt」の中に"R008000500000"のような実行コマンドが存在すると、実行スタートの Enter >>の プロンプトが出て、一時停止します。
これで0x80005000からのRAM領域と、0x9D020000からと0x9D020300からのEEPROM領域にプログラムが配置されます。
そこでENTERキーを入力することで、"R00800050000061"が送られ、UMEHOSHI ITA基板で「0x80005000」番地から実行しますが、
それは、0x9D03fff0のEEPROM領域にパワーオンで実行するための0x9D020300から始まるstart_boot関数を登録するだけです。

ここで、USBのケーブル一度抜いて、改めて差し込んで電源を供給します。(パワーオン時だけ実行するstart_boot関数が実行)
そして赤のリセットスイッチを押すと、CN6コネクタに正転の電圧が印加されてモータを動かして、LEDのD2を点灯させます。
再び、赤のリセットスイッチを押すと、モータが逆転して、LEDのD2は消灯します。
再び、赤のリセットスイッチを押すと、モータが停止します。
再び、赤のリセットスイッチを押すと、モータの正転とLEDのLEDのD2の点灯に戻ります。
(リセットスイッチでstart_main()関数が実行され、cn6の変数が、0→1→2→0→1→2・・・と変化して対応のモータ制御が行わます。)

なお、EEPROMの消去は、こちらで示す方法で消去できます。