课前复习提问: 1 、数控机床故障的分类? 2 、数控机床故障的诊断原则? 3 、数控机床故障诊断的方法? 4 、数控机床故障诊断的步骤?
步進馬達控制實習
description
Transcript of 步進馬達控制實習
第第 六六 章章
步進馬達控制實習
VHDL 數位電路實習與專題設計文魁資訊 -UE301
VHDL數位電路實習與專題設計 2---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
內容大綱
單元 9-1 步進馬達全步控制(一相激磁)實習 單元 9-2 步進馬達全步控制(二相激磁)實習 單元 9-3 步進馬達半步控制(一二相激磁)實習 單元 9-4 步進馬達轉向控制實習 單元 9-5 步進馬達轉向與全步半步選擇控制實習 單元 9-6 步進馬達轉速控制實習 單元 9-7 步進馬達步進數控制實習
VHDL數位電路實習與專題設計 3---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
相關知識 四相式步進馬達驅動示意圖
N
S
A A
B
B
+V
+V
A
A
B B
轉子
4 相 6 線式步進馬達
VHDL數位電路實習與專題設計 4---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
相關知識 ( 續 ) 一個四相步進馬達的工作方式如下圖所示;其中線圈接點所連接
的開關是以脈波控制電晶體的飽和或截止加以實現。
VA A B B
VHDL數位電路實習與專題設計 5---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
相關知識 ( 續 ) 而在一般的實驗中,我們常常拿內含四組 NPN 達靈頓電晶體的 FT5754
元件來驅動步進馬達,達靈頓電晶體在 B 極輸入正電壓而導通飽和時,可以放大 C 極端從線圈往下流通的電流,電源能否提供足夠的電流來驅動步進馬達會影響到步進馬達的轉速與力矩。 FT5754 外觀及內部結構如下所示:
GND
B
C Vcc
FT5754
B1 C1 Vcc C2 B2 G N D
G N D
B3 C3 Vcc B4 C4
VHDL數位電路實習與專題設計 6---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
A
A B B
5V
C1 C3 C2 C4
B1 B2 B3 B4
Vcc
Vcc
GND
GND
5V
220Ωx4
相關知識 ( 續 ) 當採用 FT5754 的達靈頓對電晶體來作為連接步進馬達的開關時,其電路
的結構如下所示:
VHDL數位電路實習與專題設計 7---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
相關知識 ( 續 ) 一相激磁的作法是控制每次只有一個線圈有電流通過,當四個線圈輪流
動作時,步進馬達便能開始轉動。一相激磁的控制順序如下表所列:
A B A B
線圈控制狀態 轉動方向
順時針 逆時針
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
VHDL數位電路實習與專題設計 8---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
實驗電路圖
/A
EPM7064S/LCC44
4568
43
I/OI/OI/OI/O
I/GCLK1
STEP3
0
/B
STEP0STEP1
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+
A
CLOCK
STEP2
MOTOR STEPPER
123
4 5 6
VCC
B
VHDL數位電路實習與專題設計 9---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
程式與說明 步進馬達全步控制(一相激磁) 程式碼
11 entity stepmotor_fulla is12 port(13 clk : in std_logic;14 step: out std_logic_vector(3 downto 0)15 );16 end stepmotor_fulla;1718 architecture arch of stepmotor_fulla is19 signal cnt : std_logic_vector(1 downto 0);20 begin21
22 ---------- process ---------23 process(clk)24 begin25 if clk'event and clk='1' then26 cnt <= cnt+1;27 end if;28 end process; 29 step <= "1000" when cnt=0 else30 "0100" when cnt=1 else31 "0010" when cnt=2 else32 "0001";33 end arch;
VHDL數位電路實習與專題設計 10---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 11---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習 程式與說明
主程式之電路連線圖:
VHDL數位電路實習與專題設計 12---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 FPT-3 實驗板
輸入clock
腳位43
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位4
5
6
8
調整 Jumper J2 的位置
由 IO0~IO3 拉出激磁信號線
接上 5V 直流電源
進行步進馬達實驗時,我們需要把 CPLD 的 I/O 延伸出來以外接 FT5754 和步進馬達等周邊元件,因此我們可以將 FPT-3 實驗板上的 jumper J2 由原本的 1 、 2 PIN 腳( Internal I/O ON )改套到 2 、 3 PIN 腳上( External I/O ON ),再從實驗板右邊CON1 上將 IO0~IO3 這幾個 PIN 腳跳線到麵包板上即可得到所需的激磁信號。另外 FT5754 和步進馬達線圈共同點所需的電源必須與實驗板上接出來的信號具有共同的地電位,這也是實驗中要留意的地方。
VHDL數位電路實習與專題設計 13---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板 欲將程式檔案燒錄於力浦電子 LP-2900 實驗板時,我們必須由實驗板
上拉出 FT5754 和步進馬達所需的正、負電源,並由 CPLD-EPF10K10 CHIP-BOARD 上預留的焊孔以單心線拉出激磁信號( step(3)~setp(0) ):
VHDL數位電路實習與專題設計 14---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-1 步進馬達全步控制(一相激磁)實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz )
-------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;---------------------------------------------------------------------------- 輸入
clock
腳位
55
輸出
Step(3)
Step(2)
Step(1)
Step(0)
腳位
37
38
39
41
VHDL數位電路實習與專題設計 15---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習
相關知識 二相激磁的控制方法是每次都讓兩個線圈通過電流,每一個步驟可以移
動一個步進角 :
A B A B
線圈控制狀態 轉動方向
順時針 逆時針
1 1 1 0 0
2 0 1 1 0
3 0 0 1 1
4 1 0 0 1
A
VHDL數位電路實習與專題設計 16---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習
實驗電路圖
/A
EPM7064S/LCC44
4568
43
I/OI/OI/OI/O
I/GCLK1
STEP3
0
/B
STEP0STEP1
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+
A
CLOCK
STEP2
MOTOR STEPPER
123
4 5 6
VCC
B
VHDL數位電路實習與專題設計 17---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習
程式與說明 步進馬達全步控制(二相激磁) 程式碼
12 entity stepmotor_fullb is13 port(14 clk : in std_logic;15 step: out std_logic_vector(3 downto 0)16 );17 end stepmotor_fullb;1819 architecture arch of stepmotor_fullb is20 signal cnt : std_logic_vector (1 downto 0);21 begin22
23 ---------- process ---------24 process(clk)25 begin26 if clk'event and clk='1' then27 cnt <= cnt+1;28 end if;29 end process;30 31 step <= "1100" when cnt=0 else32 "0110" when cnt=1 else33 "0011" when cnt=2 else34 "1001";35 end arch;
VHDL數位電路實習與專題設計 18---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 19---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習 程式與說明
主程式之電路連線 圖:
VHDL數位電路實習與專題設計 20---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 FPT-3 實驗板
輸入clock
腳位43
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位4
5
6
8
調整 Jumper J2 的位置
由 IO0~IO3 拉出激磁信號線
接上 5V 直流電源
進行步進馬達實驗時,我們需要把 CPLD 的 I/O 延伸出來以外接 FT5754 和步進馬達等周邊元件,因此我們可以將 FPT-3 實驗板上的 jumper J2 由原本的 1 、 2 PIN 腳( Internal I/O ON )改套到 2 、 3 PIN 腳上( External I/O ON ),再從實驗板右邊CON1 上將 IO0~IO3 這幾個 PIN 腳跳線到麵包板上即可得到所需的激磁信號。另外 FT5754 和步進馬達線圈共同點所需的電源必須與實驗板上接出來的信號具有共同的地電位,這也是實驗中要留意的地方。
VHDL數位電路實習與專題設計 21---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板 欲將程式檔案燒錄於力浦電子 LP-2900 實驗板時,我們必須由實驗板
上拉出 FT5754 和步進馬達所需的正、負電源,並由 CPLD-EPF10K10 CHIP-BOARD 上預留的焊孔以單心線拉出激磁信號( step(3)~setp(0) ):
VHDL數位電路實習與專題設計 22---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-2 步進馬達全步控制(二相激磁)實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz )
-------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;---------------------------------------------------------------------------- 輸入
clock
腳位
55
輸出
Step(3)
Step(2)
Step(1)
Step(0)
腳位
37
38
39
41
VHDL數位電路實習與專題設計 23---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習 相關知識
一二相激磁的作法是以一相激磁和二相激磁來交替控制,在定子繞組切換激磁線圈電壓時,仍有一個線圈上有電流通過,可保持一定的力矩以維持運轉上的平穩,而其耗電量又比二相激磁來得節省。一二相激磁每次可以移動半個步進角,其激磁的控制順序如下:
A B A B
線圈控制狀態 轉動方向順時針 逆時針
1 1 0 0 0
2 1 1 0 0
3 0 1 0 0
4 0 1 1 0
5 0 0 1 0
6 0 0 1 1
7 0 0 0 1
8 1 0 0 1
VHDL數位電路實習與專題設計 24---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習
實驗電路圖
/A
EPM7064S/LCC44
4568
43
I/OI/OI/OI/O
I/GCLK1
STEP3
0
/B
STEP0STEP1
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+
A
CLOCK
STEP2
MOTOR STEPPER
123
4 5 6
VCC
B
VHDL數位電路實習與專題設計 25---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習
程式與說明 步進馬達半步控制(一二相激磁) 程式碼
12 entity stepmotor_half is13 port(14 clk : in std_logic;15 step: out std_logic_vector(3 downto 0)16 );17 end stepmotor_half;1819 architecture arch of stepmotor_half is20 signal cnt : std_logic_vector(2 downto 0);21 begin22 23 ---------- process ---------24 process(clk)25 begin26 if clk'event and clk='1' then27 cnt <= cnt+1;28 end if;29 end process;30
31 step <= "1000" when cnt=0 else32 "1100" when cnt=1 else33 "0100" when cnt=2 else34 "0110" when cnt=3 else35 "0010" when cnt=4 else36 "0011" when cnt=5 else37 "0001" when cnt=6 else38 "1001";39 end arch;
VHDL數位電路實習與專題設計 26---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 27---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習 程式與說明
主程式之電路連線 圖:
VHDL數位電路實習與專題設計 28---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 FPT-3 實驗板
輸入clock
腳位43
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位4
5
6
8
調整 Jumper J2 的位置
由 IO0~IO3 拉出激磁信號線
接上 5V 直流電源
進行步進馬達實驗時,我們需要把 CPLD 的 I/O 延伸出來以外接 FT5754 和步進馬達等周邊元件,因此我們可以將 FPT-3 實驗板上的 jumper J2 由原本的 1 、 2 PIN 腳( Internal I/O ON )改套到 2 、 3 PIN 腳上( External I/O ON ),再從實驗板右邊CON1 上將 IO0~IO3 這幾個 PIN 腳跳線到麵包板上即可得到所需的激磁信號。另外 FT5754 和步進馬達線圈共同點所需的電源必須與實驗板上接出來的信號具有共同的地電位,這也是實驗中要留意的地方。
VHDL數位電路實習與專題設計 29---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板 欲將程式檔案燒錄於力浦電子 LP-2900 實驗板時,我們必須由實驗板
上拉出 FT5754 和步進馬達所需的正、負電源,並由 CPLD-EPF10K10 CHIP-BOARD 上預留的焊孔以單心線拉出激磁信號( step(3)~setp(0) ):
VHDL數位電路實習與專題設計 30---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-3 步進馬達半步控制(一二相激磁)實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz )
-------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;---------------------------------------------------------------------------- 輸入
clock
腳位
55
輸出
Step(3)
Step(2)
Step(1)
Step(0)
腳位
37
38
39
41
VHDL數位電路實習與專題設計 31---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習
相關知識 本實驗中,我們將設計一個可以控制上、下數計數功能的 DIR鍵來控制
步進馬達一相激磁之正反轉
上、下數動作之控制程式碼的寫法如下: if clk'event and clk='1' then if dir='1' then cnt <= cnt+1; else cnt <= cnt-1; end if; end if;
VHDL數位電路實習與專題設計 32---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習
實驗電路圖
EPM7064S/LCC44
4568
43
37
I/OI/OI/OI/O
I/GCLK1
I/O
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+DIR
B
STEP1
STEP3
MOTOR STEPPER
123
4 5 6
STEP0
A
/B
STEP2
0
CLOCK
VCC
/A
SW1
VCC
VHDL數位電路實習與專題設計 33---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習
程式與說明 步進馬達轉向控制程式碼
11 entity stepmotor_dir is12 port(13 clk : in std_logic;14 dir : in std_logic;15 step: out std_logic_vector(3 downto 0)16 );17 end stepmotor_dir;1819 architecture arch of stepmotor_dir is20signal cnt : std_logic_vector(1 downto 0);21 begin2223 ---------- process ---------24 process(clk)25 begin
26 if clk'event and clk='1' then27 if dir='1' then28 cnt <= cnt+1;29 else30 cnt <= cnt-1;31 end if;32 end if;33 end process;3435 step <= "1000" when cnt=0 else36 "0100" when cnt=1 else37 "0010" when cnt=2 else38 "0001";39 end arch;
VHDL數位電路實習與專題設計 34---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 35---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習 程式與說明
主程式之電路連線 圖:
VHDL數位電路實習與專題設計 36---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 FPT-3 實驗板
輸入clock
dir
腳位43
37
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位4
5
6
8
進行步進馬達實驗時,我們需要把 CPLD 的 I/O 延伸出來以外接 FT5754 和步進馬達等周邊元件,因此我們可以將 FPT-3 實驗板上的 jumper J2 由原本的 1 、 2 PIN 腳( Internal I/O ON )改套到 2 、 3 PIN 腳上( External I/O ON ),再從實驗板右邊CON1 上將 IO0~IO3 這幾個 PIN 腳跳線到麵包板上即可得到所需的激磁信號。另外 FT5754 和步進馬達線圈共同點所需的電源必須與實驗板上接出來的信號具有共同的地電位,這也是實驗中要留意的地方。
調整 Jumper J2 的位置
由 IO0~IO3 拉出激磁信號線
接上 5V 直流電源
正反轉控制
VHDL數位電路實習與專題設計 37---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板
VHDL數位電路實習與專題設計 38---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-4 步進馬達轉向控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz )
-------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;---------------------------------------------------------------------------- 輸入
clock
dir
腳位
55
47
輸出
Step(3)
Step(2)
Step(1)
Step(0)
腳位
37
38
39
41
VHDL數位電路實習與專題設計 39---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習
相關知識 本實驗中,我們以 DIR鍵來控制步進馬達之正反轉動作;另外再利用 sel鍵來作步進馬達全步控制或半步控制的選擇。
實驗功能 DIR=‘1’ 時,步進馬達正轉; DIR=‘0’ 時,步進馬達反轉。 Sel=‘1’ 時,執行全步控制(二相激磁); Sel=‘0’ 時,執行半步控制(一
二相激磁)。
VHDL數位電路實習與專題設計 40---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習
實驗電路圖
/A
STEP3
SEL
STEP1
B
MOTOR STEPPER
123
4 5 6
A
STEP0
SW2
STEP2
/B
SW1
VCCCLOCK
VCC
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+DIR
EPM7064S/LCC44
4568
43
3739
I/OI/OI/OI/O
I/GCLK1
I/OI/O
0
VHDL數位電路實習與專題設計 41---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習
程式與說明 步進馬達轉向與全步半步選擇控制程式碼
12 entity stepmotor_dirsel is13 port(14 clk : in std_logic;15 dir : in std_logic;16 sel : in std_logic;17 step: out std_logic_vector(3 downto 0)18 );19 end stepmotor_dirsel;2021 architecture arch of stepmotor_dirsel is22 signal cnt : std_logic_vector(2 downto 0);23 begin2425 process(clk)26 begin27 if clk'event and clk='1' then28 if dir='1' then29 cnt <= cnt+1;30 else31 cnt <= cnt-1;32 end if;
33 end if;34 end process;3536 process(cnt,sel)37 begin38 if sel = '1' then39 case cnt is40 when "000"=>step<="1100";41 when "001"=>step<="0110";42 when "010"=>step<="0011";43 when "011"=>step<="1001";44 when "100"=>step<="1100";45 when "101"=>step<="0110";46 when "110"=>step<="0011";47 when "111"=>step<="1001";48 when others => null;49 end case;50 else
VHDL數位電路實習與專題設計 42---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習 程式與說明
步進馬達轉向與全步半步選擇控制程式碼 ( 續 )
51 case cnt is52 when "000"=>step<="1000";53 when "001"=>step<="1100";54 when "010"=>step<="0100";55 when "011"=>step<="0110";56 when "100"=>step<="0010";57 when "101"=>step<="0011";58 when "110"=>step<="0001";59 when "111"=>step<="1001";60 when others => null;61 end case;62 end if;63 end process;64 end arch;
VHDL數位電路實習與專題設計 43---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 44---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習 程式與說明
主程式之電路連線 圖:
VHDL數位電路實習與專題設計 45---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 FPT-3 實驗板
輸入clock
dir
sel
腳位43
3738
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位4
5
6
8
調整 Jumper J2 的位置
由 IO0~IO3 拉出激磁信號線
接上 5V 直流電源
正反轉控制
全半步控制
VHDL數位電路實習與專題設計 46---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板
VHDL數位電路實習與專題設計 47---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-5 步進馬達轉向與全步半步選擇控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz )
-------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;---------------------------------------------------------------------------- 輸入
clock
dir
sel
腳位
55
47
48
輸出
Step(3)
Step(2)
Step(1)
Step(0)
腳位
37
38
39
41
VHDL數位電路實習與專題設計 48---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習
相關知識 以一般的計數器除 N 之除頻電路來說, 1KHz ( 1000Hz )的頻率除一
所得到的頻率為 1000Hz 、除二得到 500Hz 、除三得到 333Hz 、除四得到 250Hz 、除五得到 200Hz …、 ,除八得到 125Hz ,我們可以很清楚的發現除 N 的除頻電路所得到的頻率切割結果並非是均勻分布的。
1 2 3 4 5 6 7 8100
200
300
400
500
600
700
800
900
1000
Hz
N=1
N=2
N=3
N=4 N=5
N=6 N=7 N=8
VHDL數位電路實習與專題設計 49---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習 積分除頻電路
若改以連續累加某一數值的方式來執行積分計算時,每當計數器的最高位元發生變化時( 0變 1 或 1變 0 ),就送出一個 CLK 信號,便可使得不同除頻器之間所分割的頻率變成較為均勻的分布。
首先,我們先實現下面的積分除頻電路,並從分析幾個例子的時序圖來分析與理解積分除頻電路的原理 :
6 entity stepmotor_speed is7 port( clk : in std_logic; -- 輸入週期時脈8 spd : in std_logic_vector(2 downto 0); -- 輸入連續累加值9 clk_new: out std_logic); -- 輸出 CLK 信號10 end stepmotor_speed;1112 architecture arch of stepmotor_speed is13 signal buf: std_logic_vector (3 downto 0); -- 四位元積分器14 signal dly : std_logic;15 begin
16 ---------- process ---------17 process(clk)18 begin19 if clk'event and clk='1' then20 dly <= buf(3); -- 延遲電路21 buf <= buf +('0' & spd); --積分器加上預設之輸入累加值22 end if;23 end process;2425 clk_new<=(buf(3) xor dly) and not clk; -- 輸出微分電路2627 end arch;
VHDL數位電路實習與專題設計 50---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習 積分除頻電路 ( 續 )
Buf3 在 8 個時脈週期中總共發生了 4次的 0->1 或 1->0 的變化。
利用微分的原理,讓 Buf3 的值每發生一次 0、 1 的變化時就送出一個 CLK 。 8 個時脈中共送出 4 個 CLK 。
0 1 1 0 0 1 1 0
0 1 0 1 1 0 1 0
Buf3 在 8 個時脈週期中總共發生了 6 次的0->1 或 1->0 的變化。
利用微分的原理,讓 Buf3 的值每發生一次 0 、1 的變化時就送出一個 CLK 。 8 個時脈中共送出 6 個 CLK 。
積分除頻電路動作原理(累加值為 4 )
積分除頻電路動作原理(累加值為 6 )
VHDL數位電路實習與專題設計 51---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習
積分除頻電路 ( 續 ) 積分除頻電路所得到的頻率分割曲線
1 2 3 4 5 6 7 8100
200
300
400
500
600
700
800
900
1000
Hz
N=1
N=2
N=3
N=4
N=5
N=6
N=7
N=8
VHDL數位電路實習與專題設計 52---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習
實驗電路圖
SPD3
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+
SPD1
STEP0
STEP3
SPD2
A
STEP1
CLOCK
MOTOR STEPPER
123
4 5 6
SW DIP-8
B
VCCSPD0
VCC
/A
/B
EPM7064S/LCC44
4568
43
361442
I/OI/OI/OI/O
I/GCLK1
I/OI/OI/OI/O
STEP2
VHDL數位電路實習與專題設計 53---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習
程式與說明 步進馬達轉速控制程式碼
12 entity stepmotor_speed is13 port(14 clk : in std_logic;15 spd : in std_logic_vector(3 downto 0);16 step: out std_logic_vector(3 downto 0)17 ); 18 end stepmotor_speed;19 20 architecture arch of stepmotor_speed is21 signal buf: std_logic_vector (4 downto 0);22 signal dly : std_logic;23 signal clk_new: std_logic;24 signal cnt : std_logic_vector(1 downto 0);25 begin
26 ---------- process ---------27 process(clk)28 begin29 if clk'event and clk='1' then30 dly <= buf(4);31 buf <= buf +('0' & spd);32 end if;33 end process;34 clk_new<=(buf(4) xor dly) and not clk;
35 process(clk_new)36 begin37 if clk_new'event and clk_new='1' then38 cnt <= cnt+1;39 end if;40 end process;41 step <= "1000" when cnt=0 else42 "0100" when cnt=1 else43 "0010" when cnt=2 else44 "0001";45 end arch;
VHDL數位電路實習與專題設計 54---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 55---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習 程式與說明
主程式之電路連線 圖:
VHDL數位電路實習與專題設計 56---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 FPT-3 實驗板
輸入clock
Spd(3)
Spd(2)
Spd(1)
Spd(0)
腳位43
36(DIP5)
1(DIP6)
44(DIP7)
2(DIP8)
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位4
5
6
8
轉速控制
調整 Jumper J2 的位置
由 IO0~IO3 拉出激磁信號線
VHDL數位電路實習與專題設計 57---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板
VHDL數位電路實習與專題設計 58---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-6 步進馬達轉速控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz ) -------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;---------------------------------------------------------------------------- 輸入
clock
Spd(3)Spd(2)Spd(1)Spd(0)
腳位55
47(SW1)
48(SW2)
49(SW3)
51(SW4)
輸出Step(3)
Step(2)
Step(1)
Step(0)
腳位37
38
39
41
VHDL數位電路實習與專題設計 59---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習
相關知識 由於其輸入的激磁脈波與輸出的角度成正比關係,因此只要決定步進馬
達的步進數就能將之應用在定位控制上
程式中之步進馬達使用一相激磁的全步控制,我們設定 pos 為一個四位元大小的輸入值,它可決定步進馬達一相激磁的循環( ->->-> )次數。例如當 pos=8 時,步進馬達應可移動 8x4 (一個循環為四個激磁脈波)=32 個步進數。 cnt_p 在程式中記錄著步進馬達全步控制的循環次數,每當完成一個循環的激磁動作之後其值就累加 1 ,直到 cnt_p<pos 這個條件不成立時即便停止動作。
VHDL數位電路實習與專題設計 60---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習
實驗功能 設定不同的 pos 輸入值(四位元),步進馬達便會在執行完 pos
數值大小的激磁循環週期後停止。
SW DIP-8
MOTOR STEPPER
123
4 5 6
POS2
CLOCK
/B
STEP1 /A
VCC
A
POS3
VCC
STEP3
POS0
FT5754
95
67
812
31 2
4
1110
C3B2
GNDGND
B3B4
V+B1 C1
C2
C4V+
POS1
STEP0
B
STEP2
EPM7064S/LCC44
4568
43
361442
I/OI/OI/OI/O
I/GCLK1
I/OI/OI/OI/O
實驗電路圖
VHDL數位電路實習與專題設計 61---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習
程式與說明 步進馬達轉速控制程式碼
12 entity stepmotor_position is13 port(14 clk : in std_logic;15 pos : in std_logic_vector(3 downto 0);16 step: out std_logic_vector(3 downto 0)17 );18 end stepmotor_position;1920 architecture arch of stepmotor_position is21 signal cnt : std_logic_vector(1 downto 0);22 signal cnt_p: std_logic_vector(3 downto 0);23 begin24 ---------- process ---------
25 process(clk)26 begin27 if clk'event and clk='1' then28 if cnt_p < pos then29 if cnt = 3 then30 cnt_p<=cnt_p+1;31 cnt <= "00";32 else33 cnt <= cnt+1;34 end if;35 end if;36 end if;37 end process;38 step <= "1000" when cnt=0 else39 "0100" when cnt=1 else40 "0010" when cnt=2 else41 "0001";42 end arch;
VHDL數位電路實習與專題設計 62---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習 程式與說明
除頻器程式碼(將 1.8432MHz 除頻產生 50Hz 輸出):
13 entity clk_div_step is14 generic(divisor:integer:=36864);15 port(16 clk_in : in std_logic;17 clk_out: out std_logic18 ); 19 end clk_div_step;2021 architecture arch of clk_div_step is22 signal cnt2 : std_logic;23 begin24 ---------- clk divider ----------25 process(clk_in)26 variable cnt1,divisor2 : integer range 0 to divisor;27 begin28 divisor2:=divisor/2;
29 ----- up counter -----30 if (clk_in'event and clk_in='1') then31 if cnt1 = divisor then32 cnt1 := 1;33 else34 cnt1 := cnt1 + 1;35 end if; 36 end if;37 ----- clk_out register clk generator -----38 if (clk_in'event and clk_in='1') then39 if (( cnt1 = divisor2) or (cnt1 = divisor))then40 cnt2 <= not cnt2 ;41 end if;42 end if;43 clk_out <= cnt2 ;44 end process;45 end arch;46
VHDL數位電路實習與專題設計 63---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習 程式與說明
主程式之電路連線 圖:
VHDL數位電路實習與專題設計 64---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 FPT-3 實驗板
輸入 腳位 輸出 腳位clock 43 Step(3) 4
Pos(3)
36(DIP5) Step(2) 5
Pos(2)
1(DIP6) Step(1) 6
Pos(1)
44(DIP7) Step(0) 8
Pos(0)
2(DIP8)
調整 Jumper J2的位置
由 IO0~IO3 拉出激磁信號線
步進數控制
VHDL數位電路實習與專題設計 65---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習 功能模擬與 CPLD 下載驗證
燒錄於力浦電子 LP-2900 實驗板
VHDL數位電路實習與專題設計 66---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
單元 9-7 步進馬達步進數控制實習
功能模擬與 CPLD 下載驗證 燒錄於力浦電子 LP-2900 實驗板 ( 續 )
此外, LP-2900 實驗板上所提供的振盪時脈為 10MHz ,我們想要除頻產生 50Hz 的計數時脈信號就必需將除頻器程式碼( clk_div_step.vhd )中的 divisor 設定為 200000 ( 100000000Hz/200000=50Hz ) -------------------------------------------------------------------entity clk_div_step isgeneric(divisor:integer:=200000); -- 將 divisor設定為 200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step;----------------------------------------------------------------------------
輸入 腳位 輸出clock 55 Step(3)
Pos(3)
47(SW1) Step(2)
Pos(2)
48(SW2) Step(1)
Pos(1)
49(SW3) Step(0)
Pos(0)
51(SW4)
腳位37
38
39
41
VHDL數位電路實習與專題設計 67---陳慶逸、林柏辰編著 文魁資訊
第六章 步進馬達控制實習
勘誤 6-61 34 列 clk_new<=(buf(4) xor dly) and not clk;