Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Проектирование цифрового спектроанализатора аналогового сигнала на микроконтроллере 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; Просмотров: 167; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.12 с.)
Главная | Случайная страница | Обратная связь