Делюсь в надежде, что кому-нибудь это нужно.
Генератор синуса без ступенек 4 пина stepless sinus generator, sin wave generator.
Это подобие синуса получено на базе 4bit 81step ternary DAC путем замены резистора обратной связи ОУ конденсатором 4,7 мкФ, т.е. превращением преобразователя ток-напряжение в интегратор тока. Остальное: Atmega32, 1МГц RC, PORTA0-PORTA3, весовые построечники примерно 380, 1150, 3500 и 11750 Ом (по китайскому цифровику), с выхода на минус конденсатор 0,47мкФ, частота около 300Гц, амплитуда около 0,8Вольт, на микросхеме TDA2030 +8,5 и -3,5Вольт.,
Главным доводом в пользу этого варианта троичного ЦАП считаю малое количество используемых выводов МК и отсутствие ступенек.
Основные недостатки: медленнее стандартного двоичного на R-2R матрице, требуется ОУ, повышенная нагрузка на процессор и память, а так же наличие помех от переходных процессов в МК
В коде есть "лишнее".
DDRA=0x13;//42
PORTA=0x02;
delay_us(1);
Схема не имеет главной обратной связи, поэтому накопление несимметричных положительных и отрицательных токов могло бы привести к неконтролируемому одностороннему ограничению выходного напряжения. "Лишний" код подтягивает выходное напряжение к минусу.
Точность синуса можно повысить если при формировании длительностей учесть длительности исполнения команд. Я программист никудышный, пока не могу этого сделать.
Предыстория:
https://kazus.ru/forums/showthread.php?t=14543&page=7
Метод формирования выходного напряжения четырехразрядным троичным интегрирующим ЦАП позволяет по плавности линейно меняющегося напряжения обойти 10 разрядный двоичный R-2R.
(Про помехи, кондер, обратную связь и "лишний" код в посте#13)
...............
Осцил C1-93 1988 года рождения, все посохло давно, еле синхронизируется, тем не менее согласен, что на нормальном кривизна все равно вылезет из за неидеальности кода-раз, из-за помех переключения-два.
А еще я подумал, у меня в кодах сначала DDR, потом PORT записывается, это может хорошо для перехода из вывода на ввод (в Hi-Z), а может при обратном переходе надо сначала PORT, а потом DDR записывать, чтоб лишние переходы состояний выходного каскада Hi-Zом от пина изолировать. И попробовать вычислить особо шумный разряд. Не факт что это будет самый старший.
На дне отрицательной полуволны всплеск появляется как раз от " лишнего" кусочка.