全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2270
推到 Plurk!
推到 Facebook!

使用VHDL寫了一個PWM的程式.但是有點問題

答題得分者是:
marui
一般會員


發表:2
回覆:7
積分:1
註冊:2005-01-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-15 00:21:20 IP:211.76.xxx.xxx 未訂閱
我寫了一個VHDL的程式.用來產生PWM的波形..PWM是可調的 我是使用MAX PLUS2寫的.是下載到7128SLC84-7這顆晶片上 我在軟體上模擬時都是正常..但下載後用示波器看波形就錯了 一直都是高電位的狀況.而不是一個方波...不知道是哪裡出錯了 請大家指教...謝謝

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-15 01:01:28 IP:218.165.xxx.xxx 未訂閱
引言: 我寫了一個VHDL的程式.用來產生PWM的波形..PWM是可調的 我是使用MAX PLUS2寫的.是下載到7128SLC84-7這顆晶片上 我在軟體上模擬時都是正常..但下載後用示波器看波形就錯了 一直都是高電位的狀況.而不是一個方波...不知道是哪裡出錯了 請大家指教...謝謝
這位弟兄,能附上你所寫的內容嗎?你只寫這樣,大家不知道你怎麼寫的ㄚ,也不知道錯誤在那裡. ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
marui
一般會員


發表:2
回覆:7
積分:1
註冊:2005-01-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-15 22:30:17 IP:211.76.xxx.xxx 未訂閱
不好意思..現在附上我的程式 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY pwm IS PORT( CLK,ENB,RESET : IN STD_LOGIC; CMD : IN STD_LOGIC_VECTOR(11 DOWNTO 0); PWMR : OUT STD_LOGIC_VECTOR(11 DOWNTO 0); PWMU,PWMD,PWMI : OUT STD_LOGIC ); END pwm; ARCHITECTURE a OF pwm IS SIGNAL ref : STD_LOGIC_VECTOR(11 DOWNTO 0); SIGNAL clk12 : STD_LOGIC; SIGNAL system : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL pu,pd,ce2,d0,d1,d2,d3,d4 : STD_LOGIC; SIGNAL q : STD_LOGIC_VECTOR(11 DOWNTO 0); SIGNAL ce,dir : STD_LOGIC; BEGIN DIVCLOCK : BLOCK BEGIN PROCESS(CLK) BEGIN IF CLK'EVENT AND CLK='1' THEN system<=system 1; END IF; END PROCESS; END BLOCK DIVCLOCK; clk12<=system(1); --clk6<=system(2); TRIANGLE_WAVE : BLOCK BEGIN PROCESS(clk12) BEGIN IF RESET='1' THEN q<="000000000111"; ELSIF clk12'EVENT AND clk12='1' THEN IF ce='1' THEN IF dir='0' THEN q<=q 1; ELSE q<=q-1; END IF; END IF; END IF; END PROCESS; ce<=system(1); dir<=system(13); END BLOCK TRIANGLE_WAVE; ref<=q; PWM_WAVE : BLOCK BEGIN PROCESS(clk12) BEGIN IF clk12'EVENT AND clk12='1' THEN IF ce2='1' THEN d4<=d3;d3<=d2;d2<=d1;d1<=d0; END IF; END IF; END PROCESS; END BLOCK PWM_WAVE; ce2<=system(5); d0<= '1' WHEN CMD>ref ELSE '0'; pu<= d1 AND d2 AND d3 AND d4; pd<= NOT d1 AND NOT d2 AND NOT d3 AND NOT d4; PWMU<=pu; PWMD<=pd; PWMI<= (NOT pu AND NOT pd) OR NOT ENB; PWMR<=q; END a; 我做個說明 我使用的實驗版是ALTERA出的UP2..CLK的頻率為25MHZ..先做個除頻器讓PWM使用..TRIANGLE_WAVE : BLOCK是用來產生三角波.頻率約為3KHZ左右 PWM_WAVE : BLOCK是用來產生PWM波形..clk12約為12.5MHZ..CMD是輸入命令. 用來和三角波比較..產生PWM..PWMU為正轉..PWMD為逆轉..PWMI是切換保護信號 ..這些輸出信號在軟體上模擬都正常..但實際下載到晶片上後.用示波器看時. PWMU一直為高電位.PWM一直為低電位..並沒有方波產生..和軟體模擬時不同 我一直查不出原因..希望各位高手幫個忙..幫小弟看看是不是有哪裡出了錯.謝謝

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-16 04:11:21 IP:218.165.xxx.xxx 未訂閱
我不知道你是怎麼模擬的,基本上有幾個問題: 1.先量看看你的CLK有沒有真的進到系統 2.你的clk12約為6.25MHZ不是12.5MHZ(CLK每次為HI,SYSTEM才加1,SYSTEM(0)的 頻率才是12.5MHZ,你可以量看看),三角波頻率倒是3K沒錯,不過是上數下數 型的,因此你的PWM為中間對齊型. 3.你有使用延遲電路,D1,D2,D3,D4,延遲時間是ce2<=system(5);約390KHZ的時 間,延遲了四次,而你的輸出卻是將這四個信號AND以及反相再做輸出,這有可 能會造成一信號是HI另一信號是LO. 建議:三角波計數改用,上數,或下數(即PWM為前緣對齊或後緣對齊,只留q<=q 1 或q<=q-1) 延遲時間可以縮短一點.或只用d4這個信號輸出(pu<=d4,pd<= not d4) 你再試看看吧,PWM我有寫過,確定可以實現的.我之前寫的是前緣對齊型的,用來驅動馬達並做PID控制的.有問題再PO吧! ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
marui
一般會員


發表:2
回覆:7
積分:1
註冊:2005-01-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-17 14:54:21 IP:61.221.xxx.xxx 未訂閱
已經OK了..謝謝 是CLOCK的問題..現在已解決了..已經沒問題了..
s1800900
一般會員


發表:0
回覆:2
積分:0
註冊:2005-05-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-06 19:24:03 IP:210.80.xxx.xxx 未訂閱
不好意思,想請問一下,最近再研究PWM,想透過VHDL寫一個PWM 但不知道PWM的裡面方塊有哪些?找了好久,大概只知道是透過比較器,計數器還有正反器等元件組合起來,但還是想請教知道或是已做過PWM的大大們,提供一下寶貴的經驗,非常謝謝...
sn903209
初階會員


發表:53
回覆:86
積分:32
註冊:2005-03-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-06 21:12:02 IP:218.169.xxx.xxx 未訂閱
大至上是這樣 比較簡單的寫法是拿二個計數器來寫,至於圖我就懶得畫了 = = 原理和這圖有意曲同工,反正就是控制端和計數端去做比較
marui
一般會員


發表:2
回覆:7
積分:1
註冊:2005-01-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-06 22:43:34 IP:211.76.xxx.xxx 未訂閱
就如同sn903209兄說的一樣..我也是差不多是這樣子..計數器的形式可以是上數或下數(輸出鋸齒波)..數出來的值.再來和輸入命令比較即可.輸入命令大於計數值就輸出HI..小於就輸出LOW..輸入命令的範圍必須和計數的範圍一樣..假設計數器最高數到1000..則輸入命令的範圍就可以是0~1000..當你輸入500的命令時..就會輸出50比50的方波..很多書上都有PWM的程式..去翻翻看會有很大的收穫喔.
s1800900
一般會員


發表:0
回覆:2
積分:0
註冊:2005-05-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-07 05:54:29 IP:211.75.xxx.xxx 未訂閱
非常謝謝sn903209大大以及Marui大大... 我會再研究研究,有問題再向各位請教囉! 謝謝...
系統時間:2024-05-05 4:26:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!