Смекни!
smekni.com

Устройство цифровой фильтрации на основе микроконтроллера фирмы AVR ATmega16 (стр. 3 из 3)

Данные с микроконтроллера подаются на ЦАП. Для выходных данных будем использовать выводы порта В и С. Младшие разряды обработанных данных подаются через порт В, а старшие – через порт С на ЦАП. Сигналы управления для ЦАП будут подаваться через порт D.


3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

3.1 Разработка алгоритма программы

Рис.3.1 – Алгоритм работы устройства

3.2 Проектирования модуля инициализации портов ввода-вывода

Порт настроим на ввод информации. Порты В и С на вывод. Мы будем использовать только младшую тетраду порта D, то инициализируем только ее на ввод информации.

void GlobalInitialize(void)

{

DDRA = 0x00; //Port A pins as output

PORTA = 0x01; //Turn ON PullUP for PortA pin

DDRB = DDR_SPI; //Port B pins as output

PORTB = 0xff; //Send 0xFF to PortB output pins

DDRC = 0x01; //Port C pins as output

PORTC = 0x01; //Send 0x03 to PortC output pins

}

3.3 Инициализация АЦП

За настройку работы АЦП отвечают три регистра:

· ADCSRA – регистр управления и состояния,

· ADMUX – регистр управления мультиплексором,

· SFIOR – регистр специальных функций.

Форматы регистров управления работой АЦП приведены на рис.6.

Рис.3.2 Формат регистров ADCSRA, ADMUX, SFIOR

Инициализация регистра ADCSRA:

Бит 7 ADEN =”1” включение АЦП.

Бит 6 ADSC =”1” запуск первого преобразования в режиме непрерывного преобразования.

Бит 5 ADATE позволяет выбрать режим работы АЦП

Бит 4 ADIFфлаг прерывания, устанавливается при завершении преобразования

Бит 3 ADIE=”1” разрешение прерывания по завершению преобразования

Биты 2…0 ADPS2..0=”010” выбран делитель частоты на 16, тогда при тактовой частоте контроллера 2 МГц, частота тактов АЦП будет составлять 125 кГц, использование такой частоты позволяет увеличить точность преобразования.

Инициализация регистра ADMUX:

Биты 7,6 REFS1:REFS0= “11” при этом в качестве опорного напряжения используется внутренний источник с Uоп = 2,56 В.

Бит 5 ADLARрезультат преобразования выравнивается по левой границе 16-ти разрядного слова

Биты 4..0 MUX4..0 управляют входным мультиплексором, а так как у нас используются входы ADC1, то эти разряды могут принимать значение “00001” .

Инициализация регистра SFIOR:

Биты 7..5 ADTS2..0=”000” определяют режим непрерывного преобразования. В процессе выполнения которого есть возможность изменять содержимое разрядов MUX2..0, что позволяет осуществлять последовательное преобразование сигналов нескольких каналов.

Бит 4 ADHSM=”0” при “1” увеличивает скорость работы АЦП, однако в этом мы не нуждаемся.

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

ADC=1024*Vin/Vref

void Init_ADC(void)

{

ADCSRA |= (1 << ADIE); //Enable ADC Interrupt

ADCSRA |= (1 << ADPS1); //ADC Timing /16

ADCSRA |= (1 << ADEN); //Enable ADC

ADMUX |= (1 << MUX0); //выборканала - мультирлексированный ADC1

ADMUX |= (1 << REFS0); //Internal Reference 2,56V selected

ADMUX |= (1 << REFS1);

SFIOR = 0;

#asm("sei");

}

3.4 Проектирование процедуры чтения данных с АЦП

Сигнал со входа АЦП преобразовывается по установке бита ADSC в 1. Затем ожидается выставления флага конца преобразования ADIF в 1. После того, как ADIF = 1 данные сохраняются во временной переменной.

unsigned int ReadADC()

{

unsigned int TMP;

unsigned int ADC;

ADCSRA |= 1<<ADSC; //запуститьАЦПнапреобразование

if (!(ADCSRA & (1<<ADIF)) )//флаг конца преобразования

//если преобразование закончилось

{

TMP=ADCH;

TMP=(TMP<<8);

TMP=TMP + ADCL;

ADCSRA=(ADCSRA | (1<<ADSC)); //запускАЦПснова

}

ADC=TMP;

CLRBIT(ADCSRA,ADEN); //выключитьАЦП

returnADC;

}

3.5 Проектирование процедуры работы интегратора

unsigned int Integrator(unsigned int in)

{

static unsigned int KH=8;

static unsigned int KL=10; //K=0.8 for economy memory pri uveli4enii to4nosti

static unsigned int x_in, x1, x2[2], x3[2], x4, y_out;

x_in=0;

x2[0]=0; x2[1]=0; //init old state

x3[0]=0; x3[1]=0; //init old state

y_out=0;

//your start variable here

x_in=in;

x1=x_in;

x2[1]=x1+x3[0];

x3[1]=x1+x2[0];

x4=x2[1]*KH/KL;

//save old state

x3[0]=x3[1];

x2[0]=x2[1];

//==============

return x4;

}

3.6 Процедура передачи данных ЦАП

Так как ЦАП имеет последовательный вход, то данные необходимо передавать посылками. Для этого используется интерфейс SPI (Serial Peripheral Interface) - полнодуплексный скоростной синхронный трёхпроводной интерфейс.

Рис.3.2- Конфигурация SPI

SPI в реализации Atmel имеет четыре задаваемые программно скорости передачи, может передавать байты от старшего к младшему биту и наоборот, обнаруживает ошибки пакета.

За работу интерфейса отвечают 3 регистра:

· Регистр SPCR - регистр управления

SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0

SPIE - разрешение прерывания по окончанию передачи.

SPE - SPI включен. Если установлен этот бит, то выводы #SS, MISO, MOSI и SCK работают как выводы SPI, иначе - как простые выводы порта.

DORD - направление передачи данных. Если установлен, то передача идёт с младшего бита, если сброшен - со старшего.

MSTR - если установлен, контроллер работает как Master, если сброшен - как Slave. Управляется также выводом #SS, если он настроен на ввод - при подаче "0" на #SS бит MSTR сбрасывается.

CPOL - определяет уровень на выходе SCK в режиме ожидания - SCK = CPOL

CPHA - если установлен, передача и приём бита производится по обратному фронту, если сброшен - по прямому.

SPR1, SPR0 - делитель тактовой частоты (F - частота генератора контроллера).

SPR1 SPR0 Частота

0 0 F/4

0 1 F/16

1 0 F/64

1 1 F/128

· Регистр SPSR - регистр состояния

· Регистр SPDR - регистр данных

void Init_SPI(void)

{

// ÌÀÑÒÅÐ

DDR_SPI=(1<<MOSI)|(1<<SCK); // Â: è ÑLK

SPCR |= (1 << SPIE); // SPI

SPCR |= (1 << SPE); //

SPCR |= (1 << MSTR); //

SPCR |= (1 << SPR0); // /16

}

void SendSPI(unsigned int x)

{

SPDR = x; // SPI

while(!SendDataReady); // ֏

SendDataReady = FALSE; //è â 0

}

interrupt [SPI_STC] void SPI_interrupt(void)

{

SendDataReady = TRUE;

}

3.7 Процедура main( )

void main(void)

{

unsigned int ADC_conv;

unsigned int y_out;

PORTC = 0x01;

GlobalInitialize();

Init_ADC();

Init_SPI();

while(1)

{

PORTC = 0x00;

ADC_conv=ReadADC();

y_out=Integrator(ADC_conv);

SendSPI(y_out); //ïåðåäà÷à äàííûõ ÀÖÏ

delay_us(6); //forADC

}

}


Заключение

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

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