Устройство управления тепловым режимом компьютера
Проблема охлаждения в компьютере. Выбор и описание прототипов разрабатываемого устройства. Разработка структурной и принципиальной схемы. Разработка программного обеспечения, его выбор и обоснование. Моделирование работы исследуемого устройства.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 10.11.2014 |
Размер файла | 2,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Пояснительная записка к курсовой работе
Устройство управления тепловым режимом компьютера
Введение
В электронике существует тенденция к уменьшению размеров устройств при одновременном увеличении возможностей. При этом большое число компонентов «втискивается» в малый объем. Наиболее яркий пример - персональные компьютеры, нотбуки. PC обладают компактными размерами, но при этом их производительность и токопотребление непрерывно растет. Другой пример - мультимедийные проекторы или телевизионные приставки (set-top box). Общее между этими устройствами, помимо малых (и продолжающих уменьшаться) размеров, это то, что количество рассеиваемого тепла не уменьшается. А зачастую даже увеличивается. В PC большое количество тепла генерируется процессором; в проекторах - источником света. Это тепло должно отводиться быстро и эффективно. Наиболее быстрый путь отвода тепла - это использование пассивных компонентов - радиаторов. Однако такой подход во многих случаях неэффективен, да и несколько дорог. Хорошей альтернативой является активное охлаждение, для чего необходим вентилятор, обеспечивающий поток воздуха вокруг компонентов и таким образом отводящий тепло.
Вентилятор, конечно, является источником шума. Еще он потребляет электроэнергию - это очень существенный фактор, если питание производится от батареи. Кроме того, вентилятор - это механический компонент системы, что не является идеальным решением с точки зрения надежности.
Управление скоростью вращения - единственный способ в значительной степени разрешить проблемы вентилятора - обеспечивает следующие преимущества:
* снижение скорости вращения вентилятора способствует уменьшению акустических шумов;
* снижение скорости вращения вентилятора способствует снижению энергопотребления;
* снижение скорости вращения вентилятора увеличивает надёжность и время наработки на отказ.
Методы управления можно классифицировать следующим образом:
1. Отсутствие управления скоростью вращения.
2. Управление включением / выключением.
3. Линейное управление.
4. Низкочастотная широтно-импульсная модуляция (ШИМ).
5. Высокочастотная ШИМ
1. Обзор литературных источников
компьютер охлаждение программный
По требованию задания по курсовому проекту нужно разработать устройство управления вентиляторами компьютера. Количество точек измерения и вентиляторов до 4 штук, регулировка скорости вращения с шагом 2% от номинальной мощности, для определения температуры используются 4 датчика с точностью 0.5 градуса. Рассмотрим несколько схем реализующих охлаждение компьютера.
1.1 Блок управления вентиляторами компьютера
Алгоритм работы устройств, управляющих охлаждением элементов системного блока компьютера [1], описания которых были опубликованы за последние несколько лет, приблизительно одинаков. Пока температура не выше допустимой, на вентиляторы поступает уменьшенное до 6,5…7 В напряжение питания.
При этом система охлаждения, хотя и работает менее эффективно, но значительно меньше шумит. Напряжение обычно снижают, включая последовательно в цепь питания вентилятора резистор или работающий в активном режиме биполярный транзистор. К сожалению, кроме своего основного назначения, этот элемент ограничивает пусковой ток двигателя вентилятора. В результате уменьшается его механический пусковой момент и, не преодолев трения покоя, крыльчатка вентилятора при включении компьютера может остаться неподвижной. Если температура превысила заданную (обычно 50°С), срабатывает пороговое устройство и напряжение питания вентиляторов увеличивается до номинального (12 В). Пока температура не снизится, система охлаждения работает интенсивнее. Однако ее максимально возможная эффективность все-таки не достигается, так как заметная часть напряжения питания падает на коммутирующем элементе - биполярном транзисторе. В предлагаемом блоке регулирование напряжения, питающего двигатели, ведется импульсным методом! В качестве коммутирующих элементов использованы полевые транзисторы с очень низким (доли ома) сопротивлением каналов в открытом состоянии. Они не ограничивают пусковой токи практически не уменьшают питающее напряжение на работающих на полную мощность вентиляторах. Схема блока управления вентиляторами компьютера изображена на рис. 1. В нем два независимых канала управления. Выход первого канала, собранного на микросхемах DA1 и DA2 и транзисторах VT1, VT2, вилка ХР1, к которой подключают вентилятор, обдувающий теплоотвод процессора. Второй канал на микросхеме DA3 и транзисторе VT3 обслуживает другие вентиляторы системного блока, которые подключают к вилке ХР2
Рисунок 1: Блок управления вентиляторами компьютера
На интегральных таймерах DA2 и DA3 собраны одинаковые генераторы импульсов частотой 10…15 Гц. Цепи зарядки и разрядки времязадающих конденсаторов С1 и С2 (соответственно первого и второго генераторов) разделены диодами VD1-VD4, что позволяет регулировать скважность генерируемых импульсов переменными резисторами R4 и R5. Импульсы поступают на затворы полевых транзисторов VT2 и VT3, каналы которых (сопротивлением в открытом состоянии не более 0,35 Ом) включены последовательно в цепи питания вентиляторов. Изменяя скважность импульсов, можно регулировать частоту вращения роторов вентиляторов в очень широких пределах при сохранении достаточно большого пускового момента. Благодаря импульсному режиму работы полевых транзисторов рассеиваемая ими мощность очень мала, что позволяет не устанавливать эти транзисторы на теплоотводы. Конденсаторы С5 и С6 сглаживают перепады импульсов, что устраняет следующие с частотой повторения импульсов хорошо слышимые щелчки в двигателях вентиляторов. В канале управления вентилятором процессора имеется дополнительный узел, включающий этот вентилятор на полную мощность, если температура теплоотвода процессора выше допустимой. Узел построен по известной схеме на ОУ DA1. Датчиком температуры служит транзистор VT1, закрепленный на теплоотводе процессора. Температуру срабатывания устанавливают подстроечным резистором R7. Сигнал с выхода ОУ DA1 логически складывается с импульсами генератора на таймере DA2 с помощью диодов VD5 и VD6, в результате чего при превышении допустимой температуры транзистор VT2 открыт постоянно и вентилятор работает на полную мощность.
1.2 Управление вентиляторами ПК
Практически все устройства управления вентиляторами процессоров ПК регулируют их частоту вращения (а следовательно, и производительность), изменяя подаваемое на двигатель напряжение питания. В одних регуляторах снижение напряжения достигается уменьшением потенциала на плюсовом выводе питания вентилятора (в этом случае его минусовый вывод подключают к общему проводу), в других - увеличением потенциала на минусовом выводе (плюсовой подключают к проводу питания +12 В).
Рисунок 2: Преобразователь уровня сигнала на транзисторном оптроне
Так как выход таходатчика вентилятора выполнен на п-р-п транзисторе, включенном по схеме с открытым коллектором (эмиттер соединен с общим проводом), то в первом случае каких-либо проблем с передачей его сигнала на системную плату не возникает. Во втором случае снимать информацию с таходатчика невозможно, так как потенциал отрицательного вывода питания вентилятора изменяется в пределах 1…7 В (относительно общего провода питания компьютера), что соответствует подаваемому на вентилятор напряжению питания от 11 до 5 В (относительно провода питания компьютера +12 В).
Ситуацию можно изменить, применив простейший преобразователь уровня сигнала, собранный на транзисторном оптроне [2] (рис. 2). Поскольку выходное напряжение устройства управления изменяется от 5 до 11 В, а частота сигнала таходатчика не превышает сотен герц (при 12 000 мин-1 она равна 2x200 = 400 Гц - из-за двух магнитов в роторе), то достаточно обеспечить четкое срабатывание оптрона, и сигнал с таходатчика будет передан на системную плату.
Рисунок 3: Узел управления вентилятором на компараторе К554САЗ
Преобразователь включают в разрыв сигнального провода таходатчика между вентилятором и системной платой. Резистор R1 подбирают таким образом, чтобы оптрон надежно срабатывал от подаваемого на его светодиод напряжения (5…11 В) и при этом протекающий через него ток не превышал допустимого значения. Вместо АОТ123А допустимо применение любого другого транзисторного оптрона (или диодного с добавлением транзистора, работающего в ключевом режиме).
В некоторых случаях возможна доработка узла управления вентилятором, исключающая необходимость применения преобразователя уровня. Собирается оно на компараторе К554САЗ (КР554САЗ или LM311), работающем в линейном режиме (как ОУ). Вентилятор включен между плюсовым проводом питания и выходом компаратора с открытым коллектором (вывод 9), а выход с открытым эмиттером (вывод 2) соединен с общим проводом. Если вентилятор оснащен таходатчиком, то необходим преобразователь уровня его сигнала.
Однако компаратор К554САЗ позволяет использовать для управления нагрузкой и выход с открытым эмиттером. Для этого вывод 9 соединяют с плюсовым проводом источника питания, нагрузку включают между выводом 2 и общим проводом, а выход таходатчика подключают к разъему системной платы ПК. При этом неинвертирующий вход компаратора становится инвертирующим, а инвертирующий - неинвертирующим.
Принципиальная схема такого варианта устройства управления вентилятором изображена на рис. 3 (в скобках указаны номера выводов компараторов в восьмивыводном корпусе). Вследствие инвертирования входов компаратора цепь ООС R8C2 включена между выводами 3 и 2. Изменены номиналы резисторов R4 и R6, что обусловлено применением стабилитрона с другим напряжением стабилизации и транзистора серии КТ816 вместо КТ814.
Резистор R5 «отвечает» за смещение регулировочной характеристики, a R8 - за ее наклон. Сопротивление последнего - 0,1…1 МОм (чем оно больше, тем при более низкой температуре радиатора будет достигаться максимальная частота вращения вентилятора). Температура радиатора, при которой частота вращения становится максимальной, должна быть на 5…10°С ниже критической, когда уже нарушается стабильность процессора и системы в целом.
Резисторы R4 и R6 подбирают таким образом, чтобы при нормальной температуре (+25…30°С) напряжение на эмиттере транзистора VT1 находилось в интервале напряжений на верхнем и нижнем (по схеме) выводах подстроенного резистора R5. В заключение этим резистором добиваются вращения вентилятора с минимальной частотой при температуре радиатора +25…30°С.
Необходимо отметить, что из-за особенностей выбранной схемы включения компаратора максимальное напряжение на его выходе не превышает 9,8 В. Поэтому вентилятор следует взять с запасом по производительности.
1.3 Блок управления вентиляторами компьютера на Atmega48
Характеристики блока управления вентиляторами компьютера на контроллере Atmega48 [3]:
- 4 канала регулирования;
- регулировка выходного напряжения от 0 до практически 12 В ступеньками, 128 ступенек регулировки;
- регулятор выполнен по схеме ШИМ, поэтому в нем ничего не греется (по крайней мере так, чтобы было нужно ставить радиаторы);
- частота ШИМ 31250 Гц - ультразвуковой диапазон - поэтому работает бесшумно, никаких щелчков нет;
- после включения реобаса (компьютера) в течение 10 секунд происходит раскрутка вентиляторов на максимальном напряжении (12 вольт), одновременно происходит замер максимальной скорости вращения крыльчаток вентиляторов;
- после раскрутки напряжение в каналах устанавливается таким, каким оно было при последней регулировке и реобас переходит в рабочий режим;
- измерения скорости вращения крыльчаток вентиляторов происходит циклически, через 2 секунды выбирается очередной канал, измеряется скорость, результаты измерения выводятся на экран в виде абсолютного значения (в оборотах в минуту) и в виде процента от максимальной скорости;
- канал можно выключить, доведя уровень выходного напряжения до 0, при этом он не будет опрашиваться, а на экран выводится сообщение «выключен».
Рисунок 4: Схема блока управления вентиляторами компьютера на контроллере Atmega48
Микроконтроллер DD1 формирует 4 ШИМ сигнала для управления P-канальными MOSFET ключами DA1, DA2. Для тактирования микроконтроллера использован внутренний генератор 8 МГц, это позволило освободить пару выводов (для возможного в дальнейшем подключения датчиков температуры) и удешевить схему. Информация о работе каналов регулирования выводится на двухстрочный ЖК индикатор HL1, информация в индикатор передается по четырехбитной шине. Кнопки S1-S3 управляют работой реобаса, конденсаторы С2-С4, включенные параллельно кнопкам, предназначены для подавления дребезга, используются внутренние подтягивающие резисторы на выводах микроконтроллера, к которым подключены кнопки. Цепочка R9, C5 и внутренний подтягивающий резистор микроконтроллера выполняют функцию согласования уровней напряжения и, одновременно, функцию фильтра низкой частоты, подавляющего до определенной степени короткие импульсные помехи в тахосигнале вентилятора. Для облегчения поиска радиоэлементов, согласование уровней напряжения микроконтроллера и MOSFET ключей выполнено иначе, чем в предыдущей схеме: вместо микросхемы согласования уровней 74F07, использована другая схема питания (стабилизатор отрицательного напряжения DA3), в результате чего выводы Vcc микроконтроллера и Vdd индикатора подключены к напряжению +12 В, а выводы GND микроконтроллера и Vss индикатора подключены к напряжению +7 В (выходу стабилизатора DA3). Напряжения приведены по отношению к общему проводу (корпусу) питания компьютера.
2. Выбор и описание прототипов разрабатываемого устройства
В качестве прототипа приведем устройство «Автомат регулирования скорости вращения вентиляторов и контроля температуры в пяти точках» [4]. Конструкция предназначена для автоматического плавного регулирования скорости вращения вентиляторов в персональном компьютере. Позволяет контролировать температуру в пяти точках (процессор, блок питания, видеокарта и т.п.) и выводить полученное значение температуры на двухстрочный знакосинтезирующий ЖКИ. Пользователь может задать отдельно для каждого канала: температуру выключения вентилятора, температуру, при которой обороты вентилятора будут максимальны (максимальная температура) и температуру, при превышении которой срабатывает звуковой сигнал.
Устройство собрано на микроконтроллере фирмы Microchip PIC16F876 (должен подойти и PIC16F876А, но я не проверял). В качестве датчиков температуры используются цифровые датчики DS18B20, точность измерения температуры 0,1 С. Микроконтроллер изменяет частоту вращения вентиляторов, используя широтно-импульсную модуляцию. В качестве ключей управления вентиляторами используются мощные p-канальные МОП транзисторы IRF9Z34N. Для более полного открывания и исключения повреждения МК выходные транзисторы подключены к микроконтроллеру через маломощные n-канальные МОП транзисторы 2N7000.
Рисунок 5: Автомат регулирования скорости вращения вентиляторов и контроля температуры в пяти точках схема принципиальная
После подачи питания на микроконтроллер запускается тактовый генератор МК и начинает работать управляющая программа. Через секунду после включения происходит инициализация знакосинтезирующего ЖКИ, для надежного запуска двигателей вентиляторов на выходах RB0-RB4 выставляется высокий уровень, происходит запуск вентиляторов полным напряжением питания 12В. Затем на индикаторе появляется название устройства, в это время МК дает команду на преобразование температурным датчикам. Примерно через полторы секунды появляется значение измеренной температуры, затем МК, исходя из измеренной температуры и значений максимальной температуры, вычисляет период ШИМ и подает на соответствующий выход вычисленную последовательность импульсов. Устройство начинает работать в рабочем режиме.
Рисунок 6: Отображение работы
В первой строке индикатора отображается температура первого канала постоянно в виде SENS1=xx.xxxC и если датчик не подключен или неисправен, то отображается SENS1. К первому каналу целесообразно подключать процессор. Во второй строчке отображаются последовательно друг за другом значения температуры каналов 2-4 в виде SENSn=xx.xxxC, где n=2..4. Если датчик отключен, его имя и значение не отображается, напряжение на выходе такого канала без датчика =+12 В (т.е. выходной транзистор открыт). Сюда можно подключить вентилятор, обороты которого регулировать не надо или ничего не подключать.
В прошивке (по умолчанию) заданы следующие настройки для каждого из каналов:
максимальная температура T max - 80 С (при которой обороты вентилятора максимальны, т.е. транзистор открыт полностью);
температура отключения вентилятора T off - 20 C;
температура тревоги T alarm - 100 C (звучит зуммер BA1).
Пользователь может изменить настройки, войдя в меню настройки:
Рисунок 7: меню настройки
Для этого необходимо нажать и удерживать кнопку SB1. Кнопками SB2 и SB3 производится увеличение и уменьшение отображаемого значения. Переход к следующему значению происходит по нажатию SB1. После просмотра и корректировки введенные значения сохраняются в энергонезависимой памяти МК и считываются при последующем включении. Во время нахождения в меню температура с датчиков не считывается и подпрограмма расчета ШИМ работает с последним считанным значением температуры. Корректировка температуры возможна только в области положительных температур. Кроме того, значение максимальной температуры T max можно установить 255 С, это сделано, чтобы иметь возможность более плавно регулировать обороты вращения вентилятора. Здесь надо учесть, что если во время работы вентилятор будет останавливаться, не следует устанавливать слишком маленькое значение T max, так как вентилятор может и не стартовать после остановки. Режим старт-стоп вентилятора необходимо подбирать экспериментально. Отдельное слово о выборе вентиляторов. Чем больше размер вентилятора, тем больший воздушный поток он может создать при меньшем количестве оборотов. В обычном компьютере самые горячие места это видеокарта и процессор. На рисунке мой вентилятор, охлаждающий процессор.
Питание вентилятора подключено к разъему X8, т.е. красные и черные провода, а желтый провод подключен к гнезду FAN CPU на материнской плате в штатном включении. Таким образом, можно увидеть число оборотов в BIOS. Некоторые материнские платы, в частности ASUS, вообще не запустятся без датчика вращения вентилятора.
Основным отличием проектируемого устройства от рассмотренного прототипа является способ отображения текущей температуры в выбранной точке и мощности соответствующего вентилятора. За счет использования матричных светодиодных индикаторов достигается большая наглядность отображаемой информации и независимость от освещенности помещения.
3. Разработка структурной схемы устройства
Основными элементами в устройстве управления тепловым режимом компьютера будут являться вентиляторы, которые и будут производить охлаждение в выбранных точках, управление ими будет осуществляться путем изменения их питающего напряжения с помощью управляющих ключей. Регулировку напряжением на базе транзистора будет осуществлять микропроцессор из блока устройства управления (УУ), подавая ШИМ сигнал со скважностью, зависящей от температуры в соответствующей точке. ШИМ сигнал отфильтровывается и сглаживается фильтром низких частот, выполненным на RC цепи.
Устройство управления производит опрос и настройку датчиков температуры по интерфейсу 1-wire, с точностью до 0,5 С. При достижении в какой-либо из точек измерения температуры 45 С, производится запуск соответствующего вентилятора (его мощность устанавливается на уровне 2% от максимальной), далее при увеличении температуры на каждые 0,5 С, мощность вентилятора растет на 2%, и так до 70 С.
Для индикации режима работы устройства будет использоваться блок индикации (БИ) представляющий собой табло из набора светодиодных матричных индикаторов. Для полноты восприятия информации понадобится 10 светодиодных матричных индикаторов: 2 для отображения символа вентилятора и его номера, 3 для вывода мощности соответствующего вентилятора (0 - 100%); 2 для отображения датчика температуры и его номера, и еще 3 для индикации температуры датчика с точностью до 0,5 С. Способ индикации текста на табло динамический, т.е. в определенные моменты времени будет индицироваться один из рядов светодиодов, позиции зажженных столбцов светодиодов будут определяться регистрами сдвига, подключенными по одному каждому из знакомест. Между собой регистры сдвига подключаются последовательно, выход предыдущего на вход последующего, ко входу первого подключен управляющий вывод микропроцессора, к каждому из регистров параллельно подключен тактовый сигнал заведенный от второго управляющего вывода микропроцессора. Контроль над формированием текста на табло блока индикации производится управляющим устройством. Блок УУ будет попеременно зажигать каждый из рядов и в то же время заносить нужную информацию в регистры сдвига, таким образом формируя текст на табло. Для просмотра режима работы каждого вентилятора предусмотрена кнопка переключения табло, при нажатии которой на табло будет выводиться информация по следующему датчику и вентилятору.
В состав проектируемого устройства войдут следующие блоки:
1. УУ - устройство управления
2. БИ - блок индикации
3. БВ - блок вентиляторов
4. БДТ - блок датчиков температуры
4. Разработка принципиальной схемы устройства
Согласно со структурной схемой разработаем принципиальную схему.
В качестве управляющего устройства выберем микроконтроллер фирмы AVR. Для уточнения модели, нужно определиться с каким количеством выводов должен быть корпус микросхемы, так же важно подобрать модель с достаточным объемом памяти программ, превышающей объем разработанной программы минимум на 25%, с учетом на возможную доработку и усовершенствование. Так же данный микроконтроллер должен иметь модуль ШИМ и возможность прерывания по таймеру для реализации управления вентиляторами. Так как для работы с внешними устройствами задействовано 24 вывода, то выберем микроконтроллер ATmega16, он имеет 32 линии ввода / вывода, что больше чем у ATmega8 (23) и меньше чем у других моделей (ATmega162 - 35), так же у него достаточный объем памяти программ (16 кбайт при объеме разработанной программы 2,8 кбайт), и есть модуль ШИМ и таймеры [5].
Рисунок 8: Микропроцессор ATmega16
Краткие характеристики микропроцессора ATmega16:
32 8-разрядных рабочих регистра общего назначения
Производительность приближается к 16 MIPS (при тактовой частоте 16 МГц)
16 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)
Обеспечивает 1000 циклов стирания / записи
512 байт EEPROM
Обеспечивает 100000 циклов стирания / записи
1 Кбайт встроенной SRAM
Встроенная периферия
Два 8-разрядных таймера / счетчика с отдельным предварительным делителем, один с режимом сравнения
Один 16-разрядный таймер / счетчик с отдельным предварительным делителем и режимами захвата и сравнения
Счетчик реального времени с отдельным генератором
Четыре канала PWM
8-канальный 10-разрядный аналого-цифровой преобразователь
8 несимметричных каналов
Байт-ориентированный 2-проводный последовательный интерфейс
Программируемый последовательный USART
Последовательный интерфейс SPI (ведущий / ведомый)
Встроенный калиброванный RC-генератор
Внутренние и внешние источники прерываний
Выводы I/O и корпуса
32 программируемые линии ввода / вывода
40-выводной корпус PDIP и 44-выводной корпус TQFP
Рабочие напряжения
2,7 - 5,5 В (ATmega16L)
4,5 - 5,5 В (ATmega16)
Рабочая частота
0 - 8 МГц (ATmega16L)
0 - 16 МГц (ATmega16)
Для изначального функционирования микроконтроллера к его выводам VCC, AVCC, GND нужно подключить питание, кварцевый резонатор ZQ1 нужно подключить к выводам XTAL1, XTAL2 и через конденсаторы С5, С6 на землю, так же вывод RESET должен быть подтянут к питанию. К выводам PC0 - PC3 микроконтроллера подключаются выводы данных DQ датчиков температуры DD13 - DD16, а так же подтягивающие резисторы R12-R15 к питанию 5 В. Так как максимальное потребление тока одной светодиодной матрицы 30 мА [8], а в устройстве используется 10 таких матриц HG1-HG10, то общее потребление составит около 300 мА, а для управления включением одного ряда потребуется не менее 30 мА, максимальный ток через один вывод микропроцессора составляет 7 мА, следовательно, для управления включения рядов табло нужно подключить 10 транзисторных ключей VT5-VT11. Резисторы R5-R11 служат для ограничения напряжения подаваемого на базу транзисторных ключей с выводов микропроцессора. Для включения нужных рядов светодиодных матриц используются сдвиговые регистры DD3-DD13 (74LS164 [8]).
Для переключения режимов работы управляющего устройства используются кнопка SB1 подключенная к выводу PB3 микроконтроллера, и используется для переключения окна, в котором отображаются параметры скорости вращения вентиляторов MA1 - MA4, и температуры с датчиков температуры DD13 - DD16. Выводы микроконтроллера PB3 - PB7 используют внутренние подтягивающие резисторы.
Управление скоростью вращения вентиляторов производиться через выводы PA0 - PA3, на которых формируются ШИМ сигналы с регулируемой скважностью, через фильтры нижних частот представляющие собой RC - цепи (R1 и C1, R2 и C2, R3 и C3, R4 и C5), выделяются постоянные составляющие ШИМ сигналов, которые регулирует силу тока на транзисторах VT1, VT2, VT3, VT4 и соответственно напряжение питание на вентиляторах MA1, MA2, MA3, MA4.
Рисунок 9: Регистр сдвига 74LS164
74LS164 - 8-ми разрядный сдвиговый регистр с последовательным входом и параллельным выходом. Последовательные данные вводятся через элемент И с двумя входами. В микросхеме предусмотрен вывод сброса (MR), если установить его в низкий уровень, регистр обнулится, работа вывода сброса не зависит от тактового сигнала.
Характеристики:
Частота тактового сигнала до 35 МГц;
Асинхронный сброс;
Последовательная шина входных данных;
Полная синхронизация передаваемых данных;
Напряжение питания от 3,5В до 5,5В;
Максимальный ток 100 мА
Для контроля температуры будем использовать цифровой термометр DS18B20. Этот цифровой термометр обменивается данными по 1-Wire шине и при этом может быть как единственным устройством на линии, так и работать в группе. Все процессы на шине управляются центральным микропроцессором. Диапазон измерений от -55С до +125С и точность 0.5С. В дополнение, DS18B20 может питаться напряжением линии данных, при отсутствии внешнего источника питания. Каждый DS18B20 имеет уникальный 64-битный последовательный код, который позволяет, общаться с множеством датчиков DS18B20 установленных на одной шине. Такой принцип позволят использовать один микропроцессор, чтобы контролировать множество датчиков DS18B20, распределенных по большому участку.
Рисунок 10: Температурный датчик DS18B20
На рисунке 11 показана блок-схема DS18B20 - 64-битовый ROM запоминает уникальный последовательный код прибора. Оперативная память содержит 2-байтовый температурный регистр, который хранит значение температуры по окончанию температурного преобразования, два однобайтовых регистра температуры контроля температуры (триггерной схемы TH и TL), и регистр конфигурации. Регистр конфигурации позволяет пользователю устанавливать разрешающую способность цифрового преобразователя температуры к 9, 10, 11, или 12 битам, это и влияет на время конвертирования температуры. TH, TL и регистры конфигурации энергонезависимы (EEPROM), таким образом, они сохранят данные, когда прибор - выключен.
DS18B20 использует исключительно 1-Wire протокол - при этом формируется соединение, которое осуществляет коммуникацию на шине, используя всего один управляющий сигнал. Шина должна быть подключена к источнику питания через подтягивающий резистор, так как все устройства связаны с шиной, используют соединение через Z-состояния или вход открытого стока. Используя эту шину микропроцессор (устройство управления) идентифицирует и обращается к датчикам температуры, используя 64-битовый код прибора. Поскольку каждый прибор имеет уникальный код, число приборов, к которым можно обратиться на одной шине, фактически неограниченно.
Другая особенность DS18B20 - способность работать без внешнего питания. Эта возможность предоставляется через подтягивающий резистор. Высокий сигнал шины заряжает внутренний конденсатор (CPP), который питает прибор, когда на шине низкий уровень. Этот метод носит название «Паразитное питание». При этом максимальная измеряемая температура составляет + 100°C. Для расширения диапазона температур до + 125°C необходимо использовать внешнее питание.
Рисунок 11: Блок-схема DS18B20
5. Разработка программного обеспечения
include «m16def.inc» // подключить библиотеку
def Temp=R16 // присвоить имя регистру r16
def C_ed=R9 // присвоить имя регистру r9
def C_dec=R10 // присвоить имя регистру r10
def C_sotn=R11 // присвоить имя регистру r11
def C_symbol=R12 // присвоить имя регистру r12
def C_nom=R13 // присвоить имя регистру r13
def T_ed=R14 // присвоить имя регистру r14
def T_dec=R15 // присвоить имя регистру r15
def T_fl=R24 // присвоить имя регистру r24
def T_symbol=R25 // присвоить имя регистру r25
def T_nom=R26 // присвоить имя регистру r25
equ C=10
equ T=11
equ RS = 5 // управляющий вывод ЖКИ прием / передача
equ RW = 6 // управляющий вывод ЖКИ чтение / запись
equ E = 7 // управляющий вывод ЖКИ строб
org 0
jmp reset // перейти к началу программы
// ********** таблица вектаров прерывания *****************************************
org 2 nop //rjmp EXT_INT0;
org 4 nop //rjmp EXT_INT1;
org 6 nop //rjmp TIM2_COMP;
org 8 nop //rjmp TIM2_OVF;
org 10 nop //rjmp TIM1_CAPT;
org 12 nop //rjmp TIM1_COMPA;
org 14 rjmp TIM1_COMPB
org 16 nop //rjmp TIM1_OVF
org 18 nop //rjmp TIM0_OVF;
org 20 nop //rjmp SPI_STC;
org 22 nop //rjmp USART_RXC;
org 24 nop //rjmp USART_UDRE;
org 26 nop //rjmp USART_TXC;
org 28 nop //rjmp ADC;
org 30 nop //rjmp EE_RDY;
org 32 nop //rjmp ANA_COMP;
org 34 nop //rjmp TWI;
org 36 nop //rjmp INT2;
org 38 nop //rjmp TIMER0_COMP;
org 40 nop //rjmp SPM_RDY;
// *********************************************************************************
reset:
// ************** начальные установки **********************************************
ldi r19, high(RAMEND) // определить верхний адрес стека
out sph, r19 // установить верхний адрес стека
ldi r19, low(RAMEND) // определить нижний адрес стека
out spl, r19 // установить нижний адрес стека
ldi r16,0xff
out ddra, r16 // установить все выводы порта A как цифровые выходы
ldi r16,0xff
out ddrc, r16 // установить все выводы порта C как цифровые выходы
out ddrd, r16 // установить все выводы порта D как цифровые выходы
ldi r16,0x0f
out ddrb, r16 // установить все выводы порта B как цифровые входы
ldi r16,0x00
out SFIOR, r16 // подключить к выходам портов подтягивающие резисторы
ldi r16,0xf0
out pinb, r16 // установить все выводы порта B в еденичный уровень
ldi r29,0x03 // загрузить начальное значение регистра СТАТУС - okno2/cooler1
ldi r28,0x00 // сбросить счетчик шага ШИМ
// ******************* настройка прерывания по таймеру1 *********************************************
ldi r17, (1<<OCIE1B)
out TIMSK, r17 // разрешить прерывание по событию «совпадение B» таймера / счетчика Т1
ldi r17, (0<<PWM11)+(0<<PWM10)+(0<<COM1A1)+(0<<COM1A0)
out TCCR1A, r17 // режим работы таймера Т1 - normal, таймер Т1 отключен от выводов PD6, PD5, PD4
ldi r17,2
out TCCR1B, r17 // настроить пределить таймера Т1 clk/8
sei // общее разрешение прерываний
ldi r17,0x01 // значения заносимые в старший байт времени срабатывания прерывания таймера Т1
ldi r18,0x30 // значения заносимые в младший байт времени срабатывания прерывания таймера Т1
out OCR1BH, r17 // установить старший байт времени срабатывания прерывания таймера Т1
out OCR1BL, r18 // установить младший байт времени срабатывания прерывания таймера Т1
// **************************************************************************************************
call init_sensor1 // вызвать подпрограмму настройки датчика температуры 1
call init_sensor2 // вызвать подпрограмму настройки датчика температуры 2
call init_sensor3 // вызвать подпрограмму настройки датчика температуры 3
call init_sensor4 // вызвать подпрограмму настройки датчика температуры 4
// call init_LCD // инициализация ЖКИ
// ***************** основное тело программы в цикле ************************************************
ldi temp, C // занести символ C в буфер
mov C_symbol, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 1 // занести символ в буфер
mov C_nom, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 12 // занести символ в буфер
mov C_sotn, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 12 // занести символ в буфер
mov C_dec, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 12 // занести символ в буфер
mov C_ed, temp // копировать значени е буфера в регистр общего назначения
ldi temp, T // занести символ T в буфер
mov T_symbol, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 1 // занести символ в буфер
mov T_nom, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 12 // занести символ в буфер
mov T_fl, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 12 // занести символ в буфер
mov T_dec, temp // копировать значени е буфера в регистр общего назначения
ldi temp, 12 // занести символ в буфер
mov T_ed, temp // копировать значени е буфера в регистр общего назначения
programma:
call Form_string
call reset_pulse_s1 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s1 // подпрограмма передачи данных датчику1 по протоколу 1-wire
ldi r31,0x44 // начало конвертации температуры
call transmit_byte_s1 // подпрограмма передачи данных датчику1 по протоколу 1-wire
call Form_string
call reset_pulse_s2 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s2 // подпрограмма передачи данных датчику2 по протоколу 1-wire
ldi r31,0x44 // начало конвертации температуры
call transmit_byte_s2 // подпрограмма передачи данных датчику2 по протоколу 1-wire
call Form_string
call reset_pulse_s3 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s3 // подпрограмма передачи данных датчику3 по протоколу 1-wire
ldi r31,0x44 // начало конвертации температуры
call transmit_byte_s3 // подпрограмма передачи данных датчику3 по протоколу 1-wire
call Form_string
call reset_pulse_s4 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s4 // подпрограмма передачи данных датчику3 по протоколу 1-wire
ldi r31,0x44 // начало конвертации температуры
call transmit_byte_s4 // подпрограмма передачи данных датчику3 по протоколу 1-wire
call Form_string
call Form_string
// sbrc r29,1 // проверка режима работы, если режим АВТ выполнить следующую подпрограмму
call obrabotka_sensor1 // обработка и индикация данных о температуре с датчика1
call Form_string
// sbrc r29,2 // проверка режима работы, если режим АВТ выполнить следующую подпрограмму
call obrabotka_sensor2 // обработка и индикация данных о температуре с датчика2
call Form_string
// sbrc r29,3 // проверка режима работы, если режим АВТ выполнить следующую подпрограмму
call obrabotka_sensor3 // обработка и индикация данных о температуре с датчика3
call Form_string
// sbrc r29,4 // проверка режима работы, если режим АВТ выполнить следующую подпрограмму
call obrabotka_sensor4 // обработка и индикация данных о температуре с датчика3
call Form_string
sbrc r29,1 // проверка режима работы, если режим РУЧ выполнить следующую подпрограмму
call otobrajenie_cooler1 // индикация мощности cooler5
sbrc r29,2 // проверка режима работы, если режим РУЧ выполнить следующую подпрограмму
call otobrajenie_cooler2 // индикация мощности cooler5
sbrc r29,3 // проверка режима работы, если режим РУЧ выполнить следующую подпрограмму
call otobrajenie_cooler3 // индикация мощности cooler5
sbrc r29,4 // проверка режима работы, если режим РУЧ выполнить следующую подпрограмму
call otobrajenie_cooler4 // индикация мощности cooler5
sbis PINB, 4 // проверить нажата ли кнопка, если вывод 3 порта B = 0 - нажата
call KNOPKA // перейти к подпрограмме обработки нажатия кнопки 1
call sensor1_manag // подпраграмма настройки мощности cooler1 и cooler2 в зависемасти от данных температуры датчика1
call sensor2_manag // подпраграмма настройки мощности cooler3 и cooler4 в зависемасти от данных температуры датчика2
call sensor3_manag // подпраграмма настройки мощности cooler5 в зависемасти от данных температуры датчика3
call sensor4_manag
jmp programma
// ********************************************************************************************
/////////// подпрограмма обработки прерывания от таймера1 ////////////////////////////////////
TIM1_COMPB:
inc r28 // инкрементировать счетчик мипульсов
ldi r27,100
cpse r28, r27 // сравнение переполнение счетчика импульсов
jmp end_impuls_1 // перейти к обнулению счетчика
jmp begin_impuls // начало формирования мипульсов
begin_impuls:
sbi portb, 0 // установить на еденичный уравень напряжения на 1-ом вентиляторе
sbi portb, 1 // установить на еденичный уравень напряжения на 2-ом вентиляторе
sbi portb, 2 // установить на еденичный уравень напряжения на 3-ом вентиляторе
sbi portb, 3 // установить на еденичный уравень напряжения на 4-ом вентиляторе
sbi porta, 4 // установить на еденичный уравень напряжения на 5-ом вентиляторе
ldi r28,0
jmp cooler1_set
end_impuls_1:
cpse r28, r4
jmp end_impuls_2
cbi portb, 0
jmp end_impuls_2
end_impuls_2:
cpse r28, r5
jmp end_impuls_3
cbi portb, 1
jmp end_impuls_3
end_impuls_3:
cpse r28, r6
jmp end_impuls_4
cbi portb, 2
jmp end_impuls_4
end_impuls_4:
cpse r28, r7
jmp end_impuls_5
cbi portb, 3
jmp end_impuls_5
end_impuls_5:
cpse r28, r8
jmp cooler1_set
cbi porta, 4
jmp cooler1_set
cooler1_set:
mov r27, r4
subi r27,0
brne no_end_puls1
cbi portb, 0
no_end_puls1:
mov r27, r5
subi r27,0
brne no_end_puls2
cbi portb, 1
no_end_puls2:
mov r27, r6
subi r27,0
brne no_end_puls3
cbi portb, 2
no_end_puls3:
mov r27, r7
subi r27,0
brne no_end_puls4
cbi portb, 3
no_end_puls4:
ldi r27,0 // очистить младший разряд счетчика таймера 1
out TCNT1L, r27
ldi r27,0 // очистить старший разряд счетчика таймера 1
out TCNT1H, r27
reti
//////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма обработки нажатия кнопки 4 (СДВИГ) //////////////////////////////////
KNOPKA:
sbis PINB, 4 // задержка выполнения подпрограммы до отжатия кнопки 1
jmp KNOPKA // зациклить
sbrc r29,1
jmp sdvig_na_c2
sbrc r29,2
jmp sdvig_na_c3
sbrc r29,3
jmp sdvig_na_c4
sbrc r29,4
jmp sdvig_na_c5
sbrc r29,5
jmp sdvig_na_c1
ret
sdvig_na_c2:
cbr r29,0x02
sbr r29,0x04
ret
sdvig_na_c3:
cbr r29,0x04
sbr r29,0x08
ret
sdvig_na_c4:
cbr r29,0x08
sbr r29,0x10
ret
sdvig_na_c5:
cbr r29,0x10
sbr r29,0x20
ret
sdvig_na_c1:
cbr r29,0x20
sbr r29,0x02
ret
ret
//////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма индикации мощности cooler1 ////////////////////////////////////////
otobrajenie_cooler1:
ldi temp, C
mov C_symbol, temp
ldi temp, 1
mov C_nom, temp
ldi r17,100 // занести в рег r17 значение верхнего предела мощности двигателя
cpse r17, r4 // сравнение мощности двигателя (значение рег r30) с верхним пределом (значение рег r17)
jmp c1_LCD_30_90 // перейти к отроботке индикации мощности от 30% до 90%
jmp c1_LCD_100
c1_LCD_30_90:
mov r18, r4
call hex_to_binary_decimal
ldi temp, 12
mov C_sotn, temp // занести «»
mov C_dec, r19
mov C_ed, r18
ret
c1_LCD_100:
ldi temp, 1
mov C_sotn, temp // занести «»
ldi temp, 0
mov C_dec, temp
ldi temp, 0
mov C_ed, temp
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма индикации мощности cooler2 ////////////////////////////////////////
otobrajenie_cooler2:
ldi temp, C
mov C_symbol, temp
ldi temp, 2
mov C_nom, temp
ldi r17,100 // занести в рег r17 значение верхнего предела мощности двигателя
cpse r17, r5 // сравнение мощности двигателя (значение рег r30) с верхним пределом (значение рег r17)
jmp c2_LCD_30_90 // перейти к отроботке индикации мощности от 30% до 90%
jmp c2_LCD_100
c2_LCD_30_90:
mov r18, r5
call hex_to_binary_decimal
ldi temp, 12
mov C_sotn, temp // занести «»
mov C_dec, r19
mov C_ed, r18
ret
c2_LCD_100:
ldi temp, 1
mov C_sotn, temp // занести «»
ldi temp, 0
mov C_dec, temp
ldi temp, 0
mov C_ed, temp
ret // выход из подпрограммы
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма индикации мощности cooler3 ////////////////////////////////////////
otobrajenie_cooler3:
ldi temp, C
mov C_symbol, temp
ldi temp, 3
mov C_nom, temp
ldi r17,100 // занести в рег r17 значение верхнего предела мощности двигателя
cpse r17, r6 // сравнение мощности двигателя (значение рег r30) с верхним пределом (значение рег r17)
jmp c3_LCD_30_90 // перейти к отроботке индикации мощности от 30% до 90%
jmp c3_LCD_100
c3_LCD_30_90:
mov r18, r6
call hex_to_binary_decimal
ldi temp, 12
mov C_sotn, temp // занести «»
mov C_dec, r19
mov C_ed, r18
ret
c3_LCD_100:
ldi temp, 1
mov C_sotn, temp // занести «»
ldi temp, 0
mov C_dec, temp
ldi temp, 0
mov C_ed, temp
ret // выход из подпрограммы
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма индикации мощности cooler4 ////////////////////////////////////////
otobrajenie_cooler4:
ldi temp, C
mov C_symbol, temp
ldi temp, 4
mov C_nom, temp
ldi r17,100 // занести в рег r17 значение верхнего предела мощности двигателя
cpse r17, r7 // сравнение мощности двигателя (значение рег r30) с верхним пределом (значение рег r17)
jmp c4_LCD_30_90 // перейти к отроботке индикации мощности от 30% до 90%
jmp c4_LCD_100
c4_LCD_30_90:
mov r18, r7
call hex_to_binary_decimal
ldi temp, 12
mov C_sotn, temp // занести «»
mov C_dec, r19
mov C_ed, r18
ret
c4_LCD_100:
ldi temp, 1
mov C_sotn, temp // занести «»
ldi temp, 0
mov C_dec, temp
ldi temp, 0
mov C_ed, temp
ret // выход из подпрограммы
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма настройки температурного датчика1 //////////////////////////////////
init_sensor1:
call reset_pulse_s1 // вызвать подпрограмму импульс сброса датчика1
ldi r31,0xcc // команда skip ROM
call transmit_byte_s1
ldi r31,0x4e // команда записи в регистры аврии и конфигурации
call transmit_byte_s1
ldi r31,0xdd // занести значение в старший байт аварии
call transmit_byte_s1
ldi r31,0xaa // занести значение в младший байт аварии
call transmit_byte_s1
ldi r31,0x0f // настроить регистор конфигурации
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма настройки температурного датчика2 //////////////////////////////////
init_sensor2:
call reset_pulse_s2 // вызвать подпрограмму импульс сброса датчика2
ldi r31,0xcc // команда skip ROM
call transmit_byte_s2
ldi r31,0x4e // команда записи в регистры аврии и конфигурации
call transmit_byte_s2
ldi r31,0xdd // занести значение в старший байт аварии
call transmit_byte_s2
ldi r31,0xaa // занести значение в младший байт аварии
call transmit_byte_s2
ldi r31,0x0f // настроить регистор конфигурации
call transmit_byte_s2
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма настройки температурного датчика3 //////////////////////////////////
init_sensor3:
call reset_pulse_s3 // вызвать подпрограмму импульс сброса датчика2
ldi r31,0xcc // команда skip ROM
call transmit_byte_s3
ldi r31,0x4e // команда записи в регистры аврии и конфигурации
call transmit_byte_s3
ldi r31,0xdd // занести значение в старший байт аварии
call transmit_byte_s3
ldi r31,0xaa // занести значение в младший байт аварии
call transmit_byte_s3
ldi r31,0x0f // настроить регистор конфигурации
call transmit_byte_s3
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма настройки температурного датчика4 //////////////////////////////////
init_sensor4:
call reset_pulse_s4 // вызвать подпрограмму импульс сброса датчика2
ldi r31,0xcc // команда skip ROM
call transmit_byte_s4
ldi r31,0x4e // команда записи в регистры аврии и конфигурации
call transmit_byte_s4
ldi r31,0xdd // занести значение в старший байт аварии
call transmit_byte_s4
ldi r31,0xaa // занести значение в младший байт аварии
call transmit_byte_s4
ldi r31,0x0f // настроить регистор конфигурации
call transmit_byte_s4
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма обработки и индикации данных с температурного датчика1 /////////////
obrabotka_sensor1:
call reset_pulse_s1 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s1
ldi r31,0xbe // команда датчику DS18B20 передать содержимое регистров памяти ROM
call transmit_byte_s1
call delay_50
call reception_byte_s1 // принять младший байт данных
mov r18, r31
call reception_byte_s1 // принять старший байт данных
mov r19, r31
lsr r18
lsr r18
lsr r18
lsl r19
lsl r19
lsl r19
lsl r19
lsl r19
add r18, r19
mov r0, r18
lsr r18
call hex_to_binary_decimal // подпрограмма перевода шеснадцатичеричного значения температуры в двоично десятичное
sbrs r29,1
ret
ldi temp, T
mov T_symbol, temp
ldi temp, 1
mov T_nom, temp
mov T_dec, r19
mov T_ed, r18
sbrc r0,0
jmp lcd_5_s1
ldi temp, 0x00 // «0»
jmp lcd_fl_s1
lcd_5_s1:
ldi temp, 0x05 // «5»
lcd_fl_s1:
mov T_fl, temp
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма управления мощностью cooler1 и cooler2 температурным датчиком1 /////
sensor1_manag:
// вентилятор1
ldi r16,0
mov r4, r16
ldi r16,90
sub r16, r0
brlo ustan_cooler_11
ret
ustan_cooler_11:
ldi r16,140
sub r16, r0
brlo ustan_cooler_11 + 8
ldi r16,90
sub r0, r16
lsl r0
mov r4, r0
ret
nop
nop
nop
ldi r16,100
mov r4, r16
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма управления мощностью cooler1 и cooler2 температурным датчиком1 /////
sensor2_manag:
// вентилятор1
ldi r16,0
mov r5, r16
ldi r16,90
sub r16, r1
brlo ustan_cooler_21
ret
ustan_cooler_21:
ldi r16,140
sub r16, r1
brlo ustan_cooler_21 + 8
ldi r16,90
sub r1, r16
lsl r1
mov r5, r1
ret
nop
nop
nop
ldi r16,100
mov r5, r16
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма управления мощностью cooler1 и cooler2 температурным датчиком1 /////
sensor3_manag:
// вентилятор1
ldi r16,0
ldi r16,90
sub r16, r2
brlo ustan_cooler_31
ret
ustan_cooler_31:
ldi r16,140
sub r16, r2
brlo ustan_cooler_31 + 10
ldi r16,90
sub r2, r16
lsl r2
mov r6, r2
ret
nop
nop
nop
nop
nop
nop
ldi r16,100
mov r6, r16
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма управления мощностью cooler1 и cooler2 температурным датчиком1 /////
sensor4_manag:
// вентилятор1
ldi r16,0
mov r7, r16
ldi r16,90
sub r16, r3
brlo ustan_cooler_41
ret
ustan_cooler_41:
ldi r16,140
sub r16, r3
brlo ustan_cooler_41 + 8
ldi r16,90
sub r3, r16
lsl r3
mov r7, r3
ret
nop
nop
nop
ldi r16,100
mov r7, r16
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма обработки и индикации данных с температурного датчика2 /////////////
obrabotka_sensor2:
call reset_pulse_s2 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s2
ldi r31,0xbe // команда датчику DS18B20 передать содержимое регистров памяти ROM
call transmit_byte_s2
call delay_50
call reception_byte_s2 // принять младший байт данных
mov r18, r31
call reception_byte_s2 // принять старший байт данных
mov r19, r31
lsr r18
lsr r18
lsr r18
lsl r19
lsl r19
lsl r19
lsl r19
lsl r19
add r18, r19
mov r1, r18
lsr r18
call hex_to_binary_decimal // подпрограмма перевода шеснадцатичеричного значения температуры в двоично десятичное
sbrs r29,2
ret
ldi temp, T
mov T_symbol, temp
ldi temp, 2
mov T_nom, temp
mov T_dec, r19
mov T_ed, r18
sbrc r1,0
jmp lcd_5_s2
ldi temp, 0x00 // «0»
jmp lcd_fl_s2
lcd_5_s2:
ldi temp, 0x05 // «5»
lcd_fl_s2:
mov T_fl, temp
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма обработки и индикации данных с температурного датчика3 /////////////
obrabotka_sensor3:
call reset_pulse_s3 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s3
ldi r31,0xbe // команда датчику DS18B20 передать содержимое регистров памяти ROM
call transmit_byte_s3
call delay_50
call reception_byte_s3 // принять младший байт данных
mov r18, r31
call reception_byte_s3 // принять старший байт данных
mov r19, r31
lsr r18
lsr r18
lsr r18
lsl r19
lsl r19
lsl r19
lsl r19
lsl r19
add r18, r19
mov r2, r18
lsr r18
call hex_to_binary_decimal // подпрограмма перевода шеснадцатичеричного значения температуры в двоично десятичное
sbrs r29,3
ret
ldi temp, T
mov T_symbol, temp
ldi temp, 3
mov T_nom, temp
mov T_dec, r19
mov T_ed, r18
sbrc r2,0
jmp lcd_5_s3
ldi temp, 0x00 // «0»
jmp lcd_fl_s3
lcd_5_s3:
ldi temp, 0x05 // «5»
lcd_fl_s3:
mov T_fl, temp
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма обработки и индикации данных с температурного датчика3 /////////////
obrabotka_sensor4:
call reset_pulse_s4 // вызвать подпрограмму импульс сброса
ldi r31,0xcc // команда skip ROM
call transmit_byte_s4
ldi r31,0xbe // команда датчику DS18B20 передать содержимое регистров памяти ROM
call transmit_byte_s4
call delay_50
call reception_byte_s4 // принять младший байт данных
mov r18, r31
call reception_byte_s4 // принять старший байт данных
mov r19, r31
lsr r18
lsr r18
lsr r18
lsl r19
lsl r19
lsl r19
lsl r19
lsl r19
add r18, r19
mov r3, r18
lsr r18
call hex_to_binary_decimal // подпрограмма перевода шеснадцатичеричного значения температуры в двоично десятичное
sbrs r29,4
ret
ldi temp, T
mov T_symbol, temp
ldi temp, 4
mov T_nom, temp
mov T_dec, r19
mov T_ed, r18
sbrc r3,0
jmp lcd_5_s4
ldi temp, 0x00 // «0»
jmp lcd_fl_s4
lcd_5_s4:
ldi temp, 0x05 // «5»
lcd_fl_s4:
mov T_fl, temp
ret
/////////////////////////////////////////////////////////////////////////////////////////////
/////////// подпрограмма перевода шеснадцатиричного числа в двоично-десятичное //////////////
Подобные документы
Выбор и описание прототипов разрабатываемого устройства. Разработка структурной и принципиальной схемы. Обоснование программного обеспечения, используемого в разработке продукта. Моделирование устройство. Формирование программы для микропроцессора.
курсовая работа [2,0 M], добавлен 10.11.2014Основания для выбора контроллера, который подключается по IDE-шине к устройству CD-ROM. Принцип действия устройства, описание структурной и принципиальной схемы. Выбор элементной базы. Алгоритм работы устройства, разработка программного обеспечения.
курсовая работа [136,0 K], добавлен 23.12.2012Наименование разрабатываемого устройства. Назначение разрабатываемого устройства в городском транспорте. Обзорный анализ найденных аналогов. Обоснование актуальности разработки устройства. Разработка функциональной схемы разрабатываемого устройства.
курсовая работа [175,6 K], добавлен 04.07.2008Разработка структурной схемы устройства управления учебным роботом. Выбор двигателя, микроконтроллера, микросхемы, интерфейса связи и стабилизатора. Расчет схемы электрической принципиальной. Разработка сборочного чертежа устройства и алгоритма программы.
курсовая работа [577,8 K], добавлен 24.06.2013Разработка устройства для дефектоскопирования наружного кольца роликового подшипника, построение его структурной и принципиальной схем. Описание алгоритма работы, создание программного обеспечения и сопряжение устройства с персональным компьютером.
дипломная работа [3,4 M], добавлен 10.03.2013Анализ способов сопряжения персонального компьютера с разрабатываемым устройством. Разработка интерфейса ПК. Объединение модулей микропроцессорного устройства в единую систему. Выбор аналоговых коммутаторов. Разработка структурной схемы устройства.
курсовая работа [426,7 K], добавлен 03.05.2014Разработка принципиальной электрической схемы микропроцессорного устройства управления двигателем постоянного тока на базе контроллера ATmega 128. Разработка пакета подпрограмм на языке Assembler в целях регулирования и корректной работы устройства.
курсовая работа [271,5 K], добавлен 14.01.2011Описание алгоритма функционирования устройства сопряжения, которое подключается к системной шине ISA. Принципиальная и функциональная схемы интерфейсной и операционной части устройства. Моделирование схемы операционной части, построение диаграммы работы.
курсовая работа [50,7 K], добавлен 13.11.2009Разработка алгоритма работы. Выбор и обоснование структурной схемы. Разработка функциональной схемы блока ввода и блока вывода. Проектирование принципиальной схемы блока ввода и блока вывода, расчет элементов. Разработка программного обеспечения.
курсовая работа [1,7 M], добавлен 25.12.2011Разработка структурной и функциональной схем устройства, в основе которой лежит аналого-цифровой преобразователь. Выбор и обоснование элементной базы для реализации устройства, разработка конструкции. Расчеты, подтверждающие работоспособность схемы.
курсовая работа [656,0 K], добавлен 05.12.2012