Построение цифрового фильтра

Содержание

1. Исходные данные 2

2. Частотные характеристики фильтра 3

3. Вывод системы дифференциальных уравнений 5

4. Решение системы средствами Odesolve 7

5. Система разностных уравнений 9

6. Решение системы разностных уравнений 10

7. Сравнение полученных решений 11

8. Разработка программы для микроконтроллера 12

9. Сравнение результатов 17

10. Выводы 17

 

  1. Исходные  данные

 

 

 

Рис. 1 – Схема, элементы, начальные условия фильтра

 

  1. Частотные характеристики фильтра

 

Комплексные сопротивления ветвей фильтра ( , , ) вычисляем по следующим формулам

 

 

 

Передаточная  функция по напряжению выглядит следующим  образом:

,  где

 

Отсюда получаем выражение для передаточной функции  по напряжению:

 

График передаточной функции фильтра, размещенный на комплексной плоскости, представлен  на рис. 2. АЧХ и ФЧХ передаточной функции представлены на рис. 3 и рис.4.

Графики, для  заданных вариантом задания значений сопротивлений, емкостей и индуктивностей построены средствами пакета MathCad.

Рис. 2 – График передаточной функции

Рис. 3 – АЧХ передаточной функции

 

 

Рис. 4 – ФЧХ передаточной функции

 

  1. Вывод системы  дифференциальных уравнений

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

Составим  уравнения фильтра по контурам и  узлам, показанным на рис. 1. Интегро-дифференциальные уравнения, составленные по контурам 1), 2), 3), выглядят следующим образом

 

Алгебраическое уравнение составленное по 1-му закону Кирхгофа выглядит следующим образом:

 

 

Независимые начальные условия определяем из предположения о равенстве нулю напряжений на всех конденсаторах и  токов во всех катушках индуктивности  в момент времени  .

 
 

Зависимые начальные условия определяем из приведенной выше системы уравнений

 

 

 

Дифференцируем, левые и правые части составленных интегро-дифференциальных уравнений, и получаем следующую систему  линейных неоднородных дифференциальных уравнений с постоянными коэффициентами

 

Оставляем два из трех дифференциальных уравнений и вводим дополнительную переменную . Получаем следующую нормальную систему линейных неоднородных дифференциальных уравнений с постоянными коэффициентами

 

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

 

 

  1. Решение системы средствами Odesolve

Для решения  полученной системы уравнений используем встроенную процедуру Odesolve.

На рис. 5 представлена процедура интегрирования полученных уравнений со следующими исходными данными:

    • R, C, L, Rn – значения величин элементов;
    • t - переменная интегрирования;
    • dlt ( ) - шаг интегрирования;
    • N - число шагов интегрирования;
    • T - время интегрирования;
    • e(t) - единичное входное воздействие.

Результат интегрирования полученных уравнений представлен на рис. 5.

Рис. 5 – Решение системы в  Mathcad

Рис. 6 – Результаты интегрирования системы. Odesolve

 

Преобразуем полученную систему уравнений в  систему разностных уравнений по методу Эйлера.

 

  1. Система разностных уравнений

 

Заменим производную в нормальной системе  дифференциальных уравнениях следующей  разностью 

,

и получим следующую  систему разностных уравнений 

 

 

Добавим в полученную разностную схему алгебраическое уравнение, упростим систему уравнений  и учитывая начальные условия напишем, средствами пакета MathCad, процедуру интегрирования Mysolve 

 

  1. Решение системы  разностных уравнений

Процедура интегрирования разностных уравнений Mysolve представлена на рис.7. Результат интегрирования уравнений системы Mysolve представлена на рис. 8.

Рис.7 – Процедура интегрирования системы – MySolve

 

 

Рис. 8 – Результат интегрирования системы. MySolve

  1. Сравнение полученных решений

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

, на одной временной оси

Рис. 9 – Сравнение результатов  интегрирования системы

При заданной дискретизации по времени    погрешнось вычислений достаточно небольшая.

Для сравнения, если в качестве шага дискретизации  выбрать , то процесс интегрирования станет расходящимся (рис.10, а), что приведет к значительной погрешности вычислений (рис. 10, б).

Рис. 10 –  а) Расходящийся процесс интегрирования; б) Погрешность вычислений

  1. Разработка  программы для микроконтроллера

 

Реализуем задачу интегрирования средствами микроконтроллера.

 

#include <mega8535.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x60

#define R1      0.7

#define R2      0.3

#define Rn      0.1

#define C2      0.03

#define C3      0.2

#define L2     0.1

#define DT      0.005

 

typedef struct

{

float ee, i1, i2, i3, i22;

}Step;

Step s[2];

char init = 0;

float data;

 

// частота дискретизации

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

    unsigned char adc_input=0;

    TCCR0=0x00; // остановить таймер

    TCNT0=255-77;//частота прерываний  1кГц

    TCCR0=0x04; // запуск таймера

    //PORTB = ~PORTB;    

    ADMUX=adc_input|ADC_VREF_TYPE;

    // старт аналого-цифрового преобразователя

    ADCSRA|=0x40;

}

 

interrupt [ADC_INT] void adc_isr(void)

{

    if( init == 0 )

    {

        //Начальная инициализация

        data = ADCH * 5.0 / 255.0;

        s[1].ee = data;

        s[1].i1 = s[1].i3 = s[1].ee/(R1 + Rn);

        s[1].i2 = s[1].i22 = 0.0;

        init = 1;

    }

    else

    {

        s[0] = s[1];

        data = ADCH * 5.0/ 255.0;

        s[1].ee = data;

        s[1].i2 = s[0].i2 + DT * s[0].i22;

        s[1].i3 =  s[0].i3 + (1.0/(R1 + Rn)) * (s[1].ee - s[0].ee)

   - (DT /((R1 + Rn)*C3))* s[0].i3

   - (DT * R1/(R1 + Rn)) * s[0].i22;

        s[1].i22 = s[0].i22 + Rn/ (L2 * (R1 + Rn)) * (s[1].ee - s[0].ee)

                            + (DT*R1/(L2 *(R1 + Rn)*C3))*s[0].i3

                            - DT/(C2*L2) * s[0].i2

                            - (R1*R2 + R1*Rn + R2*Rn)*DT/((R1 + Rn)*L2) * s[0].i22;

        s[1].i1 = s[1].i2 + s[1].i3;      

    }

   

    PORTB = (s[1].i1 + 2.5)*255.0 / 5.0;

    PORTC = (s[1].i2 + 2.5)*255.0 / 5.0;

    PORTD = (s[1].i3 + 2.5)*255.0 / 5.0;

}

void main(void)

{

// Инициализация периферийных  устройств контроллера

 

// Input/Output Ports initialization

// Port A initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTA=0x00;

DDRA=0x00;

 

// Port B initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTB=0x00;

DDRB=0xff;

 

// Port C initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTC=0x00;

DDRC=0xff;

 

// Port D initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTD=0x00;

DDRD=0xff;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: 15000 Hz

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x04;

TCNT0=0x00;

OCR0=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0x00;

MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x01;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0x80;

SFIOR=0x00;

// ADC initialization

// ADC Clock frequency: 125,000 kHz

// ADC Voltage Reference: AREF pin

// ADC High Speed Mode: Off

// ADC Auto Trigger Source: None

// Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=ADC_VREF_TYPE;

ADCSRA=0x8D;

SFIOR&=0xEF;

 

// Global enable interrupts

#asm("sei")

 

while (1)

      {

      //холостой цикл

      }

}

 

 

Листинг 1 – Программа, реализующая цифровой фильтр

 

; ------------------------------------------------------------

.MICRO "ATmega8535"

.TOOLCHAIN "GENERIC"

.TARGET    "primer.hex"

.COFF      "primer.cof"

.SOURCE    "main.c"

.TRACE              ; Activate micro trace

; ------------------------------------------------------------

.POWER VDD=5 VSS=0  ; Питание +5 вольт

; VSS это GND МК - "общий"  провод схемы

; Относительно него измеряются  напряжения

 

.CLOCK 4meg         ; тактовая частота МК

.STORE 2.5         ; время отображения

 

; ------------------------------------------------------------

 

XMyFunc _IMPULSE101(1 21m) pa0  ; импульсный генератор)

 

; ------------------------------------------------------------

XD2A_B D2A8 pb7 pb6 pb5 pb4 pb3 pb2 pb1 pb0 ana_out;описание цифро-аналогового преобразователя порт PB

XD2A_C D2A8 pc7 pc6 pc5 pc4 pc3 pc2 pc1 pc0 ana_out_2  ;описание цифро-аналогового преобразователя порт PC

XD2A_D D2A8 pd7 pd6 pd5 pd4 pd3 pd2 pd1 pd0 ana_out_3;описание цифро-аналогового преобразователя порт PD

  .PLOT  V(PA0)  V(ana_out) V(ana_out_2) V(ana_out_3)    ;вывод данных на осциллограф

 

Листинг 2 – Проект VMLab

 

Рис. 11 – Процесс эмуляции работы МК в VMLab

 

На рис. 12 представлены результаты работы программы.

Рис. 12 – Результаты работы программы (График MatLab)

 

  1. Сравнение результатов

 

На рис.13 произведено наложение графика тока i3, полученного в VMLab, на тот же ток, рассчитанный ранее, с помощью процедуры MySolve. Как видно из графика, результаты вычислений полностью совпадают, если не брать во внимание ступенчатость сигнала, полученного на 8-битном АЦП.

Рис. 13 – Графики токов i3, рассчитанных MySolve и VMLab

  1. Выводы

 

В ходе выполнения данной работы был  построен цифровой фильтр. На первом этапе  было дано аналитическое представление  принципиальной схемы аналогово частотного фильтра, состоящего из R, L, C – элементов, в виде системы дифференциальных уравнения. Затем полученная система была решена двумя способами: с помощью блока MathCad – GIVEN/Odesolve и численно, с помощью процедуры MySolve. После чего, процедура численного интегрирования была реализована программно на языке C.

Результаты  работы программы, совпадают с результатами расчетов процедуры MySolve и блока GIVEN/Odesolve, из чего можно сделать вывод, что аппаратные возможности микроконтроллера позволяют реализовать на нем цифровой фильтр.

 

Построение цифрового фильтра