【发布时间】:2012-10-05 03:54:33
【问题描述】:
SO 用户,
我正在尝试以 5Hz 的频率(每秒 5 个样本)对我的电阻式湿度传感器进行采样。我正在使用 ADC 读取输出。现在,有人告诉我,您可以以任何频率运行 ADC,但您需要使用 5hz 时钟来启动转换并从 ADC 读取值。
我这样做的方式是让一个进程通过以 5hz 运行并在时钟的上升沿有一个标志,将“start_convert”设置为“1”来启动转换。
PROCESS (CLK_5HZ)
BEGIN
IF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
START_CONVERT <= '1';
END IF;
END PROCESS;
然后我有一个用于 ADC 的状态机;
PROCESS (CURR_STATE, INTR)
BEGIN
CASE CURR_STATE IS
WHEN STARTUP =>
WR <= '0';
READ_DATA <= '0';
IF (START_CONVERT = '1') THEN
NEXT_STATE <= CONVERT;
ELSE
NEXT_STATE <= STARTUP;
END IF;
WHEN CONVERT =>
IF (INTR = '0' AND STREAM = '1') THEN
NEXT_STATE <= WAIT500;
ELSIF (INTR = '0' AND STREAM = '0') THEN
NEXT_STATE <= READ1;
ELSE
NEXT_STATE <= CONVERT;
END IF;
WR <= '1';
READ_DATA <= '0';
WHEN WAIT10 =>
IF (COUNTER_WAIT = 10) THEN
NEXT_STATE <= READ1;
ELSE
NEXT_STATE <= WAIT10;
END IF;
COUNTER_WAIT <= COUNTER_WAIT + 1;
WHEN READ1 =>
NEXT_STATE <= CONVERT;
WR <= '1';
READ_DATA <= '1';
WHEN OTHERS =>
NEXT_STATE <= STARTUP;
END CASE;
END PROCESS;
然后我使用另一个 5hz 的进程来检测 READ_DATA 是否为 1,以便我从 ADC 读取值。
PROCESS (CLK_5HZ, RST)
BEGIN
IF (RST = '1') THEN
Y <= (OTHERS => '0');
ELSIF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
IF (READ_DATA = '1') THEN
Y <= DATA_IN (0) & DATA_IN (1) &
DATA_IN (2) & DATA_IN (3) &
DATA_IN (4) & DATA_IN (5) &
DATA_IN (6) & DATA_IN (7);
END IF;
END IF;
END PROCESS;
谁能告诉我这是否是正确的方法?
编辑:我正在使用 Spartan-3 板连接 ADC (ADC0804)。
【问题讨论】:
-
好吧,您必须提供更多有关您尝试连接的设备的数据。代码对我来说似乎没问题,但不知道你要与什么设备交互,不可能给你一个好的答案。
标签: vhdl sensors sampling rate adc