• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Цифровой фильтр для дельта-сигма АЦП

КислыйДядя

Ученик
Регистрация
4 Дек 2016
Сообщения
3
Реакции
0
Баллы
0
Цифровой фильтр для дельта-сигма АЦП

Аналоговая часть собрана на рисунке ниже, она вроде рабочая. Напряжение изменяем с помощью подстроичного резистора. Но возникли проблемы при обработке сигнала на МК: фиксируются только часть значений и то с погрешностью. Код ниже. В чем может быть дело?
06.gif.5cd3a94b645f076da03c45afa6c34eec.gif

Код:
#include <avr/io.h>
#include "hd44780.h"
#include "hd44780.c"
#include "lcd_cfg.h"
#define PORT_COMP PORTC
#define DDR_COMP DDRC
#define PIN_COMP PINC
#define A_PIN 0
#define B_PIN 1
double i=0;
uint32_t count=0;
float Voltage=0;
void display()
{
    lcd_goto(1,0);
    lcd_puts("V=");
    lcd_goto(1,2);
    lcd_ftos(Voltage, 2);     
}
int main(void)
{
    lcd_init();
    lcd_clrscr();
    DDR_COMP = 0b00000010;
    while(1)
    {
        display();
        if (PIN_COMP & (1 << A_PIN) == 1)
        {
            i++;
            PORT_COMP |= (1<<B_PIN);
        }
        else
            PORT_COMP &= (0<<B_PIN);
        if (count >= 16)
        {
            Voltage = (i/16)*4;
            count = 0;
            i = 0;            
        }
        count++;
    }
}
 
а схема где?
lcd_ftos(Voltage, 2); второй параметр за что отвечает?
на вход аналоговой схемы что подается?
 
Вот схема
18.gif
Второй параметр-это положение на дисплее.
На вход аналоговой части подается напряжение с потенциометра.
 
Функция lcd_ftos выводит на дисплей числа с плавающей точкой. Параметр “n” указывает сколько символов после точки отображать.
но не суть)
а что за контроллер? при нынешней стоимости контроллеров, городить такой колхоз смысла особого нет. или нужна повышенная точность? опять же точность растет от увеличения выборки, а тут всего 16.
в общем прочитал статью не понял что за действия производятся с вычисленным значением) почему умножается на 4? относительно чего нормируется?
 
Контроллер atmega16 и точность важна. А 4 -это величина опорного напряжения.
 
Поскольку роль тактируемого компаратора у нас выполняет МК только в цикле преобразования, вне этого цикла внешняя схема (рис.5) «замирает». Это равносильно тому, что мы разрываем цепь отрицательной обратной связи (ООС), что приводит к уходу интегратора (ОР3 на рис.5) в насыщение до ±Umax. Следовательно, несколько первых тактов модулятор выходит из насыщения в рабочую область, и несколько первых бит могут внести ошибку в результат преобразования. Значит, до входа в цикл необходимо хотя бы попытаться вывести модулятор в рабочую область. Сделать это проще всего, проинвертировав сигнал, идущий от МК к ДСМ. Иными словами, необходимо считать значение выходного порта, проинвертировать его и снова отправить на выход, затем подождать, и только потом входить в цикл
возможно в этом ошибка, особенно учитывая длину выборки. хотя если измерения постоянно идут, то не должно такого быть.
Явных ошибок не вижу, надо смотреть осцилом, мож по питанию помехи идут.
 
а точности родного АЦП не хватает?
 
Назад
Сверху