Главная  Радио и связь 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [ 79 ] 80 81 82 83 84 85 86 87 88 89 90 91 92 93

#define APPSO (0x01) #define ADCNum (0x00)

/*Конец определения наименований разрядов регистров микроконтроллера*/ #define KZ 3

/*1024Hz 30Hz cutting, Gain = 40928/4 = 10232*/

#define K Hz 256 - 107

#define Gain 10232

♦define kyO - 0.8022616140

♦define kyl 3.3574942168

♦define ку2 - 5.3028655427

♦define куЗ 3.7472420208

/*512Hz 30Hz cutting, Gain = 2832/4 = 708*/

unsigned char bh,bl;

unsigned char *il,*ih;

void *ptri;

unsigned short i;

signed long j;

signed short k;

float yO,yl = 1449505,у2 = 1449505,уЗ = 1449505,у4,z; unsigned short xO,xl = 512,x2 = 512,x3 = 512,x4,x; ♦pragma vector=SPI STC vect

interrupt void SPI interrupt(void)

♦pragma vector=ADC vect

interrupt void ADC interrupt(void)

{ADCSR = 0; }

♦pragma vector=TIMERO OVF vect

interrupt void TimO interrupt(void)

{TCNTO = K Hz; TCCRO = KZ; WDR() ; SEI();

ADCSR = ADEN + ADSC + ADIE + ADPS2 + ADPSl; MCOCR = SE; SLEEP(); bl = ADCL; ADCH; bh&0x03; xl x2 x3 x4 bl

= xO + x4

bh bh xO xl x2 x3 x4

yo yi

x = xO + x4 + 4*(xl + x3) + 6*x2; у4 = (kyO*yO + kyl*yl + ку2*у2 + куЗ*уЗ

256*bh;



j = у4; j = j/Gain; i = j; PORTB = 0; SPDR = *ih; SLEEP(); SPDR = *il; SLEEP(); PORTB = 1; )

void main(void) {

ptri = &i; ih = ptri; il = ih++;

WDTCR = WDE + WDP2 + WDPl + WDPO;

DDRB = 0x2D; /*Init PortB for SPI work SCK + MOSI + SS + PBO

00101101 = 0x2D - outputs*/

CLI() ; PORTB =1;

SPCR = SPIE + SPE + MSTR; /* + CPRl + CPRO;*/

ADMDX = ADCNum;

TIMSK =2;

TIFR = 2;

TCNTO = K Hz;

TCCRO = KZ;

SEI() ;

cycle:

WDR();

goto cycle;

Как и в AVR Studio, листинг начинается директивами #include, подключающими к проекту стандартные библиотеки. Имена папок, в которых находятся подключаемые файлы, необходимо установить в соответствии с тем, где эти файлы окажутся установленными на ващем компьютере, вы можете разыскать эти папки, воспользовавшись поиском (Пуск/Найти/Файлы и папки, ввести, например, ina90.h). Первый подключаемый файл определяет наименования регистров, векторов прерываний микроконтроллера ATmegaS, второй файл содержит функции, общие для микроконтроллеров серии ATmega. Третий и четвертый файлы не используются в данной программе, но часто используются в других программах, длину кода они не увеличивают, поэтому нет смысла убирать их. Третий файл содержит стандартные функции ввода/вывода языка С, четвертый файл содержит разнообразные функции, в том числе математические.



Замечание. Поочередно закомментировав директивы #include, можно откомпилировать программу и по сообщениям об ошибках определить, какие именно функции и определения содержат подключаемые файлы библиотеки.

Подключаемые файлы для С-программы не содержат наименований! отдельных разрядов регистров микроконтроллера, как это было в подклю-1 чаемых файлах *.inc для ассемблера. Для удобства программирования ди-1 рективами #define имена разрядов определяются такими же, какими они1 были определены в техническом описании микроконтроллера и в файле *.inc для ассемблера.

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

• KZ, равное трем, - это значение, загружаемое в регистр TCCRO мик- роконтроллера для установки коэффициента предварительного де- ления частоты (64), подаваемой на таймер ТО;

• KHz, равное 256 - 107, - значение, загружаемое в регистр TCNTO;l загрузка констант KZ и KHz в указанные регистры обеспечивает частоту выборки входного сигнала в 1024 Гц;

• константа определяется вчетверо меньшей, чем значение, по- лученное при расчете. Это позволит отправлять в микросхему ЦАП выходной код без дополнительного умножения его на четыре (как бьшо сказано выше, 10-разрядный код, посылаемый в микросхем> TLC5615, надо умножать на 4);

• константы ку0...ку3 - это расчетные коэффициенты фильтра, на ко- торые в формуле домножаются значенияу/Cy...y/J/соответственно.

Дальше определяются типы переменных, а значения у7...уJ, х1...хЗ, со- ответствующие значениям выходных кодов у[1]...у[3] и выборок х/7у...х/М соответственно, определяются предварительно. Значения выборок при- равниваются среднему между максимально и минимально возможным! значением выборки: (О + 1023)/2, что приблизительно составляет 512. Зна- чения кодов получены расчетным путем для указанных значений выборок без учета коэффициента GAIN (об этом будет сказано далее). Без предвари-! тельного определения эти значения определяются как нулевые, что приво-! дит к получению выходного кода, значительно отличающегося от реально-! го в нескольких начальных выборках, а также к скачьсу напряжения на вы- ходе фильтра после включения.

Подпрограмма SPIJntermpt обработки прерывания окончания переда- чи по SPI вызывается вектором прерывания [SPISTCvect]. Никаких операций в подпрограмме не выполняется.

Подпрограмма ADCJnterrupt обработки прерывания окончания преобразования АЦП вызывается вектором прерывания fADC vectJ. В регист ADCSR управления АЦП заносится нулевое значение.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [ 79 ] 80 81 82 83 84 85 86 87 88 89 90 91 92 93


0.0061