![]() | |
|
Главная Радио и связь #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 |