zemlik

Помогите С Алгоритмом!

7 сообщений в этой теме

zemlik    0

Работа устройства заключается в следующем. С выхода тактового генератора (DD1.1, DD1.2) импульсная последовательность с частотой около 2 кГц поступает на формирователь птлообразного напряжения (VT1, C3) и двоичные счетчики DD2.1 и DD2.2. На первом счетчике собран формирователь ступенчатого напряжения, возникающего на выходе цифро-аналогового преобразователя на резисторах R5 и R6. Второй счетчик управляет дешифратором DD3, выполняющим функции коммутатора команд. Такое решение позволяет разнести во времени процессы построения на экране вспомогательных элементов изображения и собственно характеристик транзистора. В течение трех первых тактов работы дешифратора единичные сигналы с его выходов, объединенных по схеме "ИЛИ", обнуляют счетчик DD2.1, что обеспечивает нулевой уровень на выходе исследуемого транзистора VTи (обведен пунктиром). Одновремен но в первом такте происходит формирование пилообразного напряжения, которое после эмиттерного повторителя VT3 поступает на вход "х" осциллографа для формирования оси абсцисс. Во втором такте сигналом с выхода 14 элемента DD3 открывается трбнзистор VT2, блокирующий развертку по оси "Х", и запускается генератор оси ординат (VT5, VT6).

В третьем такте сохраняется закрытое состояние транзистора VTи и запускается формиро-ватель падающего пилообразного напряжения (VT7...VT10), имитирующего на экране нагру-зочную прямую. Одновременно с этим происходит запуск генератора рабочей точки (DD4.1...DD4.3),положение которой на нагрузочной прямой задается потенциометром R25.

Интегрирующая цепочка R26,C__ совместно с транзистором VT__ управляет изменением положения рабочей точки под действием внешней температуры.

Питание логической части схемы осуществляется напряжением стабилитрона VD3. Диод VD2 служит для развязки цепей питания.

Для демонстрации температурного эффекта в лекционной аудитории целесообразно вначале включить прибор без транзистора VTи и перевести переключатель SA1 в положение "1". При этом на экране отобразят ся только координатные оси. Затем в разъемную панель на видном месте прибора устанавливается транзистор VTи, что сопровождается формированием на экране семейства его выходных статических характеристик

Потенциометрами R__ и R__ устанавливается, соответственно, необходимый наклон нагрузочной прямой и положение на ней рабочей точки.

После этого к корпусу транзистора приближают прогретый паяльник и наблюдают за перемещением вверх, практически за пределы экрана, всех характеристик. При этом рабочая точка также смещается вверх по нагрузочной прямой до максимально возможного для нее по-ложения - точки пересечения нагрузочной прямой с подъемным участком выходных характе-ристик. Этот пример убедительно показывает, что под действием температуры биполярный транзистор, находящийся в исходном состоянии в режиме линейного усиления (рабочая точка находится примерно в средней части нагрузочной прямой), переходит в режим одностороннего ограничения, т.е. в область больших нелинейных искажений. На вопрос к аудитории о причинах таких изменений чаще звучит очевидный, на первый взгляд, ответ, что транзистор открывается (его ток Iк растет) т.к. возрастает ток базы. Такое суждение базируется на ассоциации с внешним видом выходных характеристик, где каждому большему значению тока базы соответствует более высоко расположенная кривая. Кроме того интуитивно это вытекает из следующей функциональной зависимости:

IК = IБ + ( + 1) IКБО (1)

где  – статический коэффициент усиления транзистора по току;

IБ – ток базы;

IКБО – обратный (тепловой) ток коллекторно-базового перехода, причем Iкбо << Iб.

Чтобы оценить справедливость таких доводов переключателем SA1 исследуемый тран-зистор VTи отключают от генератора ступенчатого напряжения. При этом на экране осциллографа формируется единичная выходная характеристика, положение которой задается потенциометром R___ а соответствующее ей значение тока базы индицируется микроамперметром ____. Если теперь повторить процедуру нагрева транзистора, то, как и прежде, характеристика плавно уйдет за верхний край экрана, но показания прибора ... не изменятся ! Этот неожиданный факт опровергает наше предположение о роли тока базы и теперь из формулы (1) мы делаем совершенно другие выводы. Оказывается, в изменение свойств транзистора под действием температуры, основной вклад вносит не прямой ток базы IБ, а микроскопический, при комнат ной температуре, обратный ток коллектора IКБО. И борьбе с этим "вредным" током посвящен целый раздел электроники. Воистину лучше один раз увидеть, чем 100 раз услышать! Предложенная конструкция при небольшой доработке может показать и эффект противодействия рассмотренному явлению. Для этого нужно дополнить ее простейшим каналом измерения температуры корпуса транзистора и ввести отключаемую отрицательную обратную связь (ООС) по постоянной составляющей тока коллектора. Теперь все демонстрации можно проводить в контролируемом диапазоне изменения температур корпуса транзистора и объективно сравнивать различные физические процессы. Можно будет показать, что с введением ООС выходная характеристика транзистора почти не смещается вверх с ростом его температуры (т.е. ток коллектора IК сохраняет постоянство), а ток базы IБ при этом напротив уменьшается, выполняя важную стабилизирующую функцию.

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


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

до конца не дочитал!без комментариев!

:D

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


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

Если скину схему??

Изменено пользователем zemlik

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


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

Здравствуйте уважаемые форумчане! Во общем осуществляется передача данных по uart посредством RF модулей 433MHz c меги328р на мегу8. И собственно проблема, как реализовать адресную запись данных по приему. С передатчика я передаю id=45(некий адрес идентификации что сейчас будет передаваться влажность) потом данные о влажности. и id=103 (некий адрес идентификации что сейчас будет передаваться температура) потом данные температуры на приемник, и как разделить что бы влажность в одну переменную и соответственно температура в другую записывать. Не получается по этим id записывать по своим местам, данные все равно путаются и даже само значение id попадает в "полезные" переменные.

привожу свой код передатчика на мега328р и DHT11

// ==============/////////==================////////=======================///////////////////////////////////
void otprav(char data) { // ФУНКЦИЯ передачи данных
int p;

///////////////////////////

for (p=0;p<500;p++) { // что бы на верника передалось))

putchar(data);
delay_ms(2);
};


///////////////////////////

};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define DHT_DDR DDRC.3
#define DHT_OUT PORTC.3
#define DHT_IN PINC.3
unsigned char data[5];


char GetHumidity() // считывание данных с датчика DHT11
{
unsigned char n, k, idx;
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
DHT_OUT = 0;
delay_ms(18);
DHT_OUT = 1;
DHT_DDR = 0;
delay_us(50);
if(DHT_IN != 0)
{
 return 1;
}
while(DHT_IN == 0)
{
 //может зависнуть - добавить код
}
while(DHT_IN != 0)
{
 //может зависнуть - добавить код
}
for(n = 0; n < 5; n++)
{
 idx = 0x80;
 for(k = 0; k < 8; k++)
 {
	 while(DHT_IN == 0)
	 {
//может зависнуть - добавить код
	 }
	 delay_us(33);
	 if(DHT_IN != 0) data[n] |= idx;
	 idx >>= 1;
	 while(DHT_IN != 0)
	 {
//может зависнуть - добавить код
	 }
 }
}
return 0;
}
void main(void)
{

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTB=0x00;
DDRB=0b00100000;
PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x48;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x67;
// Global enable interrupts
#asm("sei")
while (1)
 {



 DHT_DDR = 1;
 DHT_OUT = 1;
 delay_ms(25);

 GetHumidity();

	 otprav(45);// id начала приема данных влажности
	 otprav(data[0]); //% данные влажности otprav(data[0]);

 /////////////////////////////////////////////////////////////////////////////////////////
	 delay_ms(25);

				 otprav(103);// id начала приема данных t*C
	 otprav(data[2]); // t*C

 }
}

И приемная часть:

собственно функция фильтра от помех и выделения полезных данных

void priem(void) { // функция для выделения данных из пришедшого и полезных -
// данных мусора по рф модулям с приемника

		 if(bufer [1] == bufer [2]) { //если данные ровняются пришедшим данным 150 раз, -
		 // то мы их принимаем и сщитаем ПОЛЕЗНЫМ

					 i++; //инкремент количество ИСТИНЫ, тоесть совпадений

				 bufer [2] = getchar(); // каждое новое пришедшое данное сравнивается -
				 //самим с соболй 150 раз
					 }

		 else { // если данные были 100 раз не ровняющимися(ошибкой) -
		 bufer [2] = getchar(); // то записуем еще раз новое пришедшое данное для сравнения

			 of++;	 // инкремент количества ошибок
		 };
if(of>=10) bufer [1]=getchar(), of=0; // если буфер ошибок переполняется ,-
//то записуем новое данное в буфер -
// сравнения и обнуляем буфер ошибок

if(i>=15) {


t=bufer [1];

bufer [1]=getchar(), i=0; // если буфер ИСТИНЫ переполняется, -
//то это полезное данное -
// и мы его записуем в переменную " t "пришедших данных, и снова записуем новое значение в буфер -
// сравнения и обнуляем буфер ИСТИНЫ
};

if(bufer [1]==45) { // сам id
g++;
if(g>2) g=0;


};
if(g==2) vlaga=getchar(), g=0; // запись и вывод влаги(код работает с глюками)


};

Данные фильтруются четко, а вот с адресацией не получается.

Подскажите кто что знает, буду рад любыми дельными советами и критике. Заранее спасибо.

Изменено пользователем Павел Царь

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
// что бы на верника передалось))
500 раз ? :crazy:

Ещё бы у Вас ничего не путалось. Вы передаёте 500 раз id, а затем 500 раз данные. Как приёмник будет их отличать ?

Да и зачем вообще id тут нужен ? Передавайте просто 2 байта подряд - влажность и температуру.

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


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

Передайте число старт байт (пусть id) один раз, если получится то, чтоб число старт байта не лежало в пределах чисел данных. Или сделать его не 1 байт, а 2. После него последовательно передавайте температуру и влажность. В примнике первую посылку сохраняем и принимаем ещё раз, если совпали отправляем данные в работу. Если старт байт не принят делайте сброс в приёмной части, так приёмник найдёт начало посылки.

Изменено пользователем RGB-V

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас