<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 函數(shù)信號(hào)發(fā)生器和示波器二合一儀器設(shè)計(jì),提供源碼

          函數(shù)信號(hào)發(fā)生器和示波器二合一儀器設(shè)計(jì),提供源碼

          作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201706/348715.htm

          1.總體設(shè)計(jì)方案

          1.1 主控制模塊

          方案一:采用單片機(jī)。單片機(jī)的應(yīng)用較為廣泛,但是單片機(jī)的處理頻率達(dá)不到我們的要求。所以我們只能夠使用處理速度較快的處理器。

          方案二:采用Xilinx的來(lái)實(shí)現(xiàn)主控制器。Xilinx的的內(nèi)部IP核可以方便的產(chǎn)生DDS波形,這樣就方便我們能夠更好的產(chǎn)生想要的波形。

          所以采用方案二。

          1.2顯示模塊

          方案一:使用TFT觸摸屏。彩屏有這樣明顯的優(yōu)點(diǎn):微功耗,尺寸小,超薄輕巧,顯示信息量大,字跡美觀,視覺(jué)舒適,但是對(duì)于來(lái)說(shuō),其實(shí)現(xiàn)對(duì)觸摸屏的控制不能夠較好的完成控制要求。

          方案二:使用VGA顯示。FPGA可以實(shí)現(xiàn)對(duì)VGA的控制。VGA的使用較為廣泛,且價(jià)格在接收的范圍之內(nèi)。而且,對(duì)于FPGA來(lái)說(shuō),實(shí)現(xiàn)對(duì)VGA接口的控制比控制其他的顯示器更加的方便和快捷。這就節(jié)省了我們的設(shè)計(jì)麻煩。

          所以采用方案二。

          1.3 輸入模塊

          方案一:使用矩陣鍵盤(pán)。矩陣鍵盤(pán)的編碼較為簡(jiǎn)答,且可以實(shí)現(xiàn)較為復(fù)雜的控制。但是矩陣鍵盤(pán)的按鍵過(guò)少,不能夠?qū)崿F(xiàn)更多數(shù)據(jù)的輸入。

          方案二:使用PS2鍵盤(pán)。PS2鍵盤(pán)的控制更為簡(jiǎn)單,我們可以通過(guò)兩根數(shù)據(jù)線精心數(shù)據(jù)的讀取,且PS2鍵盤(pán)的設(shè)計(jì)更加符合我們?cè)O(shè)計(jì)要求,這就決定了PS2在本設(shè)計(jì)中的優(yōu)勢(shì)。

          故采用方案二。

          1.4 AD輸出模塊

          ADS7822是一種單片高速12位逐次比較型A/D轉(zhuǎn)換器, ADS7822內(nèi)置雙極性電路構(gòu)成的混合集成轉(zhuǎn)換顯片,具有外接元件少,功耗低,精度高等特點(diǎn),并且具有自動(dòng)校零和自動(dòng)極性轉(zhuǎn)換功能,只需外接少量的阻容件即可構(gòu)成一個(gè)完整的A/D轉(zhuǎn)換器。所以該方案采用ADS7822作為AD輸入的元器件。

          1.5 DA輸出模塊

          DAC7513是8分辨率的D/A轉(zhuǎn)換集成芯片。與微處理器完全兼容。這個(gè)DA芯片以其價(jià)格低廉、接口簡(jiǎn)單、轉(zhuǎn)換控制容易等優(yōu)點(diǎn),在單片機(jī)應(yīng)用系統(tǒng)中得到廣泛的應(yīng)用。D/A轉(zhuǎn)換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉(zhuǎn)換電路及轉(zhuǎn)換控制電路構(gòu)成。

          2.程序設(shè)計(jì)

          2.1 AD輸出

          --**********************分頻進(jìn)程*************************

          process(clk)

          variable cnt1 : integer range 0 to 100;

          variable cnt2 : integer range 0 to 20;

          begin

          if clkevent and clk=1 then

          if cnt1=100 then

          cnt1:=0;

          if cnt2=20 then

          cnt2:=0;

          clock=not clock;

          if(cnt=3)then

          cnt=0;

          else

          cnt=cnt+1;

          end if;

          else

          cnt2:=cnt2+1;

          end if;

          else

          cnt1:=cnt1+1;

          end if;

          end if;

          end process;

          --**************狀態(tài)驅(qū)動(dòng)進(jìn)程**********************

          sync :process(clock,reset)

          begin

          if(reset = 0) then

          current_state = start;

          elsif(clockevent and clock=1) then

          current_state = next_state;

          end if;

          end process sync;

          --***************adc驅(qū)動(dòng)進(jìn)程*******************

          comb :process(current_state, intr)

          begin

          case current_state is

          when start => --啟動(dòng)狀態(tài)

          next_state = convert;

          cs = 0;

          wr = 0;

          rd = 1;

          read_data = 0;

          when convert =>--初始化

          if(intr = 0) then

          next_state = read1;

          else

          next_state = convert;

          end if;

          cs = 1;

          wr = 1;

          rd = 1;

          read_data = 0;

          when read1 =>--讀狀態(tài)1

          next_state = read2;

          cs = 0;

          wr = 1;

          rd = 0;

          read_data = 1;

          when read2 =>--讀狀態(tài)2

          next_state = start;

          cs = 1;

          wr = 1;

          rd = 1;

          read_data = 0;

          when others =>--其他狀態(tài)

          next_state = start;

          end case;

          end process comb;

          --****************讀取AD數(shù)據(jù)********************

          get_data: process(clock,reset)

          begin

          if(reset = 0) then

          p=0;

          elsif(clockevent and clock=1) then

          if(read_data = 1) then

          p=conv_integer(data_i);

          end if;

          end if;

          end process;

          2.2 DA輸出

          --*********************65536Hz分頻進(jìn)程************************

          process(clk)

          variable cnt1 : integer range 0 to 762;

          begin

          if clkevent and clk=1 then

          case cnt1 IS

          WHEN 381 =>

          cp_65k=1;

          cnt1:=cnt1+1;

          WHEN 762=>

          cnt1:=0;

          cp_65k=0;

          cp_wr=0;

          WHEN 20=>

          cp_wr=1;

          cnt1:=cnt1+1;

          WHEN OTHERS=>

          cnt1:=cnt1+1;

          end case;

          end if;

          end process;

          --*********************1kHz分頻進(jìn)程************************

          process(cp_65k)

          variable cnt1 : integer range 0 to 64;

          begin

          if cp_65kevent and cp_65k=1 then

          case cnt1 is

          when 32=>cp_1k=1;

          cnt1:=cnt1+1;

          when 64=>cnt1:=0;

          cp_1k=0;

          when others=>cnt1:=cnt1+1;

          end case;

          end if;

          end process;

          --**************DDS地址累加器進(jìn)程**********************

          PROCESS(cp_65k)

          BEGIN

          IF(cp_65kEVENT AND cp_65k=1) THEN

          --DDS累加器循環(huán)累加dds_m

          IF dds_add65535 THEN

          dds_add=dds_add+dds_m;

          ELSE

          dds_add=dds_add+dds_m-65536;

          END IF;

          END IF;

          END PROCESS;

          --***********************頻率加減控制進(jìn)程***************************

          process(cp_1k)

          VARIABLE keys:INTEGER RANGE 0 TO 127 :=0; --消抖累加器

          begin

          if cp_1k=1 then

          case key is

          when 10=> --頻率加

          if keys=127 then

          keys:=0;

          bell=1;

          if dds_m=1000 then

          dds_m=1;

          else

          dds_m=dds_m+1;

          end if;

          else

          keys:=keys+1;

          end if;

          when 01=> --頻率減

          if keys=127 then

          keys:=0;

          bell=1;

          if dds_m=1000 then

          dds_m=1;

          else

          dds_m=dds_m-1;

          end if;

          else

          keys:=keys+1;

          end if;

          when others=>bell=0;

          end case;

          end if;

          end process;

          end dac;

          2.3 VGA顯示

          3.性能指標(biāo)

          DA輸出的波形

          4.總結(jié)

          經(jīng)過(guò)了多日的努力,我們?cè)诒驹O(shè)計(jì)中基本實(shí)現(xiàn)了上述要求,并在有些功能方面提出了改進(jìn),使系統(tǒng)設(shè)計(jì)更加完善。在該設(shè)計(jì)中我們使用了FPGA作為主控器,但由于時(shí)間及器材條件的限制,本設(shè)計(jì)也存在不足,例如,測(cè)量范圍不能達(dá)到更高的要求,測(cè)量精度也存在很大的提升空間。我們會(huì)在以后的學(xué)習(xí)中不斷地彌補(bǔ)這些不足,完善測(cè)量系統(tǒng)設(shè)計(jì)。



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();