Курсовой проект
Москва 2015
Расчетно-пояснительная записка
Техническое задание на проектирование
Исходные данные:
1
Эскизный проект
Описание алгоритма работы станции
2
Принципиальная схема
3
Плата
4
Расчет и обоснование выбора элементов
Выбор компонентов проведен на основе имеющихся в продаже. Перед
выбором элементов было проведено исследование существующих паяльных
станций: как правило, они управляются 2-4 кнопками, выводят значения на
семисегментные, либо жидкокристаллические индикаторы и имеют разъем
для подключения паяльника – составного устройства из нагревателя и
чувствительного элемента. Диапазон температур обычно составляет от 100
до 500 °C. Максимальная мощность нагревательной части, как правило, не
превышает 80 Ватт.
5
на разряд), но являются более хрупкими и требуют дополнительной
подсветки в условиях плохой освещенности.
При выборе реле нужно учесть, что мощность бытового паяльника, как
правило, не превышает 100 Вт. Следовательно,
Pmax 100
I max= = =0,45[ A ] (1)
U 220
9
5−1,78
R1−8 min = = 322 [Ом] (2)
10∗10−3
5−1,78
R1−8 max = =536 [Ом] (3)
6∗10−3
Был выбран резистор 390 кОм, в таком случае ток каждого катода будет
равен
5−1,78
I= =0,0083=8,3[ мА ] (4)
390∗103
I =8,3∗8=66,4[ мА ] ( 5)
что означало, что номиналы двух резисторов совпали. Этот номинал составил
50 кОм. Из этого вытекает требование к кнопкам: при замыкании на общий
провод через кнопку потечёт ток:
U 5
I max= =
R 50∗10 3
=0,0001 [ А ]=100 [ мкА ] (12)
11
а рабочее напряжение, прикладываемое к кнопкам, равно 5 В, отсюда были
выбраны кнопки 0695HIM-130G-G с рекомендуемым рабочим напряжением
не выше 12 В и рабочим током не более 0,05 А.
12
Перечень элементов
Поз.
Наименование Кол-во Примечание
обозначение
Fuse High Byte – 0xDF (1101 1111), Fuse Low Byte – 0xFF (1111 1111)
** монтаж проводом
13
Код программы на языке C
//--------------------------------------------------------------
------------
// Программа для контроллера нагревателя (паяльника, термоса и
т.п.)
// Микроконтроллер Atmega48p
// Тактовая частота 8 МГц
//--------------------------------------------------------------
------------
//--------------------------------------------------------------
------------------------------------------------
// Секция подключения заголовочных файлов (библиотек)
//--------------------------------------------------------------
------------------------------------------------
#include <avr/io.h> // для ввода-вывода
#include <avr/interrupt.h> // для прерываний
#include <util/delay.h> // для задержки
#include <avr/eeprom.h> // для работы с памятью EEPROM
//--------------------------------------------------------------
------------------------------------------------
// Секция настроек
//--------------------------------------------------------------
------------------------------------------------
#define LED_DELAY 4
#define MAX_TEMPERATURE 300
#define MIN_TEMPERATURE 100
#define STATE_NOT_PRESSED 0
#define STATE_SHORT_PRESS 1
#define STATE_LONG_PRESS 2
#define LED_A 7
#define LED_B 5
#define LED_C 4
#define LED_D 1
#define LED_E 0
#define LED_F 6
14
#define LED_G 3
#define LED_DP 2
#define DIG_HI 3
#define DIG_MD 4
#define DIG_LO 5
//#define COMMON_CATODE
//--------------------------------------------------------------
------------------------------------------------
#ifdef COMMON_CATODE
#else
#endif
//--------------------------------------------------------------
------------------------------------------------
// массив "температур"
const uint16_t TEMPS[] =
{ 778, 768, 759, 749, 740, 730, 721, 711, 702, 692,
683, 676, 669, 655, 648, 641, 633, 626, 618, 611,
603, 596, 588, 581, 574, 566, 560, 553, 546, 540,
533, 527, 521, 515, 509, 503, 497, 491, 485, 480,
474, 469, 464, 458, 453, 448, 440, 433, 426, 419,
412, 410, 408, 405, 403, 401, 397, 392, 388, 384,
379, 375, 371, 368, 364, 360, 356, 353, 349, 345,
342, 338, 335, 331, 328, 325, 321, 318, 315, 312,
309, 306, 303, 300, 297, 294, 291, 288, 286, 283,
280, 278, 275, 273, 271, 268, 265, 263, 260, 258,
255, 253, 251, 249, 246, 244, 242, 240, 238, 236,
234, 232, 230, 228, 226, 224, 220, 220, 218, 216,
214, 213, 211, 209, 207, 205, 204, 202, 201, 199,
197, 195, 194, 192, 191, 189, 201, 199, 198, 184,
182, 181, 180, 179, 177, 176, 175, 174, 173, 172,
171};
// Устанавливаемая температура
volatile uint16_t temperature_setup = 0;
// Устанавливаемая температура для работы с EEPROM
EEMEM uint16_t temperature_setup_eeprom;
// Измеряемая температура
volatile uint16_t temperature_real = 0;
// Состояние кнопок (не нажата/короткое нажатие/долгое нажатие)
volatile uint8_t buttons_state = STATE_NOT_PRESSED;
// Флаг нажатия кнопки
volatile uint8_t button_flag = 255;
// Флаг необходимости измерений
volatile uint8_t measure_fla = 0;
//--------------------------------------------------------------
------------------------------------------------
// функция инициализации (запись начальных значений в
необходимые регистры)
//--------------------------------------------------------------
------------------------------------------------
inline void init(void) {
// управление реле
PORTB |= (1<<2);
// управление реле
DDRB |= (1<<2);
// направление порта D на вывод
DDR_LED |= 0xFF;
// направление пинов 0,1,2 порта В на вывод - подключены аноды
индикатора через PNP-транзисторы
16
DDR_DIG |= (1<<DIG_HI)|(1<<DIG_MD)|(1<<DIG_LO);
// подаем питание на пины 0,1,2 порта В - гасим индикаторы
PORT_DIG |= (1<<DIG_HI)|(1<<DIG_MD)|(1<<DIG_LO);
// подтяжка питания к кнопкам
PORTC |= (1<<0)|(1<<2);
// подтяжка к внутреннему источнику питания
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0);
// Делитель таймера TIMER0 на 256
TCCR0B = (1<<CS02);
// Включение таймера TIMER0 по переполнению
TIMSK0 = (1<<TOIE0); }
//--------------------------------------------------------------
------------------------------------------------
// функция отображения на индикаторах трехзначного числа,
передаваемого в параметре temperature
//--------------------------------------------------------------
------------------------------------------------
inline static void show_number(uint16_t temperature, uint8_t
show_dp) {
// выводим сотни
PORT_LED = NUMBERS[temperature%1000/100];
// зажигаем старший разряд на индикаторе подаем 0 вольт
PORT_DIG &= ~(1<<DIG_HI);
_delay_ms(LED_DELAY);
// гасим старший разряд на индикаторе подаем 5 вольт
PORT_DIG |= (1<<DIG_HI);
// выводим десятки
PORT_LED = NUMBERS[temperature%100/10];
// зажигаем средний разряд на индикаторе
PORT_DIG &= ~(1<<DIG_MD);
_delay_ms(LED_DELAY);
// гасим средний разряд на индикаторе
PORT_DIG |= (1<<DIG_MD);
// выводим единицы
PORT_LED = NUMBERS[temperature%10];
// если было указано в параметре show_dp
if (show_dp)
// то зажигаем точку
PORT_LED &= ~(1<<LED_DP);
// зажигаем младший разряд на индикаторе
PORT_DIG &= ~(1<<DIG_LO);
_delay_ms(LED_DELAY);
// гасим младший разряд на индикаторе
PORT_DIG |= (1<<DIG_LO); }
//--------------------------------------------------------------
------------------------------------------------
// функция опроса кнопок
//--------------------------------------------------------------
------------------------------------------------
inline static void check_buttons(void) {
// защита от одновременного нажатия двух кнопок и последующая
задержка
if (BUTTON_INC_PRESSED && BUTTON_DEC_PRESSED) {
button_flag = 120;
17
return;
}
// обработка кнопки "больше"
if (BUTTON_INC_PRESSED && (button_flag < 60)) {
INC_TEMPERATURE(temperature_setup);
eeprom_write_word(&temperature_setup_eeprom,
temperature_setup);
button_flag = 120;
}
// обработка кнопки "меньше"
if (BUTTON_DEC_PRESSED && (button_flag < 60)) {
DEC_TEMPERATURE(temperature_setup);
eeprom_write_word(&temperature_setup_eeprom,
temperature_setup);
button_flag = 120;
}
}
//--------------------------------------------------------------
------------------------------------------------
// функция проверки температуры на попадание в границы диапазона
//--------------------------------------------------------------
------------------------------------------------
inline static void check_temperature(uint16_t* t) {
if (*t < MIN_TEMPERATURE) *t = MIN_TEMPERATURE;
if (*t > MAX_TEMPERATURE) *t = MAX_TEMPERATURE;
}
//--------------------------------------------------------------
------------------------------------------------
// функция измерения температуры
//--------------------------------------------------------------
------------------------------------------------
inline static void measure_temperature(uint16_t* t) {
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) |
(1<<ADPS0);
uint16_t v = ADCL;
v |= (ADCH << 8);
//--------------------------------------------------------------
------------------------------------------------
// функция обработки сравнения установленной и измеренной
температур
//--------------------------------------------------------------
18
------------------------------------------------
inline static void compare_temperature(void) {
if (temperature_real < temperature_setup) {
RELAY_ON();
}
else {
RELAY_OFF();
}
}
//--------------------------------------------------------------
------------------------------------------------
// функция обработки прерываний по таймеру TIMER0
//--------------------------------------------------------------
------------------------------------------------
ISR(TIMER0_OVF_vect) {
measure_flag--;
if (button_flag) button_flag--;
}
//--------------------------------------------------------------
------------------------------------------------
// начало работы программы (точка старта)
//--------------------------------------------------------------
------------------------------------------------
int main(void) {
init();
// инициализация
temperature_setup =
eeprom_read_word(&temperature_setup_eeprom);
check_temperature(&temperature_setup);
19
Список использованных источников:
Приложение
21
470 7,2
510 6,6
560 6
22