
- •Сокращения
- •Введение
- •1Виды сигналов и цепей
- •1.1Континуальные и дискретные сигналы
- •1.2Линейная цепь с постоянными параметрами
- •1.3Линейная цепь с переменными параметрами
- •1.4Нелинейная цепь
- •2Линейная фильтрация сигнала
- •2.1Классификация фильтров
- •2.2Частотные характеристики фильтров
- •2.3Фильтры второго порядка
- •Фильтры нижних частот
- •Фильтры верхних частот
- •Полосно-пропускающие фильтры
- •Частотно-заграждающие фильтры
- •Частотно-выделяющие фильтры
- •Всепропускающие фильтры
- •2.4Работа т-образного фильтра
- •3Цифровая обработка сигнала
- •3.1Структура цифровых ких и бих фильтров
- •3.2Интегрирование уравнений методом Эйлера
- •3.3Интегрирование уравнений методом Адамса
- •3.4Интегрирование системы уравнений
- •3.5Построение цифровых бих фильтров
- •4Аппаратные средства aTmega 8535 avr
- •4.1Функциональная схема архитектуры
- •4.2Специальные функции контроллера
- •4.3Основные характеристики периферии
- •4.4Память программ и данных
- •4.5Тактовый генератор и таймеры
- •4.6Периферийные устройства
- •4.7Модуль прерываний
- •4.8Порты контроллера
- •4.9Режимы пониженного энегопотребления
- •7.2Вторая часть задания
- •7.3Третья часть задания
- •Заключение Литература
- •Термины и определения
- •Линейные пространства
- •Дифференциальные уравнения
- •Комплексные числа
- •Гармонические функции
- •Законы Ома и Кирхгофа
- •Переходные процессы
- •Сигналы с ограниченной полосой частот
- •Средства пакета MathCad
- •Интерфейс MathCad
- •Построение выражений и их вычисление
- •Стандартные функции
- •Ввод греческих букв
- •Ввод текста
- •Варианты заданий
- •Пример выполнения задания
- •Частотные характеристики фильтра
- •Система дифференциальных уравнений
- •Составление системы уравнений
- •Решение системы средствами Odesolve
- •Система разностных уравнений
- •Решение системы разностных уравнений
- •Сравнение полученных решений
- •Дифференциальное уравнение 3-го порядка
- •Получение дифференциального уравнения
- •Сравнение частотных характеристик
- •Решение уравнения средствами Odesolve
- •Разностное уравнение
- •Решение разностного уравнения
- •Сравнение полученных решений
- •Программирование в среде Code Vision avr
- •Решение системы по разностной схеме
- •Результаты решения системы
- •Выводы по проделанной работе
Разностное уравнение
Заменим производные в дифференциальном уравнении 3-го порядка следующими разностями
,
,
.
Проведя замену, получим следующее разностное уравнение
.
Сгруппируем коэффициенты и получим следующие уравнение
.
Для упрощения дальнейших преобразований разделим все коэффициенты на величину и введем следующие обозначения
,
,
,
,
.
Выражение, определяющее зависимость значения переменной на шаге n ( ) от значений этой переменной на предыдущих шагах ( , , ) и значений правой части уравнения ( , ), выглядит следующим образом
.
Используя это уравнение, напишем процедуру Mysolve.
Решение разностного уравнения
Процедура интегрирования разностного уравнения Mysolve представлена на Рис. Г.. Результат интегрирования уравнения процедурой Mysolve представлена на Рис. Г..
Сравнение полученных решений
Сравним результаты решений уравнения процедурами Odesolve и Mysolve путем наложения графиков решений, полученных этими процедурами. Отобразим графики переменных и , на одной временной оси (см. Рис. Г.).
Предполагая, что стандартная процедура Odesolve дает более точное решение, чем процедура Mysolve, с помощью рисунка можно оценить точность интегрирования по схеме Эйлера.
Рис. Г.14 – Результаты интегрирования уравнения. Mysolve
Рис. Г.15 – Сравнение результатов интегрирования уравнения
Рис. Г.16 – Процедура интегрирования уравнения Mysolve
Программирование в среде Code Vision avr
Решение системы по разностной схеме
Программа соответствующая системе разностных уравнений, написанная на языке С++, представлена ниже.
#include <mega8535.h>
#define ADC_VREF_TYPE 0x60
unsigned int ss, dat, YY, Y2;
double Y1; EE_n, EE_n_1, EE_n_2, X1_n, X1_n_1, X1_n_2,
X2_n, X2_n_1, X2_n_2, X3_n, X3_n_1, X3_n_2,
R1=10.0, R2=0.0, Rn=0.9,
C1=0.01, C2=0.08, L3=0.14, ZZ=0,
cnt=0, dt=0.0215;
unsigned char adc_input=0, a;
// задание временных интервалов таймер T0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=235; // начальная инициализация таймера
PORTB.1=!PORTB.1;
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40; // запуск АЦП }
interrupt [ADC_INT] void adc_isr(void)
{unsigned char adc_data;
adc_data=ADCH; // получение данных напряжения от АЦП
Y1=ADCH;
Y1=Y1/255-0.5*0;
// задание начальных условий
// начальные условия в момент времени 0
if (cnt==0){
EE_n_2=Y1;
X1_n_2=Y1/R1;
X2_n_2=-Y1/R1;
X3_n_2=0;
X1_n_1=0;X2_n_1=0;X3_n_1=0;
X1_n=0;X2_n=0;X3_n=0;
// начальные условия в момент времени 1
PORTA.1=1;}
if (cnt==1){
EE_n_1=Y1;
X1_n_1=X1_n_2+(1/R1)*((EE_n_1-EE_n_2)/dt)*dt
-(1/(R1*C1))*X1_n_2*dt-(1/(R1*C2))*X2_n_2*dt;
X3_n_1=X3_n_2;
X2_n_1=-X1_n_1-X3_n_1;
X1_n=0;X2_n=0;X3_n=0;
PORTA.1=0;}
// решение диф. Уравнения методом Эйлера
if (cnt>1){
EE_n=Y1;
X1_n=X1_n_1+(1/R1)*((EE_n-EE_n_1)/dt)*dt-(1/(R1*C1))*X1_n_1*dt
-(1/(R1*C2))*X2_n_1*dt;
X3_n = 2*X3_n_1-X3_n_2 - (Rn/L3)*((X3_n_1-X3_n_2)/dt)*dt*dt
+ (1/(C2*L3))*X2_n_2*dt*dt;
X2_n=-X1_n-X3_n;
// рекурсия
EE_n_2=EE_n_1; EE_n_1=EE_n;
X3_n_2=X3_n_1; X3_n_1=X3_n;
X2_n_2=X2_n_1; X2_n_1=X2_n;
X1_n_2=X1_n_1; X1_n_1=X1_n;
}
// вывод результатов на виртуальный ЦАП VMLAB
PORTC=X3_n*80*20+255/2; // ток i3
PORTD=X2_n*80*20+255/2; // ток i2
PORTB=X1_n*80*20+255/2; // ток i1
// контроль времени интегрирования
cnt=cnt+1;
if(cnt>100){cnt=0;}
}
void main(void)
{
// инициализация микроконтроллера
// конфигурирование порта A на ввод
PORTA=0x00;
DDRA=0xfe;
// конфигурирование порта B на вывод
PORTB=0x00;
DDRB=0x00;
// конфигурирование порта C на вывод
PORTC=0x00;
DDRC=0xff;
// конфигурирование порта D на вывод
PORTD=0x00;
DDRD=0x00;
// инициализация таймера временных интервалов
TCCR0=0x05; // установка режима таймера
TCNT0=0x00; // установка начальных значений
OCR0=0x00;
// разрешение прерываний о т таймера
TIMSK=0x01; // установка режима таймера T0
// инициализация АЦП
// установка разрядности АЦП
// установка опорного напряжения АЦП
// установка способа запуска АЦП
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8D;
SFIOR&=0xEF;
// глобальное разрешение прерываний
#asm("sei")
while (1)
{// холостой цикл };
}