Курсовой проект по дисциплине «Цифровые устройства и микропроцессоры» на тему: Разработка генератора сигналов на микроконтроллере

Курсовой проект по дисциплине «Цифровые устройства и микропроцессоры» на тему: Разработка генератора сигналов на микроконтроллере



Содержание

 

Содержание. 2

Введение. 3

1. Техническое задание. 5

2. Разработка структурной схемы.. 7

3. Выбор и обоснование элементной базы.. 9

4. Принципиальная схема. 15

5. Управляющая программа. 19

5.1. Описание программы для AD9833. 19

5.2. Описание программы для символьного LCD дисплея. 21

5.3. Описание основной части программы.. 25

6. Моделирование работы генератора. 27

Заключение. 32

Список использованных источников. 33

Приложение 1. 35

Полный текст программы для микроконтроллера. 35

 

 


 

Введение

 

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

На данный момент одним из наиболее совершенных и распространенных типов построения радиоприемников является супергетеродинная схема. Её работа основана на принципе преобразования принятого сигнала в сигнал фиксированной промежуточной частоты (ПЧ) с последующим усилением преобразованного сигнала. Основное преимущество супергетеродина перед радиоприемником прямого усиления состоит в том, что наиболее критичные для качества приема участки приемного тракта (узкополосный фильтр, усилитель ПЧ и демодулятор) не должны перестраиваться по частоте, что позволяет выполнить их с гораздо лучшими характеристиками. Одним из важнейших компонентов супергетеродинного приемника является генератор синусоидального сигнала. Входит в состав основного блока приемника - преобразователя частоты.

Задача состоит в том, чтобы разработать генераторы, дешевые и простые в сборке, но в то же время достаточно точные. Способствовать этому могут готовые электронные блок-модули, получившие в последнее время широкое распространение. На основе этого можно построить широкий спектр устройств, в том числе и генераторы. В данной работе разработан цифровой генератор синусоидальных сигналов на основе готового модуля прямого цифрового синтеза (DDS).

Цель работы: Разработка генератора синусоидальных сигналов на основе модуля прямого цифрового синтеза (DDS).

Задачи работы:

-       Разработать техническое задание;

-       Разработать структурную схему генератора;

-       Выбрать и обосновать элементную базу;

-       Разработать принципиальную схему генератора;

-       Разработать управляющую программу;

-       Провести моделирование разработанного генератора.

Объектами исследования являются генераторы синусоидальных сигналов.

Предмет исследования: генератор прямого цифрового синтеза с микроконтроллерным управлением.

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

В работе используются следующие методы исследования:

-       Метод изучения конструкторской литературы, документации, спецификаций;

-       Метод анализа типовых схемотехнических решений;

-       Метод моделирования электрических схем.


 

1. Техническое задание

 

Разработать генератор сигналов на микроконтроллере. Необходимо составить общую блок-схему и принципиальную схему. Также написать программное обеспечение. Общие требования к генератору, следующие:

-       Схема генератора должна быть построена на базе готовых электронных модулей;

-       Компоненты генератора должны быть легко доступны. Общая стоимость генератора должна быть низкой;

-       Схема генератора должна быть относительно простой в сборке;

-       Должно быть реализовано управление генератором;

-       Генератор должен состоять из следующих блоков:

-       Блок генерации сигнала;

-       Блок настройки;

-       Блок управления

-       Блок питания.

Требования к блоку генерации:

-       Диапазон генерируемых частот: от 1 Гц до 12 МГц;

-       Основным компонентом блока генерации сигнала должен являться модуль прямого цифрового синтеза (DDS).

-       Диапазон амплитуды генерируемого сигнала до 5 В;

-       Форма выходного сигнала – синусоида;

Требования к блоку настройки:

-       Должна быть возможность регулировки частоты генерируемого сигнала и его амплитуды;

-       Настройка частоты выполняется при помощи кнопочного управления;

 

 

 

Требования к блоку управления:

-       Тактовая частота микроконтроллера должна быть 8 МГц;

-       Цифровое управление должно осуществляться с помощью микроконтроллера;

-       Разрядность микроконтроллера должна быть равной восьми;

Требования к блоку питания:

-       Напряжение питания должно равняться 5 В;

-       Источник питания должен быть двухполярным;

-       Питание всего устройства должно осуществляться от сети 220 В.


 

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

 

Генератор состоит из шести блоков:

1)                    Блок настройки частоты;

2)                    Символьный дисплей для отображения текущей частоты и шага настройки;

3)                    Микроконтроллер для управления блоками;

4)                    Модуль прямого цифрового синтеза;

5)                    Блок регулировки амплитуды выходного сигнала;

6)                    Блок питания.

Структурная схема генератора представлена на рис.1.


Структурная схема генератора
Рис.1. Структурная схема генератора

Этот генератор имеет три регулируемых параметра: текущая частота F, шаг перестройки частоты dF и амплитуда выходного сигнала. Значения частоты и шага хранятся в цифровом виде в микроконтроллере. При включении генератор выдает частоту 1 МГц и шаг частоты 1 кГц. Данные значения хранятся в памяти микроконтроллера.

Генерация синусоидального сигнала происходит в модуле DDS. Он способен изменять частоту выходного сигнала по управляющим командам - ​​последовательностям. Эти последовательности вычисляются в микроконтроллере. На символьном LCD-дисплее отображаются текущие значения частоты и шага. Для его корректного отображения, а также для отображения его изменений подаются команды от микроконтроллера.

Блок настройки частоты представляет собой четыре кнопки:

-       Увеличить частоту на шаг настройки;

-       Уменьшить частоту на шаг настройки;

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

Синусоидальный сигнал, генерируемый модулем DDS, имеет фиксированную амплитуду. Для его изменения нужен блок управления амплитудой. Он, через усилитель с регулируемым коэффициентом усиления, может изменять амплитуду выходного сигнала. Этот блок построен на базе операционного усилителя (ОУ) по схеме не инвертирующего усилителя. Регулировка усиления производится поворотом ручки переменного резистора.

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


 

3. Выбор и обоснование элементной базы

 

Основной частью генератора является модуль прямого цифрового синтеза. В данной работе используется готовый модуль DDS на базе микросхемы AD9833. AD9833 – это микросхема с высокой степенью интеграции. При работе от опорного тактового сигнала AD9833 обеспечивает аналоговый выходной синусоидальный сигнал с программируемой частотой и фазой. Этот сигнал может быть преобразован внутри компонента в прямоугольную волну. Микросхема имеет 28-разрядные регистры частоты, что дает разрешение установки выходной частоты 0,1 Гц при опорной тактовой частоте 25 МГц. Аналогичным образом, при тактовой частоте 1 МГц AD9833 может быть настроен на разрешение 0,004 Гц Архитектура AD9833 позволяет выводить сигналы с частотой до половины опорной частоты (до 40 МГц).

Основные характеристики микросхемы AD9833:

-                   Цифровое программирование частоты и фазы;

-                   Потребляемая мощность 12.65 мВт при напряжении 3 В;

-                   Диапазон выходных частот от 0 МГц до 12 МГц;

-                   Разрешение 28 бит (0.1 Гц при частоте опорного сигнала 25 МГц);

-                   Трехпроводной интерфейс SPI;

-                   Синусоидальные, треугольные и прямоугольные выходные колебания;

-                   Напряжение питания от 2.3 В до 5.5 В;

-                   Расширенный температурный диапазон: от –40°C до +105°C;

-                   Функция пониженного энергопотребления;

В данной работе используется готовый модуль на базе микросхемы AD9833. Модуль имеет все необходимые разводки для работы микросхемы, включая кварцевый резонатор опорной тактовой частоты. Внешний вид и название выводов модуля изображено на рис.2 Назначение выводов представлено в таблице 1.

Рис.2. Назначение выводов DDS модуля AD9833

 

Табл. 1.

 Назначение выводов модуля DDS

Вывод модуля

Назначение

VCC

Плюс питания для цифровых и аналоговых цепей генератора

DGND

Земля

SDATA

Вход данных интерфейса SPI. Передача осуществляется 16-битными словами.

SCLK

Вход тактового сигнала SPI. Используется второй режим работы: (CPOL = 1, CPHA = 0).

FSYNC

Frequency Update. По переднему фронту импульса на данном входе AD9833 обновляет частоту (или фазу) в соответствии с полученной 40-битной последовательностью

OUT

Выход генератора

REF

Тактовый выход 25MHz

 

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

                                                                                                              (1)

где  - управляющее число;  – частота, какую хотим установить;  – тактовая частота 25МГц.

 

Для удобства настройки значение текущей частоты выходного сигнала и текущего шага изменения частоты должны отображаться на символьном индикаторе. В качестве такого дисплея используется жидкокристаллический дисплей 16х4 (LCD) (четыре строки по 16 символов) с контроллером HD44780. HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев с 4-битным или 8-битным параллельным интерфейсом (в данной работе для экономии свободных выводов микроконтроллера используется 4-битный интерфейс). Каждое знакоместо на дисплее представляет собой матрицу размером 5x8 точек. Также можно загрузить несколько пользовательских символов в первые 8 ячеек CGRAM. Как правило, знакогенератор содержит символы латинского алфавита и одного из национальных алфавитов. Пример таблицы символов приведен в Приложении 3. Назначение выводов LCD модуля представлено в таблице3. Управляющие последовательности представлены в спецификации [10] и подробно рассмотрены в литературе [8].

Управление модулем DDS AD9833 и ЖК-дисплеем, а также установка нужной частоты осуществляется с помощью микроконтроллера. Подобный метод управления подробно представлен в научной литературе [1,5,7,8,9].

Согласно техническому заданию в данной работе должен использоваться восьмиразрядный микроконтроллер с тактовой частотой от 8 до 16 МГц, с памятью программ не менее 16 кБайт и с напряжением питания. Микроконтроллер ATmega328P идеально соответствует этим требованиям.

 

Табл. 2.

 Назначение выводов символьного LCD модуля

Название вывода

Функциональное назначение

VCC

Напряжение питания

К

Катод светодиода

А

Анод светодиода

RS

Выбор записи команды/данные

V0

Напряжение управления контрастностью

GND

Земля

DB0

Младший бит для 8-битного интерфейса

Шина данных

DB1

 

DB2

DB3

DB4

Младший бит для 4-битного интерфейса

DB5

 

DB6

DB7

Старший бит для 8 и 4-битного интерфейса

R/W

Выбор направления передачи данных запись/чтение

E

Вход тактовых импульсов (по спаду)

 

ATmega328P – это 8-ми разрядный CMOS микроконтроллер семейства AVR. Он обладает следующими характеристиками:

-       32 кбайт Flash (память программ);

-       2 кбайт ОЗУ;

-       1 кбайт EEPROM (постоянная память данных);

-       Два 8-битных таймера/счетчика с модулями сравнения и делителями частоты;

-       16-битный таймер/счетчик с модулем сравнения и делителем частоты, а также с режимом записи;

-       6-канальный ЦАП;

-       Программируемый последовательный порт USART;

-       Последовательный интерфейс SPI;

-       Интерфейс I2C;

-       Программируемый сторожевой таймер с отдельным внутренним генератором;

-       Внутренняя схема сравнения напряжений;

-       Блок обработки прерываний и пробуждения при изменении напряжений на выводах микроконтроллера;

-       Напряжения питания и скорость процессора:

-       1.8 — 5.5 В при частоте до 4 МГц

-       2.7 — 5.5 В при частоте до 10 МГц

-       4.5 — 5.5 В при частоте до 20 МГц

Рис.3. Назначение выводов ATmega328P.

Назначение выводов ATmega328P показано на рисунке 3. Выбор именно этого микроконтроллера обусловлен большим объемом Flash-памяти, а также доступностью и распространенностью данной модели (в том числе в популярной платформе Arduino). В данной работе используется тактовая частота 8 МГц.

4. Принципиальная схема

 

Выходы микроконтроллера распределены следующим образом: порт C, за исключением выхода PC6, предназначен для управления дисплеем; весь порты PB0-PB1 предназначены для параллельной передачи команд на AD9833; порт PD0-PD1 также предназначены для AD9833, а выводы PD2-PD5 предназначены для приема управляющего сигнала от кнопок. Назначение контактов ATmega328P показано на рисунке 4. Контакты PC0-PC5, PB0-PB1 и PD0-PD1 настроены как выходы, контакты PD2-PD5 настроены как входы.

Рис.4. Распределение выводов микроконтроллера

Блок перестройки частоты состоит из четырех кнопок, подключенных к выводам PD2-PD5 микроконтроллера. Схема подключения представлена ​​на рис. 5

Кнопка срабатывает при подаче на вход микроконтроллера сигнала низкого уровня (логического нуля). Диоды используются для разделения кнопок питания. Последовательность выводов и назначения кнопок, следующая: PD2 - добавление шага к текущей частоте, PD3 - вычитание шага из текущей частоты, PD4 - увеличение шага в 10 раз, PD5 - уменьшение шага в 10 раз.

Рис.5. Схема подключения управляющих кнопок

        Модуль DDS AD9833 выдает аналоговый синусоидальный сигнал, сдвинутый вверх на 0,65 В и с фиксированной амплитудой 1 В. Из него необходимо вычесть постоянную составляющую, а полученный сигнал усилить, а коэффициент усиления должен регулироваться. За это отвечает блок управления выходом. Его схема показана на рис.6.

Рис.6. Блок регулировки выходного сигнала

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

            (2)

Ко всем блокам генератора необходимо подавать питание. По техническому заданию оно должно быть 5 В. Также для работы ОУ требуется двухполярное питание. Блок питания отвечает за преобразование сетевого напряжения в постоянное требуемой величины. Его схема представлена на рис.7.

Описание: H:\Курсовая работа 2021\Блок питания.png

Рис.7. Схема блока питания

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

5. Управляющая программа

 

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

 

5.1. Описание программы для AD9833

 

Функция RaschetFreq используется для вычисления контрольного числа. Функция получает значение искомой частоты и возвращает соответствующее контрольное число, рассчитанное по формуле (1):

 

//вычисляем Freg

unsigned long int RaschetFreg(unsigned long int F_default1)

{

    return (F_default1*4294967296)/25000000;

}

 

За отправку управляющей последовательности непосредственно на AD9833 отвечает функция Send_Comands:

 

//отправка команды из 5-и слов к AD9833

void Send_Comands(unsigned long int Freg1)

{

    PORTB=0x00;

    SCLK();

    PORTB=((Freg1&0xff000000)>>24);

    SCLK();

    PORTB=((Freg1&0x00ff0000)>>16);

    SCLK();

    PORTB=((Freg1&0x0000ff00)>>8);

    SCLK();

    PORTB= (Freg1&0x000000ff);

    SCLK();

    FSYNC();

}

 

Первое 8-битное слово состоит из нулей (управление битами = 00 (параллельный режим установлен), Power-Down = 0 (энергосбережение выключено), Phase-b0…b4 = 00000 (фазовый сдвиг равен нулю)). Затем 32-битное контрольное число, переданное функции, отправляется четырьмя словами. Кроме того, сначала отправляются старшие биты, а затем младшие биты. С помощью побитовых операций «И» и «Сдвиг вправо» сначала выделяются требуемые 8 бит из 32, после чего сдвигаются вправо до упора. После передачи последнего слова на вход SCLK подается последний импульс. В программе есть 2 глобальные переменные: текущая частота F_default и текущий шаг частоты dF_default. За изменение этих параметров отвечают функции сложения (PlysF), вычитания (MinysF), умножения на 10 (YmnozhenieF). Кроме того, эти функции возвращают новое измененное значение переменных.

 

//прибавляем dF_default к F_default, считаем Freg и отправляем команду на AD9833

unsigned long int PlysF(unsigned long int dF_default2, unsigned long int F_default2)

{

    F_default2=F_default2+dF_default2;

    if(F_default2>12000000)F_default2=12000000;//проверяем, чтоб частота не ушла больше максимма 12 МГц

 

    Send_Comands(RaschetFreg(F_default2));//считаем Freg и отправляем его на AD9833

    return F_default2;

}

 

//вычитаем dF_default из F_default, считаем Freg и отправляем команду на AD9833

unsigned long int MinysF(unsigned long int dF_default3, unsigned long int F_default3)

{

    F_default3=F_default3-dF_default3;

    if(F_default3<1)F_default3=1;//проверяем, чтоб частота не ушла ниже минимума 1 МГц

 

    Send_Comands(RaschetFreg(F_default3));//считаем Freg и отправляем его на AD9833

    return F_default3;

}

 

//умножаем dF_default на 10

unsigned long int YmnozhenieF(unsigned long int dF_default4)

{

    dF_default4=dF_default4*10;

    if(dF_default4>10000000)dF_default4=10000000;//проверка, чтобы не больше максимума 10000000

 

    return dF_default4;

}

 

//делим dF_default на 10

unsigned long int DelenieF(unsigned long int dF_default5)

{

    dF_default5=dF_default5/10;

    if(dF_default5<1)dF_default5=1;//проверка, чтоб не меньше минимума 1

 

    return dF_default5;

}

 

5.2. Описание программы для символьного LCD дисплея

 

Команда от микроконтроллера на дисплей отправляется с помощью функции sendCommand_LCD. Он получает два значения: 8-битную команду (или код символа) и обозначение режима (если 0, то передается сама команда (например, переместить курсор), если 1, то передается код символа).

 

 

//отправляем команды или данные на дисплей

void sendcommand_LCD(unsigned char a, unsigned char tip )

{

    if (tip==0) PORTC&=0b111110;

    else PORTC|=0b000001;

 

    PORTC&=0b000011;

    PORTC|=((a&0b11110000)>>2);

    Impulse_LCD();

    _delay_us(50);

 

    PORTC&=0b000011;

    PORTC|=((a&0b00001111)<<2);

    Impulse_LCD();

    _delay_us(50);

}

 
 

Перед началом работы дисплей необходимо инициализировать особым образом. Алгоритм инициализации подробно описан в даташите. В программе за инициализацию отвечает функция Initialize_LCD:

 

//инициализация LCD

void Initialize_LCD(void)

{

    _delay_us(20);

    PORTC=0b001100;

    Impulse_LCD();

    _delay_us(5);

    PORTC=0b001100;

    Impulse_LCD();

    _delay_us(110);

    PORTC=0b001100;

    Impulse_LCD();

     _delay_us(50);

 

    PORTC=0b001000;

    Impulse_LCD();

    _delay_us(50);

 

    sendcommand_LCD(0b00101000, 0);

    sendcommand_LCD(0b00001100, 0);

    sendcommand_LCD(0b00000001, 0);

    sendcommand_LCD(0b00000110, 0);

}

 

Во время работы программы часто необходимо поместить курсор в определенное место на дисплее. Поэтому за это отвечает отдельная функция InstallCursor. Он имеет два входных параметра: положение по горизонтали (x, от нуля до 16) и положение по вертикали (y, первая строка равна 0, вторая строка равна 1).

Рис.8. Номера ячеек дисплея

 

Ячейки дисплея пронумерованы особым образом, как показано на рис. 8. Благодаря математическим операциям в функции значения x и y преобразуются в номер нужной ячейки. Так как для отображения текущей частоты и шага необходимо отправлять по одному символу, то необходимо разбить их числовые значения на отдельные цифры и отдельно отправить на дисплей. Вот что делает функция SortNumber:

 

//Эта функция разбивает число на цифры

void SortNumber(unsigned long int aa,unsigned char stroka)

{

    double Unsigned(double b);

    long int b=0;

    char n=0;

    InstallCursor(3,stroka);

 

    while(n!=8)

    {

        aa=aa-b*pow(10,8-n);

        b=aa/pow(10,7-n);

        if(b==0)//если получился ноль - выводим пробел

        {

            sendcommand_LCD(0b00100000,1);

            n++;

        }

        else

        {

            sendcommand_LCD(b+0b110000,1);

            n++;

            break;

        }

    }

}

 

Кроме того, эта функция переключает курсор на нужную строку (поскольку первая строка показывает текущую частоту, а вторая — текущий шаг). Функция SortNumber имеет 2 аргумента: число, которое нужно разбить на цифры, и номер строки, в которой это число отображается. Основной цикл отвечает за разбиение числа на цифры:

 

while(n!=8)

    {

        aa=aa-b*pow(10,8-n);

        b=aa/pow(10,7-n);

        if(b==0)//если получился ноль - выводим пробел

        {

            sendcommand_LCD(0b00100000,1);

            n++;

        }

 

Здесь aa — это число, которое необходимо разделить. При каждой итерации из него вычитается последняя отправленная цифра b (соответственно умножается на 108-n, n — номер итерации). Далее переменной b присваивается новое значение, равное отношению переменной аа к 107-n. Это число округляется (поскольку здесь используется целочисленный тип данных). После этого к b добавляется двоичное число 110000. Это необходимо потому, что коды цифр в таблице символов дисплея равны двоичной форме записи этих самых цифр с добавленным двоичным числом 110000. Далее полученный код цифры отправляется в функцию sendcommand_LCD, а переменная n увеличивается на 1.

Этот цикл рассчитан строго на числа до восьми знаков включительно (поскольку максимальная частота и значения шага — восьмизначные числа). Дополнительный цикл функции SortNumber по своему принципу аналогичен основному циклу. Он только добавил условие, которое меняет нули на пробелы, чтобы перед отображаемым числом не было нулей (потому что число делится от восьмой цифры до последней).

 

5.3. Описание основной части программы

 

Основная функция main содержит основные настройки порта, функцию инициализации дисплея, функции, выводящие на дисплей неизменный текст и бесконечный цикл:

 

while(1)

    {

             if((PIND&0b00111100)==0b00111000)

        {

            F_default=PlysF(dF_default, F_default);

            SortNumber(F_default, 0);

        }

        else if((PIND&0b00111100)==0b00110100)

        {

            F_default=MinysF(dF_default, F_default);

            SortNumber(F_default, 0);

        }

        else if((PIND&0b00111100)==0b00101100)

        {

            dF_default=YmnozhenieF(dF_default);

            SortNumber(dF_default, 1);

        }

        else if((PIND&0b00111100)==0b00011100)

        {

            dF_default=DelenieF(dF_default);

            SortNumber(dF_default, 1);

        }

    }

 

 

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

 

 


 

6. Моделирование работы генератора

 

Генератор был смоделирован с помощью системы автоматизированного проектирования (САПР) Proteus 8 [11]. Proteus — это пакет программ для автоматизированного проектирования электронных схем. Это система моделирования, основанная на моделях электронных компонентов PSpice. Отличительной особенностью, данной САПР является возможность моделирования работы программируемых устройств: микроконтроллеров, микропроцессоров и др.

На рис. 9 показаны блок настройки частоты, микроконтроллер и дисплей. После запуска моделирования на экране отображается начальная частота и шаг (рис. 10). После нажатия кнопок частота и высота тона соответственно изменяются.

Рис.9. Моделирование блока настройки, микроконтроллера и дисплея

Рис.10. Изображение на дисплее до (а) и после (б) нажатий

        На рис.11. показан процесс получения осциллограмм сигналов в различных точках блока контроля амплитуды. Рассмотрим подробнее происходящие процессы. Сигнал с модуля DDS поступает на один из входов дифференциального усилителя (схема этого сигнала показана на рис. 12). На второй вход поступает постоянный сигнал 0,65 В. На выходе первого ОУ мы видим дифференциальный сигнал с вычтенной постоянной составляющей (рис. 13). Затем сигнал усиливается неинвертирующим усилителем. Полученный усиленный сигнал показан на рис. 14.

Рис.11. Процесс снятия осциллограмм сигналов

 

Рис.12. Сигнал с модуля DDS на входе дифференциального усилителя

 

Рис.13. Дифференциальный сигнал с вычтенной постоянной составляющей на выходе ОУ

 

Рис.14. Полученный усиленный сигнал

 

Амплитуда выходного сигнала регулируется изменением сопротивления переменного резистора RV2. Его импеданс составляет 40 кОм. Графики выходного сигнала при различном сопротивлении RV2 показаны на рис.15, рис.16 и рис.17.

Рис.15. График выходного сигнала при 100% сопротивления переменного резистора

Рис.16. График выходного сигнала при 50% сопротивления переменного резистора

 

Рис.17. График выходного сигнала при 25% сопротивления переменного резистора

 

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


 

Заключение

 

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

В ходе данной работы была проведена разработка технического задания. По его условиям были проведены конструкторская проработка и техническая документация, проанализированы существующие схемные решения. На основе полученных знаний была проведена разработка общей схемы генератора, подобраны и обоснованы комплектующие, составлена ​​принципиальная схема устройства. Программа управления была написана в соответствии со спецификациями используемых цифровых элементов. Также было выполнено компьютерное моделирование узлов и программного обеспечения этого генератора с помощью системы автоматизированного проектирования Proteus 8.

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

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


 

Список использованных источников

 

1)    Андреев С. В. Обучение программированию на микроконтроллерах / С. В. Андреев // XX Всероссийская студенческая научно-практическая конференция Нижневартовского государственного университета. — 2018. — С. 16-18.

2)    Генератор сигналов на Arduino и DDS модуле AD9833 // microkontroller.ru - Устройство и программирование микроконтроллеров AVR для начинающих. – URL: https://microkontroller.ru/arduino-projects/generator-signalov-na-arduino-i-dds-module-ad9833/ (дата обращения: 30.11.2022).

3)    Генератор сигналов на AD9833 // tsibrov.blogspot.com - Про Ардуино и не только. – URL: https://tsibrov.blogspot.com/2018/06/ad9833.html (дата обращения: 1.12.2022).

4)    Характеристики микроконтроллера ATmega328P // avrprog.blogspot.com - Микроконтроллеры AVR. – URL: https://avrprog.blogspot.com/2013/03/atmega328p.html (дата обращения: 2.12.2022).

5)    Гордеев А. М. Генератор синусоидальных сигналов на базе микроконтроллера STM32 / А. М. Гордеев, А. Б. Климовский // Актуальные проблемы физической и функциональной электроники: Материалы 21-й Всероссийской молодежной научной школы-семинара. — 2018. — С. 145.

6)    Характеристики микроконтроллера ATmega328P // avrprog.blogspot.com - Микроконтроллеры AVR. – URL: https://avrprog.blogspot.com/2013/03/atmega328p.html (дата обращения: 2.12.2022).

7)    Коваценко И. Н. Способы взаимодействия с микроконтроллером на базе Arduino / И. Н. Коваценко // Проблемы управления в социально-экономических и технических системах: Материалы XVI Международной научно-практической конференции. — 2020. — С. 80-82.

8)    Кремнев Н. А. Программно-аппаратный генератор синусоидального сигнала на основе контроллера "Ардуино" / Н. А. Кремнев, М. В. Лазарев // Студенческая наука Подмосковью. — 2016. — С. 349-351.

9)    Кутлиев А. Ш. Использование микроконтроллеров для создания лабораторного оборудования / А. Ш. Кутлиев, И. А. Петрова // Материалы докладов 50-й международной научно-технической конференции преподавателей и студентов, посвященной году науки. — 2017. — С. 29-31.

10)         HD44780 Datasheet//ALLDATASHEET.COM - Datasheet search site for Electronic Components and Semiconductors and other semiconductors. – URL: https://www.alldatasheet.com/datasheet-pdf/pdf/63673/HITACHI/HD44780.html (дата обращения: 20.12.2022).

11)         Филатов М. Проектирование схем электрических принципиальных с использованием LCD-дисплеев и светодиодных матриц в программной среде Proteus 8.1. Часть 2 / М. Филатов // Компоненты и технологии. — 2017. — № 5 (190). — С. 153-160.

 


 

Приложение

Полный текст программы для микроконтроллера

// Подгружаем необходимые библиотеки

#include <avr/io.h>

#include <util/delay.h>

 

volatile unsigned long int F_default=1000000; // начальная стартовая частота

volatile unsigned long int dF_default=1000; // начальный стартовый шаг перестройки частоты

 

//импульс для LCD

void Impulse_LCD(void)

{

    PORTC|=0b000010;

    PORTC&=0b111101;

}

 

//отправляем команды или данные на дисплей

void sendcommand_LCD(unsigned char a, unsigned char tip )

{

    //проверяем, команда (RS=0) или данные (RS=1)

    if (tip==0) PORTC&=0b111110;

    else PORTC|=0b000001;

 

    //очищаем 6-3 выводы и отправляем первые полбайта(7-4 биты)

    PORTC&=0b000011;

    PORTC|=((a&0b11110000)>>2);

    Impulse_LCD();

    _delay_us(50);

 

    //очищаем 6-3 выводы и отправляем вторые полбайта(3-0 биты)

    PORTC&=0b000011;

    PORTC|=((a&0b00001111)<<2);

    Impulse_LCD();

    _delay_us(50);

}

 

//инициализация LCD

void Initialize_LCD(void)

{

    _delay_us(20);

    PORTC=0b001100;

    Impulse_LCD();

    _delay_us(5);

    PORTC=0b001100;

    Impulse_LCD();

    _delay_us(110);

    PORTC=0b001100;

    Impulse_LCD();

     _delay_us(50);

 

    PORTC=0b001000;

    Impulse_LCD();

    _delay_us(50);

 

    sendcommand_LCD(0b00101000, 0);

    sendcommand_LCD(0b00001100, 0);

    sendcommand_LCD(0b00000001, 0);

    sendcommand_LCD(0b00000110, 0);

}

 

//установка курсора в нужное положение

void InstallCursor(unsigned char x, unsigned char y)

{

  sendcommand_LCD((0x40*y+x)|0b10000000, 0);

}

 

//Эта функция разбивает число на цифры

void SortNumber(unsigned long int aa,unsigned char stroka)

{

    double Unsigned(double b);

    long int b=0;

    char n=0;

    InstallCursor(3,stroka);

 

    while(n!=8)

    {

        aa=aa-b*pow(10,8-n);

        b=aa/pow(10,7-n);

        if(b==0)//если получился ноль - выводим пробел

        {

            sendcommand_LCD(0b00100000,1);

            n++;

        }

        else

        {

            sendcommand_LCD(b+0b110000,1);

            n++;

            break;

        }

    }

 

 

    //Основной цикл. Выводит числа на экран.

    while(n!=8)

    {

        aa=aa-b*pow(10,8-n);

        b=aa/pow(10,7-n);

        sendcommand_LCD(b+0b110000,1);

        n++;

    }

}

 

//импульс (по возрастанию) на вход SCLK после каждого слова

void SCLK(void)

{

    PORTD|=0b00000001;

    _delay_us(50);

    PORTD&=0b11111110;

}

 

//импульс (по возрастанию) на вход FSYNC после передачи всех 5-и слов

void FSYNC(void)

{

    PORTD|=0b00000010;

    _delay_us(50);

    PORTD&=0b11111101;

}

 

//вычисляем Freg

unsigned long int RaschetFreg(unsigned long int F_default1)

{

    return (F_default1*4294967296)/125000000;

}

 

//отправка команды из 5-и слов к AD9833

void AD_Comanda(unsigned long int Freg1)

{

    PORTB=0x00;

    SCLK();

    PORTB=((Freg1&0xff000000)>>24);

    SCLK();

    PORTB=((Freg1&0x00ff0000)>>16);

    SCLK();

    PORTB=((Freg1&0x0000ff00)>>8);

    SCLK();

    PORTB= (Freg1&0x000000ff);

    SCLK();

    FSYNC();

}

 

//прибавляем dF_default к F_default, считаем Freg и отправляем команду на AD9833

unsigned long int Plys(unsigned long int dF_default2, unsigned long int F_default2)

{

    F_default2=F_default2+dF_default2;

    if(F_default2>12000000)F_default2=12000000;//проверяем, чтоб частота не ушла больше максимма 12 МГц

 

    AD_Comanda(RaschetFreg(F_default2));//считаем Freg и отправляем его на AD9833

    return F_default2;

}

 

//вычитаем dF_default из F_default, считаем Freg и отправляем команду на AD9833

unsigned long int Minys(unsigned long int dF_default3, unsigned long int F_default3)

{

    F_default3=F_default3-dF_default3;

    if(F_default3<1)F_default3=1;//проверяем, чтоб частота не ушла ниже минимума 1 МГц

 

    AD_Comanda(RaschetFreg(F_default3));//считаем Freg и отправляем его на AD9833

    return F_default3;

}

 

//умножаем dF_default на 10

unsigned long int Ymnozhenie(unsigned long int dF_default4)

{

    dF_default4=dF_default4*10;

    if(dF_default4>10000000)dF_default4=10000000;//проверка, чтобы не больше максимума 10000000

 

    return dF_default4;

}

 

 

//делим dF_default на 10

unsigned long int Delenie(unsigned long int dF_default5)

{

    dF_default5=dF_default5/10;

    if(dF_default5<1)dF_default5=1;//проверка, чтоб не меньше минимума 1

 

    return dF_default5;

}

 

 

//ФУНКЦИЯ main

 

int main(void)

{

    DDRB=0xff;

    PORTB=0x00;

    DDRD=0b11000011;

    PORTD=0x00;

    DDRC=0b111111;

    PORTC=0x00;

 

    AD_Comanda(RaschetFreg(F_default));//инициализация AD9833

    Initialize_LCD();

    InstallCursor(1,2);

    sendcommand_LCD('F',1);

    InstallCursor(14,2);

    sendcommand_LCD('H',1);

    sendcommand_LCD('z',1);

    InstallCursor(0,3);

    sendcommand_LCD('d',1);

    sendcommand_LCD('F',1);

    InstallCursor(14,3);

    sendcommand_LCD('H',1);

    sendcommand_LCD('z',1);

    SortNumber(F_default, 0);

    SortNumber(dF_default, 1);

 

    while(1)

    {

             if((PIND&0b00111100)==0b00111000)//нажмали «Увеличить частоту»

        {

            F_default=Plys(dF_default, F_default);

            SortNumber(F_default, 0);//отправляем изменённое текущее значение частоты на экран

        }

        else if((PIND&0b00111100)==0b00110100)//нажмали «Уменьшить частоту

        {

            F_default=Minys(dF_default, F_default);

            SortNumber(F_default, 0);

        }

        else if((PIND&0b00111100)==0b00101100)//нажмали «Увеличить шаг»

        {

            dF_default=Ymnozhenie(dF_default);

            SortNumber(dF_default, 1);//отправляем изменённое текущее значение dF_default на экран

        }

        else if((PIND&0b00111100)==0b00011100)

        {

            dF_default=Delenie(dF_default);//нажмали «Уменьшить шаг»

            SortNumber(dF_default, 1);

        }

    }

    return 0;

}








Курсовая работа на тему: "Привилегированные виды убийств"

Курсовая работа на тему: "Привилегированные виды убийств" ВАЖНО!!!  Данная курсовая работа носит информационный характер! Если те...