Данные с микроконтроллера подаются на ЦАП. Для выходных данных будем использовать выводы порта В и С. Младшие разряды обработанных данных подаются через порт В, а старшие – через порт С на ЦАП. Сигналы управления для ЦАП будут подаваться через порт 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 Гц. Данное устройство обладает высокой точностью преобразования. Также имеет малые габариты, вес, и обладает низким энергопотреблением.
Одним из главных достоинств цифровых фильтров, является высокая точность преобразования, так же они не имеют дрейфа вследствие изменения параметров компонентов. Но они имеют ограничения при работе в реальном режиме времени, т.к. вычисление должно быть завершено в период дискретизации. Аналоговые ж фильтры необходимо использовать для устранения эффекта наложения спектров и на высоких частотах.