Главная страница
Навигация по странице:

  • Proteus

  • Atmel

  • Altium

  • 2.1. Разработка структурной схемы часов

  • 2.2. Разработка принципиальной схемы электронных часов

  • 2.3. Разработка программного кода

  • 2.3. Моделирование электронных часов в среде разработки Proteus

  • 2.4. Разработка печатной платы

  • ГЛАВА 3. ЭКОНОМИЧЕСКАЯ ЭФФЕКТИВНОСТЬ ВНЕДЕРЕНИЯ ПРОЕКТА

  • Расчёт затрат на материалы

  • 3) Расчёт затрат на электроэнергию и амортизацию электромонтажного оборудования.

  • 4) Расчёт расходов на заработную плату.

  • РАЗРАБОТКА ЧАСОВ С МИКРОПРОЦЕССОРНЫМ УПРАВЛЕНИЕМ. Разработка часов с микропроцессорным управлением


    Скачать 1.11 Mb.
    НазваниеРазработка часов с микропроцессорным управлением
    Дата06.02.2022
    Размер1.11 Mb.
    Формат файлаdocx
    Имя файлаРАЗРАБОТКА ЧАСОВ С МИКРОПРОЦЕССОРНЫМ УПРАВЛЕНИЕМ.docx
    ТипДиплом
    #353003
    страница3 из 4
    1   2   3   4

    1.3 Выбор программного обеспечения для проектирования


    Проектировка устройства, построенного на базе микроконтроллера, проходит через несколько этапов разработки. Для создания необходимой документации используется специализированное программное обеспечение:

    1. Для реализации схемотехнического моделирования и разработки функциональной схемы была выбрана программная среда Proteus Professional, так как имеет широкую зарекомендованную популярность в инженерном деле за счет своих функций и возможностей.

    2. Средой разработки программного кода был выбран Atmel Studio от одноименной компании производителя микроконтроллеров. Приоритетным достоинством данной программы являются её бесплатность, количество библиотек и поддержка со стороны компании-разработчика.

    3. Для проектировки печатной платы выбор пал на Altium Designer из-за количества и качества числа функций редактирования, а также удобности проектировки из-за возможности переключения между этапами разработки печатной платы.


    ГЛАВА 2. ПРОЕКТИРОВАНИЕ ЧАСОВ НА БАЗЕ МИКРОКОНТРОЛЛЕРА


    В данной главе описывается процесс проектирования электронных часов на базе микроконтроллера, включая разработку структурной и принципиальной схемы, написание программного кода и создание печатной платы.

    2.1. Разработка структурной схемы часов

    Для разработки нам необходимо учесть необходимые блоки для реализации работы:

    1. Блок часов реального времени для установки данных;

    2. Микроконтроллер для связи с RTC через шину I2C;

    3. Дисплей для вывода информации;

    4. Кнопки для установки данных.



    Рисунок 2.1 – Структурная схема часов на базе микроконтроллера

    2.2. Разработка принципиальной схемы электронных часов

    Средой разработки принципиальной схемы была выбрана программа Proteus Professional. Данная программа позволяет собрать схему электронного устройства и симулировать его работу, выявляя ошибки, допущенные на стадии проектирования.

    Для сборки нам потребуются: микроконтроллер Atmega8, часы реального времени DS1307, жидкокристаллический дисплей LM016L, две тактовые кнопки, два подтягивающих резистора и кристалл кварца. Собранная схема представлена ниже:



    Рисунок 2.2 – Принципиальная схема электронных часов

    2.3. Разработка программного кода

    Исходя из спроектированной принципиальной схемы, необходимо приступить к разработке программного кода в Atmel Studio.

    В первую очередь необходимо задать тактовую частоту процессора и подключить стандартные библиотеки:

    #define F_CPU 8000000UL

    #include

    #include

    Дальше производим функцию инициализации шины TWI/I2C:

    void I2CInit(void)

    {

    TWBR = 2; // Настройка частоты шины

    TWSR = (1 << TWPS1)|(1 << TWPS0); // Предделитель на 64

    TWCR |= (1 << TWEN); // Включение модуля TWI

    }

    Подключаем функции “старт” и “стоп” шины I2C:

    // Функция СТАРТ

    void I2CStart(void)

    {

    TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTA); // Передача условия СТАРТ

    while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT

    }
    // Функция СТОП

    void I2CStop(void)

    {

    TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTO); // Передача условия СТОП

    while(TWCR & (1 << TWSTO)); // Ожидание завершения передачи условия СТОП

    }

    Дальше реализуем функции записи и чтения данных по шине I2C:

    // Функция записи данных по шине

    uint8_t I2CWriteByte(uint8_t data)

    {

    TWDR = data; // Загрузка данных в TWDR

    TWCR = (1 << TWEN)|(1 << TWINT); // Сброс флага TWINT для начала передачи данных

    while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT

    // Проверка статуса

    // Если адрес DS1307+R и принято "подтверждение"(0x18)

    // или адрес DS1307+W и принято "подтверждение"(0x40)

    // или передается байт данных и принято "подтверждение"(0x28)

    if((TWSR & 0xF8) == 0x18 || (TWSR & 0xF8) == 0x40 || (TWSR & 0xF8) == 0x28) return 1; // OK

    else return 0; // ОШИБКА

    }
    // Функция чтения данных по шине

    uint8_t I2CReadByte(uint8_t *data,uint8_t ack)

    {

    // Возвращаем "подтверждение" после приема

    if(ack) TWCR |= (1 << TWEA);

    // Возвращаем "неподтверждение" после приема

    // Ведомое устройство не получает больше данных

    // обычно используется для распознования последнего байта

    else TWCR &= (1 << TWEA);

    // Разрешение приема данных после сброса TWINT

    TWCR |= (1 << TWINT);

    while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT

    // Проверка статуса

    // Если принят байт данных и возвращается "подтверждение"(0x50)

    // или принят байт данных и возвращается "ненеподтверждение"(0x58)

    if((TWSR & 0xF8) == 0x50 || (TWSR & 0xF8) == 0x58)

    {

    *data = TWDR; // Читаем данные из TWDR

    return 1; // OK

    }

    else return 0; // ОШИБКА

    }

    Производим функцию записи и чтения данных с часов реального времени DS1307:

    // Функция чтения данных из DS1307

    uint8_t DS1307Read(uint8_t address,uint8_t *data)

    {

    uint8_t res;

    I2CStart(); // СТАРТ

    res = I2CWriteByte(0b11010000); // адрес DS1307+W

    if(!res) return 0; // ОШИБКА

    // Передача адреса необходимого регистра

    res = I2CWriteByte(address);

    if(!res) return 0; // ОШИБКА

    I2CStart(); // Повторный СТАРТ

    res = I2CWriteByte(0b11010001); // адрес DS1307+R

    if(!res) return 0; // ОШИБКА

    // Чтение данных с "неподтверждением"

    res = I2CReadByte(data,0);

    if(!res) return 0; // ОШИБКА

    I2CStop(); // СТОП

    return 1; // OK

    }
    // Функция записи данных в DS1307

    uint8_t DS1307Write(uint8_t address,uint8_t data)

    {

    uint8_t res;

    I2CStart(); // СТАРТ

    res = I2CWriteByte(0b11010000); // адрес DS1307+W

    if(!res) return 0; // ОШИБКА

    // Передача адреса необходимого регистра

    res = I2CWriteByte(address);

    if(!res) return 0; // ОШИБКА

    res = I2CWriteByte(data); // Запись данных

    if(!res) return 0; // ОШИБКА

    I2CStop(); // СТОП

    return 1; // OK

    }

    Дальше подключаем функции LCD-дисплея для работы с передачей команд и данных:

    // Функции работы с LCD

    #define RS PD0

    #define EN PD2

    // Функция передачи команды

    void lcd_com(unsigned char p)

    {

    PORTD &= (1 << RS); // RS = 0 (запись команд)

    PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD)

    PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл

    _delay_us(100);

    PORTD &= (1 << EN); // EN = 0 (конец записи команды в LCD)

    _delay_us(100);

    PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD)

    PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл

    _delay_us(100);

    PORTD &= (1 << EN); // EN = 0 (конец записи команды в LCD)

    _delay_us(100);

    }

    // Функция передачи данных

    void lcd_data(unsigned char p)

    {

    PORTD |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD)

    PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший ниббл

    _delay_us(100);

    PORTD &= (1 << EN); // EN = 0 (конец записи команды в LCD)

    _delay_us(100);

    PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD)

    PORTD &= 0x0F; PORTD |= (p << 4); // младший ниббл

    _delay_us(100);

    PORTD &= (1 << EN); // EN = 0 (конец записи команды в LCD)

    _delay_us(100);

    }

    Подключаем функцию вывода строки на экран:

    // Функция вывода строки на LCD

    void lcd_string(unsigned char command, char *string)

    {

    lcd_com(0x0C);

    lcd_com(command);

    while(*string != '\0')

    { lcd_data(*string);

    string++;

    }

    }

    Подключаем функцию вывода переменной:

    // Функция вывода переменной

    void lcd_num_to_str(unsigned int value, unsigned char nDigit)

    {

    switch(nDigit)

    {

    case 4: lcd_data((value/1000)+'0');

    case 3: lcd_data(((value/100)%10)+'0');

    case 2: lcd_data(((value/10)%10)+'0');

    case 1: lcd_data((value%10)+'0');

    }

    }

    Реализуем функцию инициализации LCD-дисплея:

    // Функция инициализации LCD

    void lcd_init(void)

    {

    PORTD = 0x00;

    DDRD = 0xFF;

    _delay_ms(50); // Ожидание готовности ЖК-модуля

    // Конфигурирование четырехразрядного режима

    PORTD |= (1 << PD5);

    PORTD &= (1 << PD4);

    // Активизация четырехразрядного режима

    PORTD |= (1 << EN);

    PORTD &= (1 << EN);

    _delay_ms(5);

    lcd_com(0x28); // шина 4 бит, LCD - 2 строки

    lcd_com(0x08); // полное выключение дисплея

    lcd_com(0x01); // очистка дисплея

    _delay_us(100);

    lcd_com(0x06); // сдвиг курсора вправо

    lcd_com(0x0C); // включение дисплея, курсор не видим

    }

    Переходим к главной функции и реализуем работу часов:

    int main(void)

    {

    _delay_ms(100);

    DDRC = 0x00;

    PORTC = 0xFF;

    lcd_init(); // Инициализация LCD

    I2CInit(); // Инициализация шины I2C

    lcd_string(0x81, "«RTC DS1307"); // Часы на DS1307

    lcd_string(0xC4, " : : ");

    // Запускаем ход часов

    uint8_t temp;

    DS1307Read(0x00,&temp);

    temp &= (1 << 7); // обнуляем 7 бит

    DS1307Write(0x00,temp);

    while(1)

    {

    unsigned char hour, minute, second, temp;

    // Читаем данные и преобразуем из BCD в двоичную систему

    DS1307Read(0x00,&temp); // Чтение регистра секунд

    second = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);

    DS1307Read(0x01,&temp); // Чтение регистра минут

    minute = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);

    DS1307Read(0x02,&temp); // Чтение регистра часов

    hour = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);

    lcd_com(0xC4);

    lcd_num_to_str(hour, 2); // Выводим на экран часы

    lcd_com(0xC7);

    lcd_num_to_str(minute, 2); // Выводим на экран минуты

    lcd_com(0xCA);

    lcd_num_to_str(second, 2); // Выводим на экран секунды

    if((PINC & (1 << PC0)) == 0) // Если нажата кнопка

    {

    while((PINC & (1 << PC0)) == 0){} // Ждем отпускания кнопки

    hour++; // Увеличиваем часы на 1

    if(hour > 23) hour = 0;

    // Преобразуем из двоичной системы в BCD и записываем в DS1307

    uint8_t temp;

    temp = ((hour/10) << 4)|(hour%10);

    DS1307Write(0x02, temp);

    _delay_ms(100);

    }

    if((PINC & (1 << PC1)) == 0) // Если нажата кнопка

    {

    while((PINC & (1 << PC1)) == 0){} // Ждем отпускания кнопки

    minute++; // Увеличиваем минуты на 1

    if(minute > 59) minute = 0;

    // Преобразуем из двоичной системы в BCD и записываем в DS1307

    uint8_t temp;

    temp = ((minute/10) << 4)|(minute%10);

    DS1307Write(0x01, temp);

    _delay_ms(100);

    }

    }

    }

    2.3. Моделирование электронных часов в среде разработки Proteus

    Для моделирования схемы необходимо в программе Proteus использовать настройку компонента микроконтроллера, чтобы “залить” в него программный код. Также необходимо задать тактовую частоту в 8Ггц.

    На рисунке ниже представлена эмуляция часов, но с некоторыми ошибками, такими как некорректное указание даты и ошибка в выводе данных на первую строку.

    Рисунок 2.3 – Эмуляция часов в программе Proteus

    2.4. Разработка печатной платы

    Для реализации проектирования печатной платы воспользуемся программой Altium Designer. Восстановим библиотеки недостающих элементов, которые находятся в открытом доступе.

    Дальше приступим к повторению принципиальной схемы, созданной в программе Proteus Professional.



    Рисунок 2.4 – Принципиальная схема в Altium Designer

    Дальше создадим PCB-файл, но прежде необходимо установить правила трассировки. После установки ширины дорожек, расстояний между элементами, расстояниями от края макетной платы, а также размера переходных отверстий и зазоров можно приступать к установке элементов на плату.

    Результаты трассировки указаны на рисунке 2.5:



    Рисунок 2.5 – Результат трассировки платы в программе Altium Designer

    ГЛАВА 3. ЭКОНОМИЧЕСКАЯ ЭФФЕКТИВНОСТЬ ВНЕДЕРЕНИЯ ПРОЕКТА

    Для расчета экономической целесообразности разработки дипломного проекта и определения экономической эффективности капиталовложений в проект представлено технико-экономическое обоснование разработки, анализ существующих аналогичных разработок и экономический эффект от использования проектируемого устройства.

    1. Расчёт трудоёмкости:

    Трудоемкость характеризуется перечнем основных этапов и видов работ, которые должны быть выполнены в проекте. Расчет трудоемкости представлен в таблице 3.1.

    Таблица 3.1. - Расчет трудоемкости

    Виды работ

    Трудоёмкость,

    днях.

    Разработка технического задания

    1

    Сбор информации и ознакомление с предметной областью

    5

    Выбор объектного построения программы

    1

    Разработка общей методики создания продукта

    3

    Разработка основного алгоритма

    2

    Проектирование устройства

    3

    Выполнение монтажных работ

    1

    Сборка устройства

    1

    Создание программы

    2

    Подключение, тестирование и окончательная конфигурация устройства

    1

    Подготовка технической документации

    2

    По данным таблицы 3 трудоемкость проекта составляет 23 дня.

    1. Расчёт затрат на материалы

    Расчет стоимости основных материалов, затраченных на создание проекта, представлен в таблице 3.2.

    Обозначение

    Тип

    Номинал

    Кол-во

    Цена ед., руб.

    Сумма, руб.

    U1

    Микросхема

    Atmega8

    1

    180

    180

    U2

    Микросхема

    DS1307

    1

    100

    100

    DS

    Дисплей

    LM016

    1

    300

    300

    Y1

    Резонатор

    HC-49S, 32,768 Мгц


    1

    25

    25

    S1

    Кнопка

    KLS7-TS6601

    2

    7

    14

    R1

    Резистор

    MO-200, 4.7кОм

    2

    4

    8

    R2

    Резистор подстроечный

    3296W-1-103LF, 10кОм


    1

    80

    80

    Итого













    707

    На основании данных представленной в таблице 3.2, общая сумма затрат на материалы составляет 707 рублей.

    3) Расчёт затрат на электроэнергию и амортизацию электромонтажного оборудования.

    Расчет затрат на электроэнергию и амортизацию оборудования проводим с учетом цены электроэнергии, цены и срока службы оборудования и трудоёмкости.

    Затраты по электроэнергии определяем по формуле:

    Зэл.эн = Рэл.эн. осв * Тэл.эн. руб.

    где Тэл.эн. - тариф за 1кВт/час, электроэнергии, руб.;

    Рэл.эн. осв - общий расход электроэнергии за период работы, кВт час.

    Тариф на электроэнергию с 1 января 2020 г. равен 5,47 руб. за кВт/час.

    Для пайки МСУЭ, требуется лишь паяльник мощностью до 100 Вт. На монтажные работы одного экземпляра, требуется около 2-х часов.

    Рэл.эн. осв. = 2*100/1000 = 0,2 (кВт час)

    Зэл.эн. = 0,2*5,47=1,1 руб.

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

    Сумму амортизационных отчислений за месяц определяем по формуле:

    Ам = Пс * Намес/100, руб.

    где Пс - первоначальная стоимость оборудования, руб.

    Намес - месячная норма амортизации определяется по формуле:

    Намес = Нагод/12, %

    Стоимость паяльника около 2-х тысяч рублей. Согласно редакции пункта 1 статьи 257 НК РФ, согласно которой основными средствами признаются средства труда первоначальной стоимостью свыше 100 тысяч рублей. Паяльник не относится с основным средствам, следовательно списывается в текущие расходы.

    4) Расчёт расходов на заработную плату.

    На основании данных о средней заработной платы по отрасли рассчитываем основную заработную плату инженера, технолога, проектировщика. Уровень средней зарплаты в данной сфере на 01.05.2020 составляет 54382 рубля.

    Исходя из выше указанной информации, рассчитаем заработную плату сотрудника, исходя из затраченных на работу дней.

    Количество рабочих дней по графику: апрель 2020 – 22 дня, май 2020 – 13 дней.

    Количество отработанных дней: апрель 2020 – 3 дня, май 2020 – 15 дней.

    Заработная плата инженера-технолога-проектировщика за 18 рабочих дней составляет:

    54382 / 22 * 3 + 54382 / 17 * 13 = 49001,97 (рублей).

    На основании полученных расчетов затрат, определяем себестоимость электронных часов на базе микроконтроллера. Статьи затрат приведены в таблице 1.10.

    Таблица 1.10 – Смета всех затрат

    Наименование статей затрат

    Сумма, руб.

    Затрат на материалы

    707

    Затраты на электроэнергию и амортизацию электромонтажного оборудования

    1,1

    Расходов на заработанную плату

    49001,97

    Общая сумма затрат на разработку и сборку электронных часов составляет 49710,07 рублей.

    5)Экономический эффект:

    Экономический эффект представляет собой результат использования труда человека, который может быть направлен на создание определенных материальных благ. В этом случае важно не только обеспечить результат, но и определить, с помощью чего его достигли.

    Экономическая эффективность определяется по формуле разности средней стоимости объекта на рынке и затрат на материалы:

    1500-707= 793 (рубля)
    1   2   3   4


    написать администратору сайта