Перейти к содержанию
    

Датчик температуры DS18B20

Здравствуйте. Я только учусь работать с ПЛИС и для своих задач использую проекты, найденные в интернете. Сейчас я интересуюсь работой с датчиком температуры DS18B20 по видео с Youtube и хотел бы чтобы при превышении 30 градусов на выходе ПЛИС была постоянная 1.

В Quartus'е мой проект состоит из 4 блоков (3 из которых найдены в интернете и работают, как показывает симуляция, исправно: Делитель частоты, Reset и блок DS18B20 "OneWire_Master"). В 4-м блоке "Сomp", я бы хотел сравнить данные с датчика и при превышении 30град выставить 1 на выходе Q.

Из документации на датчик ds18b20 (cтр 5) температурные данные запоминаются как 16-битовое число, из которых первые 5 бит - знак температуры, последние 4 бита - дробное значение температуры.

Проблема в том что я не могу проверить свой датчик. Я задаю, чтобы на выходе Q была 1 для всех температур от 0 до 30 град, а для остальных значений 0 (код представлен ниже). В результате, при подаче питания на выходе Q появляется 1. Я меняю условие: для температур от 0 до 30 ставлю Q = 0, а для default : Q = 1. В результате, при подаче питания на выходе Q  снова появляется 1. Не могли бы Вы сказать где я ошибаюсь?

module comp2(output reg [15:0] Q, input [15:0] Temp ,input Clk,RST, output J, output reg OUT);
 
always @ (posedge Clk) 
	begin 
		casex(Temp)
		16'bxxxxx0000000xxxx : Q = 1; //0	
		16'bxxxxx0000001xxxx : Q = 1; //1
		16'bxxxxx0000010xxxx : Q = 1; //2
		16'bxxxxx0000011xxxx : Q = 1; //3
		16'bxxxxx0000100xxxx : Q = 1; //4
		16'bxxxxx0000101xxxx : Q = 1; //5
		16'bxxxxx0000110xxxx : Q = 1; //6
		16'bxxxxx0000111xxxx : Q = 1; //7
		16'bxxxxx0001000xxxx : Q = 1; //8
		16'bxxxxx0001001xxxx : Q = 1; //9
		16'bxxxxx0001010xxxx : Q = 1; //10
		16'bxxxxx0001011xxxx : Q = 1; //11
		16'bxxxxx0001100xxxx : Q = 1; //12
		16'bxxxxx0001101xxxx : Q = 1; //13
		16'bxxxxx0001110xxxx : Q = 1; //14
		16'bxxxxx0001111xxxx : Q = 1; //15
		16'bxxxxx0010000xxxx : Q = 1; //16
		16'bxxxxx0010001xxxx : Q = 1; //17
		16'bxxxxx0010010xxxx : Q = 1; //18
		16'bxxxxx0010011xxxx : Q = 1; //19
		16'bxxxxx0010100xxxx : Q = 1; //20
		16'bxxxxx0010101xxxx : Q = 1; //21
		16'bxxxxx0010110xxxx : Q = 1; //22
		16'bxxxxx0010111xxxx : Q = 1; //23
		16'bxxxxx0011000xxxx : Q = 1; //24
		16'bxxxxx0011001xxxx : Q = 1; //25
		16'bxxxxx0011010xxxx : Q = 1; //26
		16'bxxxxx0011011xxxx : Q = 1; //27
		16'bxxxxx0011100xxxx : Q = 1; //28
		16'bxxxxx0011101xxxx : Q = 1; //29
		16'bxxxxx0011110xxxx : Q = 1; //30
		default : Q = 0;
		endcase
	end
	
assign J = Q[0];		

always @ (posedge Clk) //JK-trigger
	begin 
		case({J, RST})
		2'b00 : OUT <= OUT;
		2'b01 : OUT <= 0;
		2'b10 : OUT <= 1'd1;
		2'b11 : OUT <= !OUT;
		endcase
	end
endmodule 

На работе снял осциллограммы с выходов D и Reset. 

Quartus  проект

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, AndreiF said:

Здравствуйте. Я только учусь работать с ПЛИС и для своих задач использую проекты, найденные в интернете. Сейчас я интересуюсь работой с датчиком температуры DS18B20 по видео с Youtube и хотел бы чтобы при превышении 30 градусов на выходе ПЛИС была постоянная 1.

 

 

 

module comp2(
  input i_clk,  
  input i_rst,   
  output reg q, 
  input signed [15:0] i_temp ,
);
 
wire signed [15:0] t30;
wire signed [15:0] t0;
assign t30= {10'd30, 4'h0};
assign t0= 0;
always @ (posedge i_clk or posedge i_rst) 
begin 
  if(i_rst)
       q <= 1'b0;
  else
  	q<= (i_temp > t0) && (i_temp < t30);
end

Так сойдет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, gosha, но к сожалению на выходе Q всегда 0 (при проверке грел датчик паяльником, через сложенную в несколько раз бумагу).

Более подробно рассмотрел сигнал D (2-я ножка микросхемы) и обнаружил что есть область где сигнал находится между 1 и 0 (осциллограмма). Не знаете ли Вы, это нормальный режим работы? 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

промежуточный уровень допускается для данного вида OneWire протокола. просто прочитайте описание внимательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, AndreiF said:

Спасибо, gosha, но к сожалению на выходе Q всегда 0 (при проверке грел датчик паяльником, через сложенную в несколько раз бумагу).

Более подробно рассмотрел сигнал D (2-я ножка микросхемы) и обнаружил что есть область где сигнал находится между 1 и 0 (осциллограмма). Не знаете ли Вы, это нормальный режим работы? 

 

 

Внутрисхемным отладчиком не научились пользоваться ??

Без него - никак.

Лучше бы снимок экрана внутрисхемной отладки по jtag: - осциллограмму по 1wire с датчика, и какой параллельный код получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема была в неправильном подключении датчика...В документации сказано, что нужен транзистор для обеспечения питания, но я подумал что его можно внутри ПЛИС как-то указать (как резистор "weak pull up resistor"). Сейчас подключил как на  рисунке б) т.е. отдельное питание +3.3В на вывод Vdd и схема заработала, осциллограммы стали красивыми.  Спасибо, gosha.

Осциллограммы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...