700 likes | 957 Views
步進馬達控制實習. VHDL 數位電路實習與專題設計 文魁資訊 -UE301. 內容大綱. 單元9-1 步進馬達全步控制(一相激磁)實習 單元9-2 步進馬達全步控制(二相激磁)實習 單元9-3 步進馬達半步控制(一二相激磁)實習 單元9-4 步進馬達轉向控制實習 單元9-5 步進馬達轉向與全步半步選擇控制實習 單元9-6 步進馬達轉速控制實習 單元9-7 步進馬達步進數控制實習. 單元9-1 步進馬達全步控制(一相激磁)實習. 相關知識 四相式步進馬達驅動示意圖. 4相6線式步進馬達. 單元9-1 步進馬達全步控制(一相激磁)實習.
E N D
步進馬達控制實習 VHDL數位電路實習與專題設計 文魁資訊-UE301
內容大綱 • 單元9-1 步進馬達全步控制(一相激磁)實習 • 單元9-2 步進馬達全步控制(二相激磁)實習 • 單元9-3 步進馬達半步控制(一二相激磁)實習 • 單元9-4 步進馬達轉向控制實習 • 單元9-5 步進馬達轉向與全步半步選擇控制實習 • 單元9-6 步進馬達轉速控制實習 • 單元9-7 步進馬達步進數控制實習 VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 相關知識 • 四相式步進馬達驅動示意圖 • 4相6線式步進馬達 VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 相關知識(續) • 一個四相步進馬達的工作方式如下圖所示;其中線圈接點所連接的開關是以脈波控制電晶體的飽和或截止加以實現。 VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 相關知識(續) • 而在一般的實驗中,我們常常拿內含四組NPN達靈頓電晶體的FT5754元件來驅動步進馬達,達靈頓電晶體在B極輸入正電壓而導通飽和時,可以放大C極端從線圈往下流通的電流,電源能否提供足夠的電流來驅動步進馬達會影響到步進馬達的轉速與力矩。FT5754外觀及內部結構如下所示: VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 相關知識(續) • 當採用FT5754的達靈頓對電晶體來作為連接步進馬達的開關時,其電路的結構如下所示: VHDL數位電路實習與專題設計
線圈控制狀態 轉動方向 順時針 逆時針 1 1 0 0 0 2 0 1 0 0 3 0 0 1 0 4 0 0 0 1 單元9-1 步進馬達全步控制(一相激磁)實習 • 相關知識(續) • 一相激磁的作法是控制每次只有一個線圈有電流通過,當四個線圈輪流動作時,步進馬達便能開始轉動。一相激磁的控制順序如下表所列: VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 實驗電路圖 VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 程式與說明 • 步進馬達全步控制(一相激磁) 程式碼 22 ---------- process --------- 23 process(clk) 24 begin 25 if clk'event and clk='1' then 26 cnt <= cnt+1; 27 end if; 28 end process; 29 step <= "1000" when cnt=0 else 30 "0100" when cnt=1 else 31 "0010" when cnt=2 else 32 "0001"; 33 end arch; 11 entity stepmotor_fulla is 12 port( 13 clk : in std_logic; 14 step: out std_logic_vector(3 downto 0) 15 ); 16 end stepmotor_fulla; 17 18 architecture arch of stepmotor_fulla is 19 signal cnt : std_logic_vector(1 downto 0); 20 begin 21 VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 程式與說明 • 除頻器程式碼(將1.8432MHz除頻產生50Hz輸出): 13 entity clk_div_step is 14 generic(divisor:integer:=36864); 15 port( 16 clk_in : in std_logic; 17 clk_out: out std_logic 18 ); 19 end clk_div_step; 20 21 architecture arch of clk_div_step is 22 signal cnt2 : std_logic; 23 begin 24 ---------- clk divider ---------- 25 process(clk_in) 26 variable cnt1,divisor2 : integer range 0 to divisor; 27 begin 28 divisor2:=divisor/2; 29 ----- up counter ----- 30 if (clk_in'event and clk_in='1') then 31 if cnt1 = divisor then 32 cnt1 := 1; 33 else 34 cnt1 := cnt1 + 1; 35 end if; 36 end if; 37 ----- clk_out register clk generator ----- 38 if (clk_in'event and clk_in='1') then 39 if (( cnt1 = divisor2) or (cnt1 = divisor))then 40 cnt2 <= not cnt2 ; 41 end if; 42 end if; 43 clk_out <= cnt2 ; 44 end process; 45 end arch; 46 VHDL數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 程式與說明 • 主程式之電路連線圖: VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 43 Step(3) 4 Step(2) 5 接上5V 直流電源 Step(1) 6 調整Jumper J2的位置 Step(0) 8 由IO0~IO3拉出激磁信號線 單元9-1 步進馬達全步控制(一相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子FPT-3實驗板 • 進行步進馬達實驗時,我們需要把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數位電路實習與專題設計
單元9-1 步進馬達全步控制(一相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板 欲將程式檔案燒錄於力浦電子LP-2900實驗板時,我們必須由實驗板上拉出FT5754和步進馬達所需的正、負電源,並由CPLD-EPF10K10 CHIP-BOARD上預留的焊孔以單心線拉出激磁信號(step(3)~setp(0)): VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 55 Step(3) 37 Step(2) 38 Step(1) 39 Step(0) 41 單元9-1 步進馬達全步控制(一相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板(續) 此外,LP-2900實驗板上所提供的振盪時脈為10MHz,我們想要除頻產生50Hz的計數時脈信號就必需將除頻器程式碼(clk_div_step.vhd)中的divisor設定為200000(100000000Hz/200000=50Hz) ------------------------------------------------------------------- entity clk_div_step is generic(divisor:integer:=200000); --將divisor設定為200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step; ---------------------------------------------------------------------------- VHDL數位電路實習與專題設計
線圈控制狀態 轉動方向 順時針 逆時針 1 1 1 0 0 2 0 1 1 0 3 0 0 1 1 4 1 0 0 1 單元9-2 步進馬達全步控制(二相激磁)實習 • 相關知識 • 二相激磁的控制方法是每次都讓兩個線圈通過電流,每一個步驟可以移動一個步進角 : VHDL數位電路實習與專題設計
單元9-2 步進馬達全步控制(二相激磁)實習 • 實驗電路圖 VHDL數位電路實習與專題設計
單元9-2 步進馬達全步控制(二相激磁)實習 • 程式與說明 • 步進馬達全步控制(二相激磁) 程式碼 12 entity stepmotor_fullb is 13 port( 14 clk : in std_logic; 15 step: out std_logic_vector(3 downto 0) 16 ); 17 end stepmotor_fullb; 18 19 architecture arch of stepmotor_fullb is 20 signal cnt : std_logic_vector (1 downto 0); 21 begin 22 23 ---------- process --------- 24 process(clk) 25 begin 26 if clk'event and clk='1' then 27 cnt <= cnt+1; 28 end if; 29 end process; 30 31 step <= "1100" when cnt=0 else 32 "0110" when cnt=1 else 33 "0011" when cnt=2 else 34 "1001"; 35 end arch; VHDL數位電路實習與專題設計
單元9-2 步進馬達全步控制(二相激磁)實習 • 程式與說明 • 除頻器程式碼(將1.8432MHz除頻產生50Hz輸出): 13 entity clk_div_step is 14 generic(divisor:integer:=36864); 15 port( 16 clk_in : in std_logic; 17 clk_out: out std_logic 18 ); 19 end clk_div_step; 20 21 architecture arch of clk_div_step is 22 signal cnt2 : std_logic; 23 begin 24 ---------- clk divider ---------- 25 process(clk_in) 26 variable cnt1,divisor2 : integer range 0 to divisor; 27 begin 28 divisor2:=divisor/2; 29 ----- up counter ----- 30 if (clk_in'event and clk_in='1') then 31 if cnt1 = divisor then 32 cnt1 := 1; 33 else 34 cnt1 := cnt1 + 1; 35 end if; 36 end if; 37 ----- clk_out register clk generator ----- 38 if (clk_in'event and clk_in='1') then 39 if (( cnt1 = divisor2) or (cnt1 = divisor))then 40 cnt2 <= not cnt2 ; 41 end if; 42 end if; 43 clk_out <= cnt2 ; 44 end process; 45 end arch; 46 VHDL數位電路實習與專題設計
單元9-2 步進馬達全步控制(二相激磁)實習 • 程式與說明 • 主程式之電路連線 圖: VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 43 Step(3) 4 Step(2) 5 接上5V 直流電源 Step(1) 6 調整Jumper J2的位置 Step(0) 8 由IO0~IO3拉出激磁信號線 單元9-2 步進馬達全步控制(二相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子FPT-3實驗板 • 進行步進馬達實驗時,我們需要把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數位電路實習與專題設計
單元9-2 步進馬達全步控制(二相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板 欲將程式檔案燒錄於力浦電子LP-2900實驗板時,我們必須由實驗板上拉出FT5754和步進馬達所需的正、負電源,並由CPLD-EPF10K10 CHIP-BOARD上預留的焊孔以單心線拉出激磁信號(step(3)~setp(0)): VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 55 Step(3) 37 Step(2) 38 Step(1) 39 Step(0) 41 單元9-2 步進馬達全步控制(二相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板(續) 此外,LP-2900實驗板上所提供的振盪時脈為10MHz,我們想要除頻產生50Hz的計數時脈信號就必需將除頻器程式碼(clk_div_step.vhd)中的divisor設定為200000(100000000Hz/200000=50Hz) ------------------------------------------------------------------- entity clk_div_step is generic(divisor:integer:=200000); --將divisor設定為200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step; ---------------------------------------------------------------------------- VHDL數位電路實習與專題設計
線圈控制狀態 轉動方向 順時針 逆時針 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 單元9-3 步進馬達半步控制(一二相激磁)實習 • 相關知識 • 一二相激磁的作法是以一相激磁和二相激磁來交替控制,在定子繞組切換激磁線圈電壓時,仍有一個線圈上有電流通過,可保持一定的力矩以維持運轉上的平穩,而其耗電量又比二相激磁來得節省。一二相激磁每次可以移動半個步進角,其激磁的控制順序如下: VHDL數位電路實習與專題設計
單元9-3 步進馬達半步控制(一二相激磁)實習 • 實驗電路圖 VHDL數位電路實習與專題設計
單元9-3 步進馬達半步控制(一二相激磁)實習 • 程式與說明 • 步進馬達半步控制(一二相激磁) 程式碼 12 entity stepmotor_half is 13 port( 14 clk : in std_logic; 15 step: out std_logic_vector(3 downto 0) 16 ); 17 end stepmotor_half; 18 19 architecture arch of stepmotor_half is 20 signal cnt : std_logic_vector(2 downto 0); 21 begin 22 23 ---------- process --------- 24 process(clk) 25 begin 26 if clk'event and clk='1' then 27 cnt <= cnt+1; 28 end if; 29 end process; 30 31 step <= "1000" when cnt=0 else 32 "1100" when cnt=1 else 33 "0100" when cnt=2 else 34 "0110" when cnt=3 else 35 "0010" when cnt=4 else 36 "0011" when cnt=5 else 37 "0001" when cnt=6 else 38 "1001"; 39 end arch; VHDL數位電路實習與專題設計
單元9-3 步進馬達半步控制(一二相激磁)實習 • 程式與說明 • 除頻器程式碼(將1.8432MHz除頻產生50Hz輸出): 13 entity clk_div_step is 14 generic(divisor:integer:=36864); 15 port( 16 clk_in : in std_logic; 17 clk_out: out std_logic 18 ); 19 end clk_div_step; 20 21 architecture arch of clk_div_step is 22 signal cnt2 : std_logic; 23 begin 24 ---------- clk divider ---------- 25 process(clk_in) 26 variable cnt1,divisor2 : integer range 0 to divisor; 27 begin 28 divisor2:=divisor/2; 29 ----- up counter ----- 30 if (clk_in'event and clk_in='1') then 31 if cnt1 = divisor then 32 cnt1 := 1; 33 else 34 cnt1 := cnt1 + 1; 35 end if; 36 end if; 37 ----- clk_out register clk generator ----- 38 if (clk_in'event and clk_in='1') then 39 if (( cnt1 = divisor2) or (cnt1 = divisor))then 40 cnt2 <= not cnt2 ; 41 end if; 42 end if; 43 clk_out <= cnt2 ; 44 end process; 45 end arch; 46 VHDL數位電路實習與專題設計
單元9-3 步進馬達半步控制(一二相激磁)實習 • 程式與說明 • 主程式之電路連線 圖: VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 43 Step(3) 4 Step(2) 5 接上5V 直流電源 Step(1) 6 調整Jumper J2的位置 Step(0) 8 由IO0~IO3拉出激磁信號線 單元9-3 步進馬達半步控制(一二相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子FPT-3實驗板 • 進行步進馬達實驗時,我們需要把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數位電路實習與專題設計
單元9-3 步進馬達半步控制(一二相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板 欲將程式檔案燒錄於力浦電子LP-2900實驗板時,我們必須由實驗板上拉出FT5754和步進馬達所需的正、負電源,並由CPLD-EPF10K10 CHIP-BOARD上預留的焊孔以單心線拉出激磁信號(step(3)~setp(0)): VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 55 Step(3) 37 Step(2) 38 Step(1) 39 Step(0) 41 單元9-3 步進馬達半步控制(一二相激磁)實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板(續) 此外,LP-2900實驗板上所提供的振盪時脈為10MHz,我們想要除頻產生50Hz的計數時脈信號就必需將除頻器程式碼(clk_div_step.vhd)中的divisor設定為200000(100000000Hz/200000=50Hz) ------------------------------------------------------------------- entity clk_div_step is generic(divisor:integer:=200000); --將divisor設定為200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step; ---------------------------------------------------------------------------- VHDL數位電路實習與專題設計
單元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數位電路實習與專題設計
單元9-4 步進馬達轉向控制實習 • 實驗電路圖 VHDL數位電路實習與專題設計
單元9-4 步進馬達轉向控制實習 • 程式與說明 • 步進馬達轉向控制程式碼 11 entity stepmotor_dir is 12 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; 18 19 architecture arch of stepmotor_dir is 20signal cnt : std_logic_vector(1 downto 0); 21 begin 22 23 ---------- process --------- 24 process(clk) 25 begin 26 if clk'event and clk='1' then 27 if dir='1' then 28 cnt <= cnt+1; 29 else 30 cnt <= cnt-1; 31 end if; 32 end if; 33 end process; 34 35 step <= "1000" when cnt=0 else 36 "0100" when cnt=1 else 37 "0010" when cnt=2 else 38 "0001"; 39 end arch; VHDL數位電路實習與專題設計
單元9-4 步進馬達轉向控制實習 • 程式與說明 • 除頻器程式碼(將1.8432MHz除頻產生50Hz輸出): 13 entity clk_div_step is 14 generic(divisor:integer:=36864); 15 port( 16 clk_in : in std_logic; 17 clk_out: out std_logic 18 ); 19 end clk_div_step; 20 21 architecture arch of clk_div_step is 22 signal cnt2 : std_logic; 23 begin 24 ---------- clk divider ---------- 25 process(clk_in) 26 variable cnt1,divisor2 : integer range 0 to divisor; 27 begin 28 divisor2:=divisor/2; 29 ----- up counter ----- 30 if (clk_in'event and clk_in='1') then 31 if cnt1 = divisor then 32 cnt1 := 1; 33 else 34 cnt1 := cnt1 + 1; 35 end if; 36 end if; 37 ----- clk_out register clk generator ----- 38 if (clk_in'event and clk_in='1') then 39 if (( cnt1 = divisor2) or (cnt1 = divisor))then 40 cnt2 <= not cnt2 ; 41 end if; 42 end if; 43 clk_out <= cnt2 ; 44 end process; 45 end arch; 46 VHDL數位電路實習與專題設計
單元9-4 步進馬達轉向控制實習 • 程式與說明 • 主程式之電路連線 圖: VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 43 Step(3) 4 dir 37 Step(2) 5 接上5V 直流電源 Step(1) 6 調整Jumper J2的位置 正反轉控制 Step(0) 8 由IO0~IO3拉出激磁信號線 單元9-4 步進馬達轉向控制實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子FPT-3實驗板 • 進行步進馬達實驗時,我們需要把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數位電路實習與專題設計
單元9-4 步進馬達轉向控制實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板 VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 55 Step(3) 37 dir 47 Step(2) 38 Step(1) 39 Step(0) 41 單元9-4 步進馬達轉向控制實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板(續) 此外,LP-2900實驗板上所提供的振盪時脈為10MHz,我們想要除頻產生50Hz的計數時脈信號就必需將除頻器程式碼(clk_div_step.vhd)中的divisor設定為200000(100000000Hz/200000=50Hz) ------------------------------------------------------------------- entity clk_div_step is generic(divisor:integer:=200000); --將divisor設定為200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step; ---------------------------------------------------------------------------- VHDL數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 相關知識 • 本實驗中,我們以DIR鍵來控制步進馬達之正反轉動作;另外再利用sel鍵來作步進馬達全步控制或半步控制的選擇。 • 實驗功能 • DIR=‘1’ 時,步進馬達正轉;DIR=‘0’ 時,步進馬達反轉。 • Sel=‘1’時,執行全步控制(二相激磁);Sel=‘0’時,執行半步控制(一二相激磁)。 VHDL數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 實驗電路圖 VHDL數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 程式與說明 • 步進馬達轉向與全步半步選擇控制程式碼 12 entity stepmotor_dirsel is 13 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; 20 21 architecture arch of stepmotor_dirsel is 22 signal cnt : std_logic_vector(2 downto 0); 23 begin 24 25 process(clk) 26 begin 27 if clk'event and clk='1' then 28 if dir='1' then 29 cnt <= cnt+1; 30 else 31 cnt <= cnt-1; 32 end if; • end if; • 34 end process; • 35 • 36 process(cnt,sel) • 37 begin • 38 if sel = '1' then • 39 case cnt is • 40 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數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 程式與說明 • 步進馬達轉向與全步半步選擇控制程式碼 (續) 51 case cnt is 52 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數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 程式與說明 • 除頻器程式碼(將1.8432MHz除頻產生50Hz輸出): 13 entity clk_div_step is 14 generic(divisor:integer:=36864); 15 port( 16 clk_in : in std_logic; 17 clk_out: out std_logic 18 ); 19 end clk_div_step; 20 21 architecture arch of clk_div_step is 22 signal cnt2 : std_logic; 23 begin 24 ---------- clk divider ---------- 25 process(clk_in) 26 variable cnt1,divisor2 : integer range 0 to divisor; 27 begin 28 divisor2:=divisor/2; 29 ----- up counter ----- 30 if (clk_in'event and clk_in='1') then 31 if cnt1 = divisor then 32 cnt1 := 1; 33 else 34 cnt1 := cnt1 + 1; 35 end if; 36 end if; 37 ----- clk_out register clk generator ----- 38 if (clk_in'event and clk_in='1') then 39 if (( cnt1 = divisor2) or (cnt1 = divisor))then 40 cnt2 <= not cnt2 ; 41 end if; 42 end if; 43 clk_out <= cnt2 ; 44 end process; 45 end arch; 46 VHDL數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 程式與說明 • 主程式之電路連線 圖: VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 43 Step(3) 4 dir 37 38 Step(2) 5 接上5V 直流電源 sel Step(1) 6 調整Jumper J2的位置 正反轉控制 Step(0) 8 由IO0~IO3拉出激磁信號線 全半步控制 單元9-5 步進馬達轉向與全步半步選擇控制實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子FPT-3實驗板 VHDL數位電路實習與專題設計
單元9-5 步進馬達轉向與全步半步選擇控制實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板 VHDL數位電路實習與專題設計
輸入 腳位 輸出 腳位 clock 55 Step(3) 37 dir 47 Step(2) 38 sel 48 Step(1) 39 Step(0) 41 單元9-5 步進馬達轉向與全步半步選擇控制實習 • 功能模擬與CPLD下載驗證 • 燒錄於力浦電子LP-2900實驗板(續) 此外,LP-2900實驗板上所提供的振盪時脈為10MHz,我們想要除頻產生50Hz的計數時脈信號就必需將除頻器程式碼(clk_div_step.vhd)中的divisor設定為200000(100000000Hz/200000=50Hz) ------------------------------------------------------------------- entity clk_div_step is generic(divisor:integer:=200000); --將divisor設定為200000 port( clk_in : in std_logic; clk_out: out std_logic ); end clk_div_step; ---------------------------------------------------------------------------- VHDL數位電路實習與專題設計
單元9-6 步進馬達轉速控制實習 • 相關知識 • 以一般的計數器除N之除頻電路來說,1KHz(1000Hz)的頻率除一所得到的頻率為1000Hz、除二得到500Hz、除三得到333Hz、除四得到250Hz、除五得到200Hz、…,除八得到125Hz,我們可以很清楚的發現除N的除頻電路所得到的頻率切割結果並非是均勻分布的。 VHDL數位電路實習與專題設計
單元9-6 步進馬達轉速控制實習 • 積分除頻電路 • 若改以連續累加某一數值的方式來執行積分計算時,每當計數器的最高位元發生變化時(0變1或1變0),就送出一個CLK信號,便可使得不同除頻器之間所分割的頻率變成較為均勻的分布。 • 首先,我們先實現下面的積分除頻電路,並從分析幾個例子的時序圖來分析與理解積分除頻電路的原理: • 6 entity stepmotor_speed is • port( clk : in std_logic; • --輸入週期時脈 • spd : in std_logic_vector(2 downto 0); • --輸入連續累加值 • clk_new: out std_logic); • --輸出 CLK信號 • 10 end stepmotor_speed; • 11 • 12 architecture arch of stepmotor_speed is • signal buf: std_logic_vector (3 downto 0); • --四位元積分器 • 14 signal dly : std_logic; • 15 begin • 16 ---------- process --------- • 17 process(clk) • 18 begin • 19 if clk'event and clk='1' then • 20 dly <= buf(3); --延遲電路 • buf <= buf +('0' & spd); • --積分器加上預設之輸入累加值 • 22 end if; • 23 end process; • 24 • clk_new<=(buf(3) xor dly) and not clk; • --輸出微分電路 • 26 • 27 end arch; VHDL數位電路實習與專題設計
0 1 0 1 0 0 1 1 Buf3在8個時脈週期中總共發生了4次的0->1或1->0的變化。 Buf3在8個時脈週期中總共發生了6次的0->1或1->0的變化。 0 1 0 1 1 0 1 0 利用微分的原理,讓Buf3的值每發生一次0、1的變化時就送出一個CLK。8個時脈中共送出4個CLK。 利用微分的原理,讓Buf3的值每發生一次0、1的變化時就送出一個CLK。8個時脈中共送出6個CLK。 單元9-6 步進馬達轉速控制實習 • 積分除頻電路(續) 積分除頻電路動作原理(累加值為4) 積分除頻電路動作原理(累加值為6) VHDL數位電路實習與專題設計