Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Проектирование цифрового спектроанализатора аналогового сигнала на микроконтроллере ATmega 8
3.2.1. Описание микросхем системы Данная система состоит из двух основных элементов таких, как микроконтроллер(МК) и устройства вывода в виде жидкокристаллического индикатора(ЖКИ). В качестве МК был выбран Atmega8 т.к. этот микроконтроллер надежен, прост в использовании, имеет встроенный аналогово-цифровой преобразователь(АЦП), и небольшую стоимость по сравнению с другими аналогами. Микроконтроллер ATmega8, ATmega8L 8-разрядные микроконтроллеры с 8 Кбайт внутрисистемно программируемой Flash памяти. Отличительные особенности: 8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением Прогрессивная RISC архитектура 130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл 32 8-разрядных рабочих регистра общего назначения Полностью статическая работа Приближающаяся к 16 MIPS (при тактовой частоте 16 МГц) производительность Встроенный 2-цикловый перемножитель Энергонезависимая память программ и данных 8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash) Обеспечивает 1000 циклов стирания/записи Дополнительный сектор загрузочных кодов с независимыми битами блокировки Обеспечен режим одновременного чтения/записи (Read-While-Write) 512 байт EEPROM Обеспечивает 100000 циклов стирания/записи 1 Кбайт встроенной SRAM Программируемая блокировка, обеспечивающая защиту программных средств пользователя Встроенная периферия Два 8-разрядных таймера/счетчика с отдельным предварительным делителем, один с режимом сравнения Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения Счетчик реального времени с отдельным генератором Три канала PWM 8-канальный аналого-цифровой преобразователь (в корпусах TQFP и MLF) 6 каналов с 10-разрядной точностью 2 канала с 8-разрядной точностью 6-канальный аналого-цифровой преобразователь (в корпусе PDIP) 4 канала с 10-разрядной точностью 2 канала с 8-разрядной точностью Байт-ориентированный 2-проводный последовательный интерфейс Программируемый последовательный USART Последовательный интерфейс SPI (ведущий/ведомый) Программируемый сторожевой таймер с отдельным встроенным генератором Встроенный аналоговый компаратор Специальные микроконтроллерные функции Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания Встроенный калиброванный RC-генератор Внутренние и внешние источники прерываний Пять режимов пониженного потребления: Idle, Power-save, Power-down, Standby и снижения шумов ADC Выводы I/O и корпуса 23 программируемые линии ввода/вывода 28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF Рабочие напряжения 2, 7 - 5, 5 В (ATmega8L), 4, 5 - 5, 5 В (ATmega8) Рабочая частота 0 - 8 МГц (ATmega8L) 0 - 16 МГц (ATmega8)
Рис. 3.4 Расположение выводов
Символьный жидкокристаллический индикатор (ЖКИ) 16х2 рус/англ WH1602 Данный жидкокристаллический индикатор для отображения буквенно-цифровой информации рус/англ с разрешением 16 символов x 2 строки фирмы Winstar пользуется большой популярностью у приОн Он применяется в различных устройствах и показал себя как исключительно надежный и может быть рекомендован к применению. Технические характеристики Параметр Значение Тип дисплея Символьный Напряжение питания постоянное, В +3...5 Символов в строке, шт 16 Строк, шт 2 Набор символов русский/латинский Температура эксплуатации, °С -20...+70 Относительная влажность эксплуатации, % ...35 Габаритные размеры, ДхШхВ, мм 84 x 44 мм
KIA7805 - стабилизатор положительной полярности +5V с максимальным выходным током 1А в изолированном корпусе TO-220FP производства KEC Ltd. 3.2.2. Разработка структурной схемы Структурная схема системы представлена на рисунке 3.5. В соответствии с рисунком микропроцессорная система состоит из первичного преобразователя, микроконтроллера и жидкокристаллического индикатора. Сигнал поступает на первичный преобразователь, который задает рабочую точку для работы АЦП микроконтроллера. Затем сигнал с первичного преобразователя поступает на вход АЦП микроконтроллера, микроконтроллер обрабатывает сигнал и выводит данные на ЖКИ. Рис. 3.5 Структурная схема системы Микропроцессорная система состоит из следующих блоков: - микроконтроллер (МК); - первичного преобразователя (ПП); - жидкокристаллического индикатора (ЖКИ); 3.2.3. Проектирования принципиальной схемы системы Принципиальная схема системы представлена на рисунке 3.6. Центральным блоком системы является микроконтроллер DD1 AТmega8. К выводам XTAL1 (РВ6) и XTAL2 (РВ7) микроконтроллера DD1 подключается кварцевый резонатор ZQ1 на 12 МГц. Для более стабильного запуска выводы кварцевого резонатора соединены с общим проводом через конденсаторы С1 и С2 емкостью 22 пФ. Питание на схему подается через стабилизатор напряжения DD2 KIA7805, на уровне 5в.
Рис. 3.6 Принципиальная схема системы
Линии порта Р D и PC используются для ввода/вывода информации на ЖКИ Wh1602. Опрос аналогового входа осуществляется с помощью аналого-цифрового преобразователя встроенного в МК вход ADC0 (PC0). К этому входу подключены разделительный конденсатор С1 и делитель напряжения R1, R2 задающий рабочую точку. Опрос аналогового входа производится циклом с числом опросов кратным степени 2.
3.2.4. Проектирования блок-схемы алгоритма и листинг программы Программа хранится в ПЗУ микроконтроллера. Алгоритм подпрограммы опроса представлен на рисунке 3.7. Число выборок для данной программы задано 64. Частота дискретизации составляет 20 кГц. По Теореме Котельникова-Шеннона, частота обрабатываемого сигнала не должна быть больше половины частоты дискретизации. Это значит, что частотный диапазон входного сигнала должен лежать в диапазоне от 0 до 10 кГц. Для анализа спектра сигнала применяется алгоритм быстрого преобразования Фурье (БПФ). В начале основной программы осуществляется инициализация компонентов: переменных, портов ввода/вывода, дисплея, АЦП микроконтроллера. Далее происходит запуск основного тела программы. На каждом цикле программы происходит обнуление переменной i, которая обозначает номер текущей выборки. Затем АЦП считывает i-ую выборку и увеличивает число i на 1. Так происходит, пока не наберется 64 выборки. Все эти выборки заносятся в массив. Затем этот массив передается в подпрограмму, реализующую преобразование Фурье. Далее запускается подпрограмма, выводящая полученные значения на жидкокристаллический индикатор. Затем производится новая выборка. Тело программы предполагает нахождение в бесконечном цикле. Остановка производится только по отключению питания.
Рис. 3.7 Блок-схема алгоритма работы основной подпрограммы Листинг программы #include < avr/io.h> #include < avr/iom8.h> #include < util/delay.h> #include < avr/interrupt.h> #include < inttypes.h> #include < avr/signal.h> #include < stdio.h> #include < string.h> #include < avr/eeprom.h> #include < math.h> #define M_2PI M_PI+M_PI //Структура описывающая комплексное число struct Complex { float Re; float Im; }; //Эффективный уровень сигнала //amp - масив эффективных уровней сигнала //n - количество элементов массива float elevel(float *amp, float n) { unsigned int i = 0; float res = 0.0; for (i = 0; i < (unsigned int)n; i++) { if (amp[i] > = 0.0) { res = res + amp[i]/n; } else { res = res - amp[i]/n; }; }; return res; } //Амплитуда комплексого числа //m - общее число выборок float AmpZ(struct Complex z, float m) { return 2.0*pow(z.Re*z.Re + z.Im*z.Im, 0.5)/m; } float Amp(struct Complex z, float m) { return z.Re*z.Re + z.Im*z.Im; } //Быстрое преодразование Фуре //d - тип преобразования: -1 - прямое, 1 - обратное //m - m = 2^n - число выборок //n - n = log_2(m) //m 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 //n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //ios[] - входной/выходной сигнал в комплексном виде void fft (char d, unsigned int m, unsigned int n, struct Complex *ios) { int l, e, f, i, j, i1, j1, o, k; float u, v, z, c, s, p, q, r, t, w; unsigned int e1 = 1; for (l = 1; l < = n; l++) { //e = (int)pow(2, n+1-l); e = 1; //Находим стеень двойки for (e1 = 0; e1 < n+1-l; e1++) { e = e < < 1; }; f = e > > 1; u = 1.0; v = 0.0; z = M_PI/(float)f; c = cos(z); s = (float)d*sin(z); for (j = 1; j < = f; j++) { for (i = j; i < = m; i += e) { o = i + f - 1; p = ios[i-1].Re + ios[o].Re; q = ios[i-1].Im + ios[o].Im; r = ios[i-1].Re - ios[o].Re; t = ios[i-1].Im - ios[o].Im; ios[o].Re = r*u - t*v; ios[o].Im = t*u + r*v; ios[i-1].Re = p; ios[i-1].Im = q; }; w = u*c - v*s; v = v*c + u*s; u = w; }; }; j = 1; for (i = 1; i < = m-1; i++) { if (i < j) { j1 = j - 1; i1 = i - 1; p = ios[j1].Re; q = ios[j1].Im; ios[j1].Re = ios[i1].Re; ios[j1].Im = ios[i1].Im; ios[i1].Re = p; ios[i1].Im = q; }; k = m > > 1;
while (k < j) { j = j - k; k = k > > 1; }; j = j + k; }; }; int out(float max) { int j=max/1, i; if(j< 5) return 32; if(j> 80) return 8; for( i=0; j > 0; i++) { j-=10; } return i; } #define M 64 //Количество выборок int m=M, m2=M/2, n=6, ll, uuuu[M], max; float level; void main (void) { struct Complex x[M]; Init_ports(); // Инициализация портов Init_LCD(); //Инициализация дисплея DDRB=0xF; DDRD=0xFF; // Инициализация АЦП ADCSRA =(1< < ADEN)|(1< < ADFR); ADMUX=0; ADCSRA |= (1 < < ADSC); while(1) { for (ll=0; ll< m; ll++) { while ((ADCSRA& (1 < < ADIF))== 0); //Ожидание флага конца преобразования uuuu[ll]=(ADCL|(ADCH< < 8)); // считывание значения в массив из регистров ADC _delay_us(550); // Задержка для организации частоты дискретизации 20 кГЦ } for (ll=0; ll< m; ll++) { x[ll].Re = uuuu[ll]-480; x[ll].Im = 0; } fft ( 1, m, n, & x[0]); //Вызов быстрого преобразования for (ll=0; ll< m2; ll++) { x[ll].Re = AmpZ(x[ll], m); // Получение действующего значения амплитуды } // Вывод на дисплей Clear_display(); Char_To_LCD (out(x[0].Re)); Char_To_LCD (out(x[1].Re)); Char_To_LCD (out(x[2].Re)); for(int i=3; i< 31; i+=2) { if(x[i].Re> x[i+1].Re) Char_To_LCD (out(x[i].Re)); else Char_To_LCD (out(x[i+1].Re)); } } } void Clear_ports(void) // Функция очистки портов дисплея { PORTD=0b00000000; PORTB=0b0000000; } void Init_ports(void) // Инициализация портов для работы с дисплеем { DDRD=0b11111111; //Порт данных DDRB=0b0001110; // Порт управления Clear_ports(); } void Clear_display(void) { PORTD=0b0000001; PORTB=0b0000000; Impuls(); _delay_ms(20); } void Impuls(void) // Функция строба дисплея { PORTB |= _BV(PB1); _delay_ms(10); PORTB & = ~_BV(PB1); } void Init_LCD(void) //Инициализация ЖКИ { _delay_ms(200); PORTD=0b00110000; Impuls(); _delay_ms(50); PORTD=0b00110000; Impuls(); _delay_us(1000); PORTD=0b00110000; Impuls(); PORTD=0b00111100; // 8 bit, 2 line, 5*11 PORTB=0b0000000; Impuls(); PORTD=0b00001100; //display ON OFF Impuls(); PORTD=0b00000001; //Clear all Impuls(); PORTD=0b00000110; //Entry mode set Impuls(); //Инициализация в памяти дисплея символов для вывода PORTD=0b01001000; Impuls(); PORTB=0b00000100; for(int j=1; j< =8; j++) { for(int i=8; i> j; i--) { PORTD=0x0; Impuls(); } for(int i=1; i< =j; i++) { PORTD=0xFF; Impuls(); } } PORTB=0b00000000; PORTD=0b10000000; Impuls(); } void Char_To_LCD ( char TXT ) //Функция вывода символа на дисплей { PORTD=TXT; PORTB |= _BV(PB2); Impuls(); } |
Последнее изменение этой страницы: 2020-02-17; Просмотров: 170; Нарушение авторского права страницы