Line Robot ( 五 ) - 使用Zxing做Barcode(QR code)識別
前言:
最近因為做實驗的關係,作者接觸了Altera DE0-nano開發版,發現這個板子雖然小小一塊但功能卻很齊全的,包含了加速計、8個led燈示、四段指撥開關、兩個復歸按鈕、8通道12bitADC以及多達80個GPIO(裡面涵蓋Vcc及Gnd)可以去使用,而本文章是使用其ADC讀取感測器數值的應用本文章是使用其ADC讀取感測器數值的應用
下圖為板子的正反面照片,ADC位置在背面(圖b)
圖a. 正面照 圖b. 背面照
圖c. Pin腳圖
DE0-Nano使用的ADC晶片為ADC128S022,其通訊使用的是SPI進行資料交換如下圖所示
圖d. ADC128S022 Serial Timing Diagram
依據圖d的通訊圖可以看出當CS Low時,其SCLK以16個為一組DATA的資料,為了配合撰寫程式,本文章以0至15來取代1至16,其中資料的第0個與第1個不列入參考,而第2~4為選擇ADC Channel的Address(由Din腳為提供),最後第4~15為晶片所量測到的電壓數位訊號(由Dout送出),其訊號範圍為0~3.3伏特(數位訊號為0~4095)。
實做:
SCLK:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity Divider100 is generic ( CLK_DIV : integer := 100 ); port( reset: in std_logic; CLK : in std_logic; enable : in std_logic; SCLK_RISING : out std_logic; SCLK_FALLING : out std_logic ); end Divider100; architecture arch of Divider100 is signal sclk_r, sclk_f : std_logic; signal counter : integer range 0 to CLK_DIV; begin process(CLK, reset) begin if(reset = '0') then sclk_r <= '0'; sclk_f <= '0'; counter <= 0; elsif(rising_edge(CLK)) then if(enable = '1') then if(counter = ((CLK_DIV/2)-1)) then sclk_r <= '0'; sclk_f <= '1'; counter <= counter+1; elsif(counter = (CLK_DIV-1)) then sclk_r <= '1'; sclk_f <= '0'; counter <= 0; else sclk_r <= '0'; sclk_f <= '0'; counter <= counter+1; end if; else sclk_r <= '0'; sclk_f <= '0'; counter <= 0; end if; end if; end process; SCLK_RISING <= sclk_r; SCLK_FALLING <= sclk_f; end arch;
留言
張貼留言