Введение
Внастоящее время встроенные компьютерные системы получают все большеераспространение из-за их высокого качества и надежности, а так же простотыобработки информации.
Микроконтроллерыявляются ядром многих современных устройств и приборов, в том числе и бытовых.Главной особенностью микроконтроллеров является то, что с их помощью легче изачастую гораздо дешевле реализовать различные схемы.
Однимииз самых популярных микроконтроллеров на сегодняшний день являютсямикроконтроллеры фирмы Atmel. Они основаны на новой RISC-архитектуре, которая была разработана сиспользованием достижений полупроводниковой микроэлектроники и возможностейпрограммного обеспечения 1990-х годов. Созданные в результате микроконтроллерыимеют самое высокое соотношение производительность/потребление энергии,доступное на рынке 8-разрядных микроконтроллеров.
Языкипрограммирования высокого уровня быстро становятся стандартным методом программированиядля встроенных микроконтроллеров из-за уменьшения времени разработки иупрощенной поддержки сопровождения. Архитектура микроконтроллеров фирмы Atmel быларазработана совместно с экспертами языка Си, чтобы гарантировать, чтоаппаратные средства и программное обеспечивают получение высокоэффективногокода.
В данномкурсовом проекте разрабатывается устройство управления системой измерения веса,построенном на микроконтроллере ATmega16фирмы Atmel.
1.Анализ поставленной задачи
Системаизмерения веса построена на весовом индикаторе WE2108, который является измерительным усилителем дляподключения 4х датчиков веса. Сигнал датчиков веса усиливается и преобразуетсяприбором в цифровую форму и отображается на встроенном дисплее. Управлениесистемой в целом осуществляется микроконтроллером ATmega16, который принимает от WE2108 сигнал превышения заданного уровня срабатывания и выдаетсоответствующие сигналы управления задвижками бункера и транспортером.
Структурнаясхема системы приведена на рисунке 1.1.
/>
Рисунок1.1 — Структурная схема системы
Работасистемы заключается в следующем: в бункере находится груз (например, песок),который необходимо отсыпать дозированными порциями. Тележка заезжает наплатформу, на которой установлены весовые датчики. Прибор WE2108 позволяет задать функциютарирования, при выполнении которой запоминается текущее значение массы тележкии это значение вычитается из последующих значений веса. Т.е., если платформа свесовыми датчиками нагружена только пустой тележкой, то прибор показываетнулевое значение. При нажатии кнопки Пуск микроконтроллер ATmega16 выдает сигнал включениятранспортера, а после выдержки времени в 5 секунд на открытие бункера. Тележка начинаетнаполняться грузом. Как только вес тележки с грузом достигнет заданного, WE2108 выдает сигнал о превышенииустановленного веса. ATmega16получает этот сигнал, закрывает бункер и после выдержки времени в 5 секундостанавливает транспортер.
Предложенныйдля решения задачи микроконтроллер ATmega16 обладает следующими характеристиками:
• напряжениепитания+5 V
• размер памятипрограмм 16 К
• размер EEPROM512 В
• размер внутреннейSRAM 1 К
• портыввода/вывода4x8 bit
• четыре таймерасчетчика
• программируемыйпоследовательный УСАПП
Этихсвойств микроконтроллера вполне достаточно для обеспечения управления задвижкамибункера и временем работы транспортера.
2.Проектирование принципиальной схемы устройства
2.1Схема включения микроконтроллера
МикроконтроллерAVR типа ATmega16 имеет напряжение питания +5 V, которое подводится к выводу VCC. Так как питание всего нашегоустройства +10 V, то питание кмикроконтроллеру должно подводится через понижающий импульсный стабилизатор.Кроме этого, микроконтроллер имеет еще два вывода для питания порта А (илиАЦП), один из которых (AVCC)должен быть подключен к напряжению питания даже если порт А не используется. Еслииспользуется АЦП, то это питание должно подключатся через фильтр низких частот.Второй вывод (AREF) используется для подачи напряжениясмещения на АЦП.
В нашемустройстве АЦП не используется, поэтому к выводам VCC и AVCCможно подключить предварительно стабилизированное питание +5 V от стабилизатора, а вывод AREF подключить к общей шине земли.
/>
Рис.2.1– Условное обозначение ATmega16
2.2Формирование тактовых импульсов
Тактовые импульсы дляработы микроконтроллера можно формировать с помощью либо встроенного генератораимпульсов, либо подключая внешний генератор. Внешний генератор в данном случаене является приемлемым выбором, так как для получения импульсов заданнойчастоты для него нужна отдельная схема деления. Внутренний генератор, хотя иобладает меньшей стабильностью, по сравнению с внешним генератором (ностабильность можно повысить, подключив кварцевый резонатор), имеет встроенныйделитель тактовой частоты. Предварительный делитель позволяет делить тактовуючастоту на 8, 64, 256 и 1024. Выбор коэффициента деления тактовой частоты задаетсябитами CS02, CS01, CS00регистра управления т/сч0 TCCR0или битами CS12, CS11, CS10регистра управления т/сч1. Для данной схемы выбран коэффициент деления 1024,обеспечивающий максимальную задержку.
2.3 Схема сброса
Схемасброса должна формировать импульс логического нуля для подачи его на инверсныйвывод сброса микроконтроллера RESET.Это импульс должен формироваться, например, при нажатии на кнопку сбросаустройства или при переключении ключа.
Длятакой схемы подходит включение транзистора, показанное на рисунке 2.2. Когдаключ открыт, транзистор находится в закрытом состоянии и на вход RESET AVR поступает сигнал логической единицы. Когда ключзамыкается, транзистор открывается и на вход сброса устройства поступает сигналлогического нуля.
/>
Рис. 2.3– Схема формирования импульса сброса
2.4Схема стабилизатора напряжения
Вкачестве стабилизатора напряжения в нашем устройстве используется импульсныйпонижающий стабилизатор LM2574,который обладает следующими характеристиками:
• входноенапряжение — до 60 V (для HV версий)
• выходноенапряжение — 3.3 V, 5 V, 12 V, 15V
• выходной ток — 0.5 А
Схемавключения стабилизатора для преобразования +10 V — +5 Vприведена на рисунке 2.4.
/>
Рис. 2.4- Схема включения стабилизатора напряжения LM2574
2.5 Входные и выходныеустройства
Входными устройствами в данномпроекте являются весовой индикатор WE2108, который имеет вывод превышения заданного уровня срабатывания идатчики положения заслонки бункера (открыт/закрыт). На выводе превышениязаданного уровня срабатывания формируется уровень лог. 0, когда превышензаданный вес, предварительно занесенный в память прибора WE2108.
Весовой индикатор WE2108 является измерительнымусилителем для подключения 4х датчиков веса. Сигнал датчиков веса усиливается ипреобразуется прибором в цифровую форму и отображается на встроенном дисплее. WE2108 является полностьюсамостоятельным устройством со встроенным микропроцессором и позволяетвыполнять широкий спектр задач связанных с измерением веса. Допустимоенапряжение питания для прибора составляет от +10В до +35В постоянного тока.
Выходные устройства –сигналы управления задвижками бункера и транспортером выдаваемые через портымикроконтроллера ATmega16. Такжепредусмотрена индикация количества отгрузок на 4х разрядном 7-ми сегментноминдикаторе.
3. Разработка программногообеспечения микроконтроллера
3.1 Разработка алгоритмапрограммы
Программадолжна выполнять следующие функции:
• обработка нажатия кнопки Пуск;
• управление заслонками бункера иработой транспортера;
• обработку сигнала превышениязаданного веса;
• выдачу количества отгрузок на 4хразрядный 7-ми сегментный индикатор.
Выполнениеэтих операций происходит по следующему алгоритму:
/>
/>
Рис. 3.1 – Алгоритмпрограммы.
3.2 Проектированиефункций микроконтроллера
Процедураинициализации микроконтроллера должна состоять из процедур или операторовинициализации всех узлов самого микроконтроллера и всех периферийных устройств,и установить все начальные значения для их регистров..
Порт Аработает на вывод данных, а порт С работает на прием сигналов. Поэтому при ихнастройке необходимо в соответствующие биты регистров DDRx, которые управляют направлением передачи данных,записать значение 0 или 1, тем самым, настроив их выводы на прием или передачуданных.
3.2.1Инициализация таймера/счетчика0
8-разрядныйтаймер/счетчик может получать импульсы тактовой частоты – СК с предварительногоделителя (СК/8, СК/64, СК/8256, СК/1024), импульсы с внешнего вывода или бытьостановлен соответствующими установками регистра TCCR0. Флаг переполнения таймера находится в регистре TIFR. Разрешение и запрещение прерыванийот таймера управляется регистром TIMSK.
SREG – регистрсостояния7 6 5 4 3 2 1 I T H S V N Z C R/W R/W R/W R/W R/W R/W R/W R/W
Рис 3.2- регистр состояния SREG
I – общееразрешение прерываний, 1 – разрешено.
Т –хранение копируемого бита.
Н – флагполовинного переноса.
S – бит знака.
V – флагпереполнения дополнения до двух.
N – флаготрицательного результата.
Z – флаг нулевогорезультата.
C – флаг переноса.
TCCR0 — данный регистр служит дляуправления частотой и источником тактовых импульсов таймера (см. таблицу)7 6 5 4 3 2 1 - - - - - CS02 CS01 CS00 R R R R R R/W R/W R/W
Рис. 3.3– Регистр управления таймером/счетчиком0 TCCR0
Биты 7…3зарезервированы и всегда читаются как 0.
Биты 2,1, 0 – выбор коэффициента деления предварительного делителя.CS02 CS01 CS00 Значение Стоп 1 СК 1 СК/8 1 1 СК/64 1 СК/256 1 1 СК/1024 1 1 Вн. Сигнал Т0, нар. фронт 1 1 1 Вн. Сигнал Т0, спад. фронт
Рис. 3.4–Выборкоэффициента деления предварительного делителя.
TCNT0 – данный регистр служит длязагрузки и считывания показаний счетчика/таймера0.7 6 5 4 3 2 1 MSB LSB R/W R/W R/W R/W R/W R/W R/W R/W
Рис. 3.5– регистр текущего значения счетчика TCNT0
TIMSK – данный регистр служит дляустановки и сброса флагов разрешения работы прерываний таймеров.7 6 5 4 3 2 1 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 R/W R/W R/W R/W R/W R/W R/W R/W
Рис. 3.6– регистр масок прерываний таймеров
TOIE1 – разрешениепрерывания по переполнению таймера/счетчика 0
OCIE1A — разрешение прерывания по совпадению таймера/счетчика 1
TIFR — данныйрегистр содержит флаги прерываний таймеров7 6 5 4 3 2 1 OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0 R/W R/W R/W R/W R/W R/W R/W R/W
Рис. 3.7– регистр флагов прерываний таймеров.
TOV1 – флагпереполнения таймера/счетчика 0. 1 – произошло переполнение
OCF1A – флаг выхода совпадения 1А. 1 –произошло совпадение значения таймера/счетчика 1 и данных в регистре OCR1A.
3.2.2 Инициализация таймера/счетчика1
16-разрядныйтаймер/счетчик может получать импульсы тактовой частоты – СК с предварительногоделителя (СК/8, СК/64, СК/8256, СК/1024), импульсы с внешнего вывода или бытьостановлен соответствующими установками регистра TCCR1B.Флаги состояния таймера (переполнения, совпадения и захвата) и управляющиесигналы находятся в регистре TIFR.Разрешение и запрещение прерываний от таймера управляется регистром TIMSK.
Таймер/счетчик1поддерживает функцию совпадения, используя регистр совпадения OCR1A в качестве источника для сравнения с содержимым счетчика.Функция совпадения поддерживает очистку счетчика по совпадению.
TCNT1 — данный регистр служит длязагрузки и считывания показаний счетчика/таймера.15 14 13 12 11 10 9 8 MSB LSB 7 6 5 4 3 2 1
Рис. 3.8– регистр текущего значения счетчика TCNT1
TCCR1B – регистр управлениятаймером/счетчиком17 6 5 4 3 2 1 ICNC1 ICES1 - WGM13 WGM2 CS12 CS11 CS10 R/W R/W R/W R/W R/W R/W R/W R/W
Рис. 3.9– Регистр управления таймером/счетчиком1 TCCR1B
Биты 2,1, 0 – выбор коэффициента деления предварительного делителя.CS02 CS01 CS00 Значение Стоп 1 СК 1 СК/8 1 1 СК/64 1 СК/256 1 1 СК/1024 1 1 Вн. Сигнал Т1, нар. фронт 1 1 1 Вн. Сигнал Т1, спад. фронт
Рис. 3.10–Выборкоэффициента деления предварительного делителя.
Инициализациятаймера/счетчика1 происходит только при вызове функции Time wate (), котораяустанавливается делитель частоты на 1024, путем записи значения PrescalerTmr1=5 в регистр TCCR1B.
OCR1A – регистр совпадения Атаймера/счетчика1. В этом регистре хранятся данные, которые непрерывносравниваются с текущим значением таймера/счетчика1. Действие по совпадениюзадается регистрами управления таймером/счетчиком1 и регистром состояния.15 14 13 12 11 10 9 8 MSB LSB 7 6 5 4 3 2 1
Рис. 3.11 — регистрсовпадения А таймера/счетчика1 OCR1A
Рассчитаемзначение, которое необходимо занести в OCR1A длясравнения с содержимым таймера/счетчика1.
Количествотактовых импульсов, которые приходят на таймер/счетчик1 за 1 секунду, рассчитываетсяпо формуле:
/>, где
К –значение делителя частоты
f – значениечастоты генератора
Выбираемзначение делителя частоты 1024, т.к. это максимально возможный коэффициентделения/задержки. Частота генератора задается путем подключения кварцевогорезонатора к соответствующим выводам контроллера. В данном случае был выбранкварц на 7, 3728*106 Гц.
/>
Т.к. необходимавыдержка в 5 секунд то:
7200*5=36000
Т.к.прерывание по совпадению таймера/счетчика1 происходит только на следующий тактпосле совпадения, необходимо от значения 36000 вычесть 1. Это значениеприсваивается переменной comp_t1=35999, которая заносится в OCR1A.
void Time_wate(void)
{#asm(«cli»)
TCCR1B = PrescalerTmr1;
OCR1A = comp_t1;
#asm(«sei»)
while(Tmr1Flag == 0)
}
3.3 Процедура обработкинажатия кнопки Пуск
Процедура обработкинажатия кнопки Пуск, вызывается при переполнении таймера/счетчика0. Использованиетаймера для проверки состояния порта через заданные интервалы времени являетсянекоторой защитой от импульсных помех. Еще более повысить устойчивость приемасигнала от датчика импульсов в условиях помех можно за счет использованиямажоритарного элемента. Если известно текущее состояние входного сигнала и дваего предшествующих состояния, то значение сигнала определяется по следующемупринципу:OldOldPortSignal OldPortSignal NewPortSignal RealSignal Comment НОЛЬ! 1 Кажется, ноль 1 Кажется, ноль 1 1 1 Кажется, единица 1 Кажется, ноль 1 1 1 Кажется, единица 1 1 1 Кажется, единица 1 1 1 1 ЕДИНИЦА!
void CheckButton (void)
{
unsigned char b;
static char OldPortSignal;
static char OldOldPortSignal;
NewPortSignal = PINC&1; //select PC0 — START_button
b = PINC&7; //select PC1,PC2 — bunker sensors
if((NewPortSignal != OldPortSignal) & (NewPortSignal != 0)) //Positive front found
{ RealSignal = (NewPortSignal ^ OldPortSignal) ^ OldOldPortSignal;
OldOldPortSignal = OldPortSignal;
OldPortSignal = RealSignal;
if(b) //bunker CLOSED!
{
PORTA=0x01; //PA0 — transporter ON!
Time_wate(); //wate 5 sec!
Tmr1Flag = 0;
PORTA=0x03; //PA0&PA1 — bunker OPEN!
}
}
}
3.4 Процедура индикации
Выводитна на 4х разрядный 7-ми сегментный индикатор количество совершенных отгрузок.Индикатор подключен к порту В микроконтроллера. Управление разрядами индикатораосуществляется через порт D.
Впроцедуре используются 3 функции.
ПерваяBin2BCD_4Digit выполняет преобразование числа отгрузок, представленных вдвоичном виде, в BCD число ипоразрядно заносит его в массив BufBCD:
void Bin2BCD_4Digit (unsigned int data)
{
unsigned char i;
for(i=0;i
{
BufBCD[i] = data % 10;
data /= 10;
}
Втораяфункция Bin2Seg_4Digitпреобразовывает полученное BCDчисло в семисегментный эквивалент (путем вызова функции Bin2Seg) и заноситрезультаты в массив BufSeg. Семисегментные эквиваленты представлены в видезаранее определенных значений
#define Dig0 SegA + SegB + SegC + SegD + SegE + SegF + 0
#define Dig1 0 + SegB + SegC + 0 + 0 + 0 + 0
#define Dig2 SegA + SegB + 0 + SegD + SegE + 0 + SegG
#define Dig3 SegA + SegB + SegC + SegD + 0 + 0 + SegG
#define Dig4 0 + SegB + SegC + 0 + 0 + SegF + SegG
#define Dig5 SegA + 0 + SegC + SegD + 0 + SegF + SegG
#define Dig6 SegA + 0 + SegC + SegD + SegE + SegF + SegG
#define Dig7 SegA + SegB + SegC + 0 + 0 + 0 + 0
#define Dig8 SegA + SegB + SegC + SegD + SegE + SegF + SegG
#define Dig9 SegA + SegB + SegC + SegD + 0 + SegF + SegG
#define DigMinus 0 + 0 + 0 + 0 + SegЕ + 0 + 0
unsigned char Bin2Seg (unsigned char data)
{
switch(data)
{
case 0: return Dig0;
case 1: return Dig1;
case 2: return Dig2;
case 3: return Dig3;
case 4: return Dig4;
case 5: return Dig5;
case 6: return Dig6;
case 7: return Dig7;
case 8: return Dig8;
default: return Dig9;
}
}
//== Convert 4 digits from BinBuf[] into SegBuf[] ==========
void Bin2Seg_4Digit (void)
{
unsigned char i;
for(i=0;i
{
BufSeg[3-i] = Bin2Seg(BufBCD[i]);
}
Третьяфункция выполняет собственно индикацию, выводя через порт В полученныйсемисегментный эквивалент числа отгрузок.
void Ind (void)
{
unsigned char i;
for(i=0;i
{
PositionPort = AllDigitsOFF;
SymbolPort = BufSeg(i);
PositionPort = DigitNmb(i)
}
4. Листингпрограммы
Файл ind.h
//== Include files =================================
#include
#define PortBMask 0xFF
//== Common declarations ============================
#define SymbolPort PORTB
#define SegA 1 // aa
#define SegB 2 // f b
#define SegC 4 // f b
#define SegD 8 // gg
#define SegE 16 // e c
#define SegF 32 // e c
#define SegG 64 // dd
#define Dig0 SegA + SegB + SegC + SegD + SegE + SegF + 0
#define Dig1 0 + SegB + SegC + 0 + 0 + 0 + 0
#define Dig2 SegA + SegB + 0 + SegD + SegE + 0 + SegG
#define Dig3 SegA + SegB + SegC + SegD + 0 + 0 + SegG
#define Dig4 0 + SegB + SegC + 0 + 0 + SegF + SegG
#define Dig5 SegA + 0 + SegC + SegD + 0 + SegF + SegG
#define Dig6 SegA + 0 + SegC + SegD + SegE + SegF + SegG
#define Dig7 SegA + SegB + SegC + 0 + 0 + 0 + 0
#define Dig8 SegA + SegB + SegC + SegD + SegE + SegF + SegG
#define Dig9 SegA + SegB + SegC + SegD + 0 + SegF + SegG
#define DigMinus SegA + SegB + SegC + SegD + 0 + SegF + SegG
#define PositionPort PORTD
#define Position0 0
#define Position1 1
#define Position2 2
#define Position3 3
#define AllDigitsOFF 4
#define DigitNmb = [254, 253, 251, 247]
//== Global Variables =========================
unsigned char BufSeg[4];
unsigned char BufBCD[4];
void Bin2BCD_4Digit (unsigned int data);
//== Convert binary char into 7 Segment Code =============
unsigned char Bin2Seg (unsigned char data)
{
switch(data)
{
case 0: return Dig0;
case 1: return Dig1;
case 2: return Dig2;
case 3: return Dig3;
case 4: return Dig4;
case 5: return Dig5;
case 6: return Dig6;
case 7: return Dig7;
case 8: return Dig8;
default: return Dig9;
}
}
//== Convert 4 digits from BinBuf[] into SegBuf[] ============
void Bin2Seg_4Digit (void)
{
unsigned char i;
for(i=0;i
{
BufSeg[3-i] = Bin2Seg(BufBCD[i]);
}
}
//== Convert int value into 4 Digits of SegBuf[] ==============
void Bin2BCD_4Digit (unsigned int data)
{
unsigned char i;
for(i=0;i
{
BufBCD[i] = data % 10;
data /= 10;
}
}
//== Show the next Digit ================
void Ind (void)
{
unsigned char i;
for(i=0;i
{
PositionPort = AllDigitsOFF;
SymbolPort = BufSeg(i);
PositionPort = DigitNmb(i)
}
}
Файл main.c
//== Include files =========================
#include
#include
#include
#include «ctype.h»
#include «stdlib.h»
//== Common declarations ==========================
#define Tmr0_Reload 1;
#define PrescalerTmr0 4; // timer0 counts clk/256
#define PrescalerTmr1 5; // timer1 counts clk/1024
#define comp_t1 36000-1; // coBnaDeHie 1ro taimepa
//== Global Variables ==========================
unsigned char Tmr0Flag;
unsigned char Tmr1Flag;
unsigned char Tmr0Cnt;
unsigned char NewPortSignal;
unsigned char RealSignal;
unsigned char kol_otg;
//== Port Initialisation ===================================
void Init(void)
{
DDRA = 0xff; //Port A pins as output
PORTA = 0x00; //Send 0xFF to PortA output pins
DDRC = 0; //Port C pins as input
PORTC = 0xfe; //Turn ON PullUP for PortC pins
#asm(«cli»)
TIMSK = (1
TCNT0 = Tmr0_Reload;
TCCR0 = PrescalerTmr0;
#asm(«sei»)
}
//== Time wate ====================================
void Time_wate(void)
{
#asm(«cli»)
TCCR1B = PrescalerTmr1;
OCR1A = comp_t1;
#asm(«sei»)
while (Tmr1Flag == 0)
{}
}
//== CheckButton ====================================
void CheckButton (void)
{
unsigned char b;
static char OldPortSignal;
static char OldOldPortSignal;
NewPortSignal = PINC&1; //select PC0 — START_button
b = PINC&7; //select PC1,PC2 — bunker sensors
if((NewPortSignal != OldPortSignal) & (NewPortSignal != 0)) //Positive front found
{RealSignal = (NewPortSignal ^ OldPortSignal) ^ OldOldPortSignal;
OldOldPortSignal = OldPortSignal;
OldPortSignal = RealSignal;
if(b) //bunker CLOSED!
{
PORTA=0x01; //PA0 — transporter ON!
Time_wate(); //wate 5 sec!
Tmr1Flag = 0;
PORTA=0x03; //PA0&PA1 — bunker OPEN!
}
}
}
//== Main Procedure =====================
void main(void)
{
Init();
while(1)
{
unsigned char c;
if (Tmr0Flag)
{
Tmr0Flag=0;
Tmr0Cnt++;
if(Tmr0Cnt>10)
{
Tmr0Cnt=0;
CheckButton();
}
}
c = PINC&4; //select PC3 — overflow signal from WE2108
if(c)
{
PORTA=0x07; //PA2 — bunker CLOSE!
Time_wate(); //wate 5 sec!
Tmr1Flag = 0;
PORTA=0x00; //PA0 — tranporter OFF!
}
kol_otg++;
Bin2BCD_4Digit(kol_otg);
Bin2Seg_4Digit();
Ind ();
}
}
//== Interrup vectors ===============================
interrupt [TIM0_OVF] void TIMER0_OVF_interrupt(void)
{
TCNT0=Tmr0_Reload;
Tmr0Flag = 1;
}
interrupt [TIM1_COMPA] void TIMER1_COMP_interrupt(void)
{
Tmr1Flag = 1;
#asm(«cli»)
TCCR1B = 0;
#asm(«sei»)
}
//==End =========================================
5. Проектированиепечатной платы устройства
Дляразводки печатной платы была использована программа LayoutPlus пакета OrCad. Данная программа позволяет производить разводкупечатных плат, как в автоматическом режиме, так и в ручном.
Схемунеобходимо создавать таким образом, что бы на ней не оставалось ни одногосвободного входа/выхода или висячего провода. Необходимо убрать всевспомогательные компоненты схемы (источники тока, напряжения, генераторы идругие), и прописать в свойствах компонентов раздела Footprint тип корпуса.
Вустановках LayoutPlus выставляется количество слоев, ширинадорожек, расстояние между дорожками, между дорожками и контактными площадками,угол поворота дорожек. Затем производится разводка в автоматическом режиме,создается координатная сетка, и проставляются размеры.
Врезультате была получена печатная плата, показанная в приложении Б… Платаизготавливается из фольгированного стеклотекстолита толщиной 1 — 5 мм. Всеотверстия на плате должны быть металлизированы
Заключение
В данномкурсовом проекте была разработана устройство управления системой измерениявеса, построенном на микроконтроллере ATmega16 фирмы Atmel.
Микроконтроллерпринимает сигналы от датчиков веса и управляет ленточным транспортером и бункером,тем самым, обеспечивая автоматическое взвешивание груза дозированными порциями.
Дляустройства управления в пакете OrCadбыла разработана печатная плата.
Разработанноеустройство управления является полностью законченным прибором со всеминеобходимыми функциями. Но при желании или необходимости его возможности могутбыть расширены.
Приложение
/>