Искажения в форме сигнала генератора на atmega328

Я позже заменю его. Думаю, Вы правы. Я посмотрел сейчас схему, по которой я срисовал свою - там также. R18 - 2к…

И смотрите на частоте 6500 - тогда каждая точка отображается. График должен получится как в массив записано !

матрица R-2R так что )))

Вроде продаются готовые R-2R матрицы, откалиброванные на заводе …
глянул ценник и наличие … это не наш метод …

Что то мне не верится что от одного “нижнего” резистора так сильно зажевало график …
Надо будет в Proteus запустить…

Вы правы. Не в нем дело. Сейчас я заменил его, и ничего не изменилось. Но потом я исключил транзисторы из схемы, и сигнал нормализовался. Видимо, оставлю аттенюатор без транзисторов, и все дела).
Спасибо всем, кто принял участие в решении проблемы. Форма сигнала теперь нормальная, что и требовалось исправить.

Видимо не вся чуйка пропита !!!
P/S/ Правка кода на ASM не спасла бы ! Там вывод идет по кругу и указатель “автоматически” с конца массива перепрыгивает на начало.

В одном из первых ответов на эту тему предложили подобрать транзистор. Я тогда еще пробовал исключать их, но, видимо, на фоне всего остального - я разницу просто не заметил)).

Странно что Евгений Петрович с выравниванием нас сразу в угол не поставил на горох … Это видимо по тому что вы код не вставили в форум, а он этого не любит и не стал его изучать …

1 лайк

Поставьте вместо транзисторов повторитель на ОУ например MCP 6001 -будет лучше!
примерно так:

Спасибо, я попробую. Осталось найти в коробках ОУ с питанием 5в ( если такой есть у меня).

Нужно R2R иначе будет резаться сигнал

В этой теме R2R надо конкретизировать ! А то есть разночтения с резистивной сборкой!

Код не смотрел, но вот уже вопросы появились .
Зачем там вообще ассемблер ?

Делал подобный генератор, единственное, что там нужно, это массив на 256 байт (если нужно значения менять налёту, то два таких массива), и формулы расчета.
Типа таких:

void Sinus(){
    for (int i=0;i<RESOLUTION;i++) {
  valueY[i]=byte(127+(127*sin(2.0*PI*i*(1.0/(RESOLUTION-1)))));
 }
}

void Saw(){
    for(int i=0;i<RESOLUTION;i++){
        valueY[i]=map(i,0,RESOLUTION,0,255);
    }
}

Далее, сначала рассчитываем все значения и заполняем ими массив, а потом запускаем генерацию.
Если налёту, то заполняем неиспользуемый массив и переключаемся в нужный момент на него.
Частоту задаём таймером, по вызову прерывания с которого меняем значение регистров.
Неужели сильно быстрее на ассемблере будет выполнение:

ISR_TIMER1_COMPA_vect{
PORTD=arr[step];
step++;
}

10 тактов на одну точку
А у вас только вход-выход в прерывание уже 10 тактов …

Здесь Вы говорите об ОУ?

Я понимаю, что проект уже сделан. Но вот немножко для сравнения.
Это проще гораздо.

Да, о нем

Как понять, что ОУ подходит для данной схемы в качестве повторителя? На какой параметр в даташите смотреть (кроме напряжения питания). У меня только 5 вольт приходит в корпус.

rail to rail