Программы, необходимые для правильной работы устройства калибровки цифрового акселерометра и реализующие обмен данными по протоколу SPI между акселерометром и ПЛИС, а также RS-232 для передачи данных с макета на ПЭВМ. Инициализация MEMS-акселерометра.
Аннотация к работе
Текст программ на языке VHDL для калибровки цифрового трёхосного MEMS акселерометра Аннотация к программе акселерометр калибровка цифровой программа В документе представлены программы, необходимые для правильной работы устройства калибровки цифрового акселерометра и реализующие обмен данными по протоколу SPI между акселерометром и ПЛИС, а так же RS-232 для передачи данных с макета на ПЭВМ. Для ее функционирования требуется наличие на компьютере операционной системы Windows XP/Vista/7. 1. SPI-Master --объявление пакета(собственной библиотеки) package spi_pack is type spi_states is (sleep, init, rw, iready, status); --iwait --ЦКА subtype byte is natural range 0 to 255; --регистр управления режимами работы по мощности и частотой вывода данных(дискретизации) Constant BW_RATE: byte := 44; --регистр управления спящим режимом и частотой показаний в спящем режиме Constant POWER_CTRL: byte := 45; --регистр управления прерыванием Constant INT_ENABLE: byte := 46; --регистр управления логическим уровнем прерывания, выравниванием бит данных и разрядностью Constant DATA_FORMAT: byte := 49; --готовность передачи Constant Status_REG: byte := 48; --ускорение акселерометра по трем осям чувствительности Constant DATA_X0: byte := 50; --частота дискретизации 100Гц, нормальный режим работы (по мощности) Constant BW_RATE_WORD: byte := 10;--14;--12 --нормальный режим работы, режим измерения Constant POWER_CTRL_WORD: byte := 8; --прерывание разрешено Constant INT_ENABLE_WORD: byte := 128; --диапазон измеряемых ускорений - ±4g, выравнивание бит - по левому краю, 11 разрядов Constant DATA_FORMAT_WORD: byte := 13; --кол-во инициализируемых регистров Constant all_init_regs: byte := 4; --кол-во читаемых регистров(по 2 байта на каждую ось чувствительности) Constant all_read_regs: byte := 6; type gyro_regs is array (0 to all_init_regs-1) of byte; Constant init_addreses: gyro_regs := (BW_RATE, POWER_CTRL, INT_ENABLE,DATA_FORMAT); Constant ctrl_data: gyro_regs := (BW_RATE_WORD, POWER_CTRL_WORD, INT_ENABLE_WORD, DATA_FORMAT_WORD); --количество тактовых импульсов(частота дискретизации)1МГЦ/100Гц Constant Discrete: natural range 0 to 16_383 := 10_000;--1_000_000/625 ;--10_000 -- 2500 end spi_pack; --объявление библиотек library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; use work.spi_pack.all; entity spi_core is port ( --сигнал разрешения передачи данных (передача по низкому логическому уровню) cs: out std_logic; --тактовый сигнал scl: out std_logic; --выходной сигнал SPI для подачи на вход акселерометра sdi: out std_logic; --входящий высокочастотный сигнал clock: in std_logic; --входной сигнал SPI для чтения данных с выхода SDO акселерометра sdo: in std_logic; --биты данных для одной оси чувчтвительности data_out: out std_logic_vector(15 downto 0); --выход передачи UART tx: out std_logic; --вход приема UART rx: in std_logic ); end spi_core; architecture Behavior of spi_core is --делитель Component divider is --настроечная константа generic (N : natural := 8); port ( --тактовый сигнал clk : in std_logic; --сигнал сброса reset: in std_logic; --сигналы установки и чтения по разным фронтам clk_out: out std_LOGIC; clk_scl: out std_LOGIC ); end Component; --передатчик Component tx_uart is generic ( --скорость передачи Rapid: natural := 115_200; --частота дискретизации Fd: natural := 100; --кол-во передаваемых байт по умолчанию n_bytes: natural := 6 ); port ( --тактовый высокочастотный сигнал clock : in std_logic; --сигнал сброса rst : in std_logic; --массив бит входных данных длиной 8*кол-во байт data_tx: in std_logic_vector(8*n_bytes - 1 downto 0); --выход UART tx: out std_LOGIC ); end Component; type gyro_reads is array (0 to all_read_regs-1) of std_logic_vector(7 downto 0); signal new_data, new_data_temp, init_ready, rst: std_logic; signal clk, clk_for_scl, scl_ena: std_logic; signal wd: std_logic; signal n_bit: natural range 0 to 8*(all_read_regs 1) -1; signal num_init: natural range 0 to all_init_regs; signal num_read: natural range 0 to all_read_regs; signal D_out: gyro_reads; signal ready: std_logic; signal data_tx: std_logic_vector(8*all_read_regs - 1 downto 0); signal cnt: std_logic; signal state, next_state: spi_states; begin Div_freq: divider generic map (N => 24) port map (clock, 1, clk, clk_for_scl); process (state, wd, init_ready, n_bit, new_data, num_read) begin case (state) is when sleep => if (init_ready = 0) then next_state if (n_bit = 15) then next_state if (n_bit = 15) then next_state if (n_bit = (8*(all_read_regs 1) -1)) then next_state next_state null; end case; end process; process (clk, cnt) begin if (cnt = 0) then n_bit sdi cs cs cs cs null; end case; end if; end process; process (clk, state, n_bit, new_data) variable data: gyro_reads; begin if (clkevent and clk = 0) then case (state) is when sleep => num_read if (n_bit = 15) then if (num_init = all_init_regs - 1) then init_ready if (n_bit = 8) then new_data if (n_bit > 7) then data(num_read)(7 - (n_bit r