Параллельный Цифро Аналоговый Преобразователь по схеме R-2R

Порой надо выдать точный аналоговый сигнал, да еще с быстро менющийся. Например, функцию. Раньше я рассматривал как это можно сделать с помощью ШИМ, но у этого метода есть проблема — он очень медленный. В самом деле, чтобы получить один уровнь на ШИМ, нужно, по меньшей мере, 256 тиков таймера. А если надо развернуть функцию в которой 256 отсчетов? Да еще на каждый отсчет по 256 тиков? Это какая же должна быть частота процессора? Да еще надо учесть, что ШИМ требует интегрирующей цепочки с конденсатором. А значит для четкого установления уровня должно пройти еще несколько импульсов, что снижает скорость еще раза в три. Короче, получить что либо быстрей чем 50 ГЦ на ШИМ очень сложно. Я не говорю даже о том, что у ШИМ изза свойств емкостного заряда сильно плывет линейность, так что это приходится учитывать.

Тут на помощь приходит параллельный ЦАП. Суть его в том, что каждый его вход имеет свой вес в вольтах, которые потом складываются, образуя сумму на выходе. При этом работает вся конструкция очень быстро. Фактически, скорость тут ограничена только паразитными емкостями между элементами.

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

Теоретически, разрядность можно повышать практически до бесконечности. На практике же, уже на десятом разряде возникают проблемы из-за сопротивления ключей, что сказывается на точности и , главное, линейности выходных данных. Но в подавляющем большинстве случаев восьми разрядов хватает за глаза. Тем более их где то еще надо найти, это же целых 8 линий I/O которые надо урвать.

Также не помешает добавить операционный усилитель, включенный повторителем. Чтобы сопротивление нагрузки не вносило искажений. Я поначалу впаял OP07, но получил облом — у меня отрезало все, что ниже 2.5 вольт. Слишком маленькое напряжение питания. Тут нужен усилитель который может работать в режиме Rail-2-Rail то есть выдавать на выходе сигнал с амплитудой от плюса до минуса питания, с минимальным отклонением. При добавлении ОУ, надо учитывать тот факт, что почти у всех операционников максимальное выходное напряжение резко заваливается с ростом частоты — параметр Max Output Swing vs Freq. это показывает. Например, для LM324 выглядит так:

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

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

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

Пробовал брать каждое второе значение из таблицы (при этом она ужалась до 128 значений) — тоже все очень красивое. И лишь когда стал брать чуть ли не каждое 16е значение, то тогда стали заметны лесенки на функции:

И то их можно было сгладить фильтром и опять будет красота. Зато на 8ми мегагерцовой Меге удалось добиться 20кГц синусоидального сигнала :)

Вот такой код получился, точнее это фрагмент.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Sine:		SetTask	TS_Sine		; Повторный вызов через API RTOS. Тут не имеет значения
 
		LDS	Counter,SinCT	; Загрузить из памяти текущее значение указателя
 
Loop:		WDR			; Сброс собаки
		LDPA	Sinus		; Макрос, загружающий в Z адрес таблицы с синусом
 
		CLR	OSRG		; Сбрасываем рабочий регистр
		ADD	ZL,Counter	; Вычисляем смещение по адресу таблицы
		ADC	ZH,OSRG
		LPM	OSRG,Z		; Грузим в рабочий регистр из таблицы байт
		OUT	PORTD,OSRG	; Выдаем его в порт
 
		INC	Counter		; Увеличиваем счетчик
		STS	SinCT,Counter	; Сохраняем значение счетчика в память
 
		RJMP	Loop		; Переход
 
		RET	
; Так как таблица на 256 значений, то проверку счетчика на переполнение делать не надо, он сам, достчитав до 255, 
; обнулится.
 
; А эта та самая таблица
Sinus:	.DB 64,65,67,68,70,72,73,75
	.DB 76,78,79,81,82,84,85,87
	.DB 88,90,91,92,94,95,97,98
	.DB 99,100,102,103,104,105,107,108
	.DB 109,110,111,112,113,114,115,116
	.DB 117,118,118,119,120,121,121,122
	.DB 123,123,124,124,125,125,126,126
	.DB 126,127,127,127,127,127,127,127
	.DB 128,127,127,127,127,127,127,127
	.DB 126,126,126,125,125,124,124,123
	.DB 123,122,121,121,120,119,118,118
	.DB 117,116,115,114,113,112,111,110
	.DB 109,108,107,105,104,103,102,100
	.DB 99,98,97,95,94,92,91,90
	.DB 88,87,85,84,82,81,79,78
	.DB 76,75,73,72,70,68,67,65
	.DB 64,62,61,59,58,56,54,53
	.DB 51,50,48,47,45,44,42,41
	.DB 39,38,36,35,34,32,31,30
	.DB 28,27,26,25,23,22,21,20
	.DB 19,18,17,15,14,13,13,12
	.DB 11,10,9,8,8,7,6,5
	.DB 5,4,4,3,3,2,2,2
	.DB 1,1,1,0,0,0,0,0
	.DB 0,0,0,0,0,0,1,1
	.DB 1,2,2,2,3,3,4,4
	.DB 5,5,6,7,8,8,9,10
	.DB 11,12,13,13,14,15,17,18
	.DB 19,20,21,22,23,25,26,27
	.DB 28,30,31,32,34,35,36,38
	.DB 39,41,42,44,45,47,48,50
	.DB 51,53,54,56,58,59,61,62

З.Ы.
Но синус это не прикольно. В конце концов, его можно и аналоговыми методами получить не сильно напрягаясь. А с ЦАП можно по таблицам задать любую форму. Вот, например,

А это рок концерт. Вид со сцены.

А напоследок, дабы меня не упрекали что тема сисек не раскрыта…

Сиське!

119 thoughts on “Параллельный Цифро Аналоговый Преобразователь по схеме R-2R”

        1. Ну звуковая карта это как бы отдельное устройство со своим процессором, памятью и обрабатывает данные она сама. А тут все было программно на главном процессоре.

        2. «Зато на 8ми мегагерцовой Меге удалось добиться 20кГц синусоидального сигнала :)»

          — это когда каждое значение брать, или каждое 16-тое?

      1. Я бы хотел спросить у тебя. Мне нужно вывести на динамик звуки нот (до, ре, ми, фа, соль, ля, си), как мне их записать в память в двоичном коде (8 бит каждая нота), чтобы потом через преобразователь вывести на динамик? Или же это и есть синусоида, просто разные частоты выставлять и оставить амплитуду? Я может в чем то не прав, исправьте меня если что, очень нужна помощь, делаю курсовой тема «синтезатор» правда с 7 клавишами. Как с тобой связаться, дай плз свою почту и вк.

        1. Амплитуда это громкость, а тебе надо просто генерить синус и менять частоту. Причем сам синус, думаю, даже не обязательно. Достаточно прямоугольника, просто меняешь частоту и все. Тебе проще это сделать не на ЦАП, а тупо на таймере дрыгать ногой по выдержкам. Частоту задавать будешь уставкой таймера, например. Вариантов и способов там много.

          Никак. Лично не консультирую.

    1. Звуки можно извлекать быстро-быстро дёргая ОДНОЙ единственной ножкой :) Причём, звуки далеко не уровня «бип-бип». В ранних АОН так делали даже синтезатор речи. У этого метода даже есть какое-то умное название, но я его не помню… «чего-то-там-модуляция»…

  1. Ди, а помнишь в конференции как то кидали линк, там часы аналоговые выводили на экран осцилла, там тот же метод, что и сдесь?

  2. :)) Сиськи на осциле — это ж надо было догадаться. А статья полезная. Кстати весьма полезной будет статья про ОУ, реально как использовать какие нюансы, сомовщзбужение и проч. А то пишут много теории, а связи с практикой — нуль.

  3. Помимо паразитных емкостей там есть еще и конденсатор на выходе….он конечно мелкий, но надо же к чему то придраться;)

  4. Хорошо написано, спасибо!
    Насчет ШИМ, та вроде как можно повысить частоту,заставив таймер считать не до 255, а меньше. Режим где WGM00, WGM01, WGM02 равны 1. В этом случае максимальное значение таймера ограничивается OCR0A, а скважность можно ставить через OCR0B. Правда теряется один канал ШИМ и уменьшается разрешающая способность оного. Или я где-то не прав? Смотрел в студии, вроде работает.

    1. Ну будет на 256, а 128 тиков. При этом ты потеряешь в разрешении. И чем больше снижаешь тем больше теряешь в разрешении. Здесь же от разрешения скорость не зависит (зависит от глубины таблицы, но это уже не столь критично, как показывает эксперимент)

  5. Прикольно! Я вот только что сделал такой же ЦАП. Но у меня он двухканальный. Порт В у tiny2313 разделил на 2 канала по 4 бит. схема — http://tripsin.narod.ru/2sin.png Разрешения для моей задачи достаточно. Возник вопрос. Синус получается нормальный, но когда я просто пробовал сделать пилу, т.е. просто инкрементил байт в порту, то верх у пилы получается сильно заваленным. Это особенно выражено на низких частотах. Причем в модели в Proteus тоже есть эта нелинейность, хотя и не так выраженная, как в реальном дивайсе. Может мне кто-нибудь объяснить почему так получается? В ЦАПах использованы резисторы 20к и 10к. ЦАПы нагружены на делители напряжения 20к, чтобы регулировать уровень выходного сигнала.
    Это пример пилы на 62Гц — http://tripsin.narod.ru/62Hz.png
    Кстати частоту сигнала я меняю методом накопления фазы. При частоте дискретизации 200кГц и 16-битном накопителе фазы шаг перестройки частоты получается 3Гц. Размер таблицы синусов 256 байт. Если сделать 24-битный накопитель (использовать 3 регистра), то шаг можно уменьшить до сотых долей герца.

    1. А зачем? Есть куча готовых ЦАПов на любой вкус и цвет….
      PS Что-то меня эти конденсаторы на выходе смущают…может попробовать выкинуть их?

      1. > А зачем? Есть куча готовых ЦАПов
        Можно считать, что это тренировочный проект. Это мое первое самостоятельное устройство на МК. Если потом потребуется что-то серьезнее, то сделаю на MAX522.

        > PS Что-то меня эти конденсаторы на выходе смущают
        Они режут постоянную составляющую, т.к. сигнал потом пойдет на звуковой усилок. А пила получается кривая и без кондеров.

    2. между цапом и выходными делителями поставь ОУ в режиме повторителя, как это сделал DI HALT
      есть прекрасные сдвоенные ОУ с одним питанием, например LM358. если нужна скорость — эмиттерный повторитель но надо будет мудрить с линейностью около 0, видимо отрицательное смещение.

      1. Тут надо Rail-2-rail если с одинарным питанием работаешь. Либо теряешь все низы и все верхи. На дешевых ширпотребных усях очень сильно.

        1. Max, DI HALT Спасибо за совет. Я понял. Из-за своего небесконечного сопротивления делитель влияет на линейность ЦАП. Повторитель с ОУ позволит резко увеличить входное сопротивление делителя.

  6. тут как раз бы еще это дело повесить на регистр ради интереса
    и возле выводов оу надо вешать блокировочный кондер, иначе будут шумы сильные
    а еще лучше питание оу включить через п-филтр

      1. это смотря для чего тебе такой цап
        как ступенчатый регулятор напряжения или тока вполне сгодится для управления усилением в тракте приемника или блока питания

  7. а можно для новичка объяснить чем всетаки этот параллельный ЦАП улучшает нам жизнь ? Я понимаю что делать ШИМом например синусоиду будет долго, но как этот параллельный ЦАП сделает нам ее быстрее и почему, как он работает, в деталях?

    П.С. просьба не бить, просто растолковать на пальцах…

    1. ШИМ используют в других случаях:
      1. Системы с большим током через нагрузку. ШИМ позволяет ставить в качестве силового элемента ключ (транзистор) с минимальным падением напряжения и минимальным рассеиванием тепла. Если поставить то же транзистор в рещиме усилителя и плавно регулировать напряжение на входе, то мы будем терять много мощности на самом транзисторе.
      2. Системы с небольшой скоростью реакции на импульс..например нагревательные элементы или двигатели…они же как правило принадлежат и к любителям покушать ток.

      На пальцах подробнее чем в статье не растолкуешь.

    2. Дело в том, что в ПАЦП мы выводим просто число в порт, как оно есть, а резистивная матрица мгновенно (считаем что паразитных емкостей нет) преобразовывает его в напряжение.
      Представь что у тебя во все регистры занесены нужные значения синусоиды. 32 точки. Вот такая конструкция выдаст в порт весь период за сущие мгновения.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      
      OUT PORTD,R0
      OUT PORTD,R1
      OUT PORTD,R2
      OUT PORTD,R3
      OUT PORTD,R4
      OUT PORTD,R5
      OUT PORTD,R6
      OUT PORTD,R7
      OUT PORTD,R8
      OUT PORTD,R9
      OUT PORTD,R10
      OUT PORTD,R11
      OUT PORTD,R12
      OUT PORTD,R13
      OUT PORTD,R14
      OUT PORTD,R15
      OUT PORTD,R16
      OUT PORTD,R17
      OUT PORTD,R18
      OUT PORTD,R19
      OUT PORTD,R20
      OUT PORTD,R21
      OUT PORTD,R22
      OUT PORTD,R23
      OUT PORTD,R24
      OUT PORTD,R25
      OUT PORTD,R26
      OUT PORTD,R27
      OUT PORTD,R28
      OUT PORTD,R29
      OUT PORTD,R30
      OUT PORTD,R31

      По такту на команду. При 8ми мегагерцах мы получим синус частотой 250кГц.

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

      ШИМ так не может. Ему надо во-первых прорисовать импульс, на это уйдет как минимум 2n тактов. Где n разрядность нашего ЦАП, а во-вторых зарядить конденсатор в фильтре, чтобы получить устоявшееся напряжение, а не импульс. На это не помешает пустить еще два три периода ШИМ.

  8. Сиськи — это конечно прикольно. А вот хотелось бы взглянуть на пилу. Хотя бы на глаз оценить линейность. Ведь применённые резисторы — обычный ширпотреб, наверное +-5%. Как это влияет?

  9. Хм.. А мне чё-то не нравится.. Да, с линейностью вроде нормально (в глобальном плане). А вот эти вот мелкие «бугорки», «ямки», «пички» — это чего? Или это огрехи осциллографа? Вообще замечаю, что все осциллограммы с этого осцила (не только в этой теме) очень «шумные» — особенно заметно на горизонтальных участках.. Или это на всех осцилах с широкой полосой так??

    1. Это шум цифрового осциллографа. +/- 2..3 пикселяОни (цифровые) все так показывают. Можно фильтр наложить, будет получше.

  10. Здорово.
    Мысли по улучшению схемы (без напрягов):
    1. Отвязать ФНЧ от выхода ЦАП, т.к. там все равно ОУ есть — сделать активный фильтр, и он не будет забирать ток от ЦАПа просаживая его. Ничего нового припаивать не придется, просто скоммутировать те же элементы в другом порядке)
    2. Сделать номиналы сопротивлений побольше — раз в 10 и хорошо отфильтровать питание мк.

    1. 1) Гхм, кстати да. Надо попробовать.
      2) Ну чо было из того и спаял, по хорошему то да, килов по 10 надо бы ставить.

  11. В оконцовке какой ОУ выбрали? Может просто транзистор всандалить , а в коллектор ему поставить переменное сопротивление — будет амплитуду выходного сигнала регулировать.
    К примеру КТ3102 — Fmax около 300мГц, а с буковкой Е коэф.передачи(Н21) — 400….1000.Чем не ВЧ усилок?

    1. Да пока никакого. Думаю CA3140 вмандить. Хотя лучше бы Rail2Rail найти, но чето не подбирается такой. Тут дело не в коэффициенте передачи и частоте, а в входном сопротивлении. У транза оно невелико.

  12. старшие биты разбить, (вместо 3х битов будет 8 , 2^3=8), добавить остальные 13, коммутировать быстрой логикой. При точности резисторов 0,001 будет 16бит монотонность, при 0,01 13бит. Можно слушать музыку. Зазвучит на порядок лучше старых сигма-дельт, будете удивлены.

    ШИМ использовать для Ц\А преобразования не нужно, для это есть подуляция плотностью импульсов, тогда частоты большие не нужны… кол-во тактов = количество уровней. Пребразования, моя любимая тема ! Где бы взять деталей… =(((

      1. Есть идея на сдвиговых регистрах сэмулировать нормальный DAC. Конечно, можно и купить R2-R DAC, но он стоит 2к и денег пока нет

  13. теперь собираем параллельный АЦП :)
    тобищ быстрее встроеного

    а если серьозно.. то возможно? и будет ли он быстрее? и насколько
    подозреваю схемку где будет групами сопр-стабилитрон

    1. Конечно возможно. Есть параллельный АЦП. И работает он очень быстро. но жутко горомоздкий. Там стоят операционные усилители с разным опорным напряжением, их выход шифруется и подается в МК. Чем больше нужно разрядов тем больше усилителей. Т.е. на 8 разрядов надо 256 усилителей и один невьебенный шифратор.

  14. Дядьки, на приведенной в статье схеме величина самого нижнего сопротивления (LSB) должна быть не R а 2R, т.е. для номиналов схемы 2k вместо 1k. Надо бы подправить. В противном случае заметно ухудшится монотонность ЦАП-а. Причём на фотографии платы «лестница» сопротивлений набрана верно.

  15. Кстати, DI HALT. Если совместить эту инфу с инфой из твоей статьи про сдвиговый регистр (http://easyelectronics.ru/sdvigovyj-registr.html), то можно наворотить сколько угодно ЦАПов на тех же 74HC164 и потратить всего 4 ноги контроллера… или я что-то не так понял?

  16. Народ , чет я не совсем догнал .
    Что надо в порт выводить значение от 0 до 255 и все , или всеткаи надо както хитро дергать ножками?

      1. Конечно круто. Я когда первый раз прочитал эту статью ( тогда еще только собирал свою отладочную плату , хотя и щяс нахожусь на уровне «люблю машини но еще путю педали «) думал что отложу повторение этой идейки до тех пор пока по умнею , а как оказалось все очень просто. Какраз сейчас болею, делать нечего , буду пробовать. :)

  17. Это я так понимаю, можно добавить сюда транзисторы, и изменять опорное напряжение в широких пределах, ограничиваясь только транзисторами?..)
    Если я прав, может подсказать, как тут стоило бы подключать транзисторы, а то я слишком начинающий в этих делах..)

    1. Можно, если полученная точность устроит. Только транзисторы это громоздко. Примени лучше что нибудь вроде буффера 74HC244

        1. Да нет, я имел в виду использовать не внутренние транзисторы МК, которые большие напряжения не выдерживают, а внешние транзисторы, стоящие еще до сопротивлений…
          А можно немного подробнее объяснить, как 74HC244 включается и какие она напряжения через себя может пропускать?..)

            1. То есть микросхема работает как набор ключей, замыкающих напряжение до 15 вольт от 5 вольт микроконтроллера?…
              А бывает нечто подобное но для напряжения вольт эдак на 30-50?..)

                1. Спасибо..)
                  Хотя в принципе, это наверное избыточно будет, я думаю, достоточно будет просто операционник запитать напряжением выше и использовать как усилитель, а не как просто буфер..)

  18. А ведь с помощью этой штуки можно, наверное, получить модулированный сигнал. Например, у нас есть два регистра — текущие значения 2х синусоид. Изменятся они будут с разными временными интервалами. Ну и каждый раз мы эти значения перемножаем и выдаем в порт. Это будет АМ. Для угловой модуляции, я так думаю, нужно менять время выдачи в порт значения второго регистра в зависимости от значения первого. Интересно, какую максимальную мастоту можно получить при этом?

    1. Даа. Тут можно поизваращаться. Например «сиськи» промодулировать «рок концертом». В связи с этим у меня назрела мысль: используя некоторые элементарые преобразования (можно это даже назвать ЦОС), каковы шансы реализовать на меге некое подобие музыкального сопроцессора?

  19. Посмотрите, пожалуйста.
    Берем операционный усилитель, прямой вход гвоздями на 2,5 Вольта, на инвертирующий кроме обратки вешаем «весовой» резистор, второй конец этого резистора таскаем пином от МК:
    НОЛЬ троичный- физически выводим лог.0(ток через «весовой» резистор= минус I)
    ЕДИНИЦА троичная- физически переводим в Hi-Z (ток через «весовой» резистор= 0)
    ДВА троичная- физически выводим лог.1(ток через «весовой» резистор= плюс I)
    Ток через «весовой» резистор I равен 2,5 Вольта делить на номинал этого резистора.
    Матрица будет R-3R-9R-27R…
    http://kazus.ru/forums/showthread.php?t=14543&page=4

  20. а если прицепить это ЦАП к 9 ногам МК, на выходе поставить ВС547, то можно ли с помощью этого задавать нужное напряжение от 0 до 5 с точностью 0,01В.
    ОУ не могу поставить так как у меня остался только LM358 а он врятле подойдет.

    Спасибо!

  21. Я тут посчитал посидел. Оказывается максимальное напряжение не 5 вольт, а 5*(1-2^(-N)), где N — разрядность матрицы.

    Для 3х бит:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    U2	U1	U0	Рассчётное	Действительное
    0	0	0	0	0
    0	0	5	0,714285714	0,625
    0	5	0	1,428571429	1,25
    0	5	5	2,142857143	1,875
    5	0	0	2,857142857	2,5
    5	0	5	3,571428571	3,125
    5	5	0	4,285714286	3,75
    5	5	5	5,000000000	4,375
     
    Погрешность:
     
    бит	погрешность
    3	14,28571429
    4	6,666666667
    5	3,225806452
    6	1,587301587
    7	0,787401575
    8	0,392156863

    Может я конечно накосячил в рассчётах, но должно быть так.

  22. Доброго времени суток, LM324 конечно ничего.. но! Рекомендую AD8601 8602 8604 зверь, не пожалеете, а насчет резестивной матрицы, работает как часы, особенно как на фото с 1% резисторами.

  23. C этим сложнее, в Харькове спокойно в магазине по цене от 14 до 16 грн за шт.(AD8602 и AD8604) , как у Вас не знаю…

  24. В Спб AD8602DRZ в ИТИС стоит 25.80)

    А не посоветуете ОУ в корпусе DIP8? Просто собираю такой ЦАП на макетке)

  25. Здравствуйте, ребят я извеняюсь, а данной программки смоделированной в протеусе нету случайно? мне просто очень нужно, а я сам не разбираюсь в контроллерах и программировании

      1. ну кому просто, а таким как я не очень просто)))я ж не знаю как там что подключать, как залить программу, как скомпилировать, у меня другой профиль, просто эту лабу надо в универе здать, очень надо, если несложно помоги смоделировать)))

  26. Ребята а как вы делаете таблицы: синусов, пилы, «сисек». Каким то софтом пользуетесь, или по функциям вычисляете значение

    1. Я в маткаде делал. Задал вычисление значения в нужном диапазоне, да снормализовал в диапазон от 0 до 255

  27. Я тут задумал сделать музыкальную штучку на МК с этим АЦП. ЛМ324 шипит, да и тихий он — в общем, не подходит совсем (хотя я может что-то неправильно сделал…)
    Если использовать ОУ + транзистор, инвертирующий вход на выход транзистора, выход ОУ — на его базу, то мне кажется что шипеть оно не перестанет. И у операционных усилителей недостаток что они используют не весь диапазон напряжения…

    По этому решил ставить звуковой усилитель(хотя я ещё не разобрался хороший у них диапазон напряжения, или нет), выбрал ЛМ386 — он дешёвый, но в нем очень сомневаюсь.

    Может кто-то уже использовал этот ацп для звукоизвлечения? Поделитесь тогда какой усилитель можно поставить.

    ЗЫ мне нужен обязательно дешёвый, по тому что я хочу около 10 устройств сделать

  28. эм…
    созрел такой вопрос — сколько тактов уходит на то, чтоб изменить значение на одном из портов контроллера?

    1. Около двух. Т.е. за один такт ты выведешь значение из регистра в порт. Через такт оно устаканится на выходе. Примерно так. Не считая подготовку самого значения к выводу. Считаем, что он уже в нужном регистре готов.

      1. тогда получаетсяя что МК должен взять значение из массива, положить его в регитр, потом с регистра в порт, и только потом порт выведет его на лапки?
        итог 8 тактов, или я где-то провтыкал?

        1. Ну если подробно то даже так:
          выборка адреса из массива 1..2 такта в зависимости от того надо считать адрес или нет
          Выборка из массива в регистр 1 такт
          Выброс из регистра в порт 2-3 такта в зависимости от емкости проводов.
          Переход на начало цикла 1-2 такта. Точно не помню.

            1. 1
              2
              3
              4
              5
              6
              7
              8
              9
              10
              11
              12
              13
              
              Loop:		WDR			; Сброс собаки
              		LDPA	Sinus		; Макрос, загружающий в Z адрес таблицы с синусом
               
              		CLR	OSRG		; Сбрасываем рабочий регистр
              		ADD	ZL,Counter	; Вычисляем смещение по адресу таблицы
              		ADC	ZH,OSRG
              		LPM	OSRG,Z		; Грузим в рабочий регистр из таблицы байт
              		OUT	PORTD,OSRG	; Выдаем его в порт
               
              		INC	Counter		; Увеличиваем счетчик
              		STS	SinCT,Counter	; Сохраняем значение счетчика в память
               
              		RJMP	Loop		; Переход

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

  29. Вот бы то же самое только на С, моему респекту не было бы предела, а то асм для меня пока темный темный дремучий лес

      1. Это то я как раз и понял, как рассчитать приращение шага для разных частот??
        У меня такой же прожект, только нифига не получается, до 2000 Гц еще так сяк, а выше полная фигня… не влезаю по приращению, переполнение переменной add_value.. вот собственно кусочек кода (приращения от частоты) посмотреть как люди делают на С..

  30. Неа, так тоже плохо. Вблизи ноля скачки напряжения больше, чем на 1. Надо длину таблицы увеличить до 800. Можно использовать формулу excel «=INT(1*(255*0,5*(SIN(2*PI()*(A1-0,9)/800)+1)+0,5))» где в клетках A1-А800 будут цифры 1-800.

    1. barok2 о каких скачках ты рассказываешь? В моей таблице, да и у DI тоже, значения синусов в окрестности 0 меняются плавно всего лишь на 1. Хотя это и не критерий, как мне видеться!

        1. Так ты не туда смотришь))) Смотреть же надо на значения в окрестности нуля, а там они меняются плавно всего лишь на единичку.
          Первое значение в таблице зависит от начальной фазы функции синус, а она есть периодическая, поэтому начальная фаза может быть любой, все равно начало и конец таблицы замкнуться.
          Чтобы таблица начиналась и заканчивалась нулевыми значениями, изменил начальную фазу, вот пример:
          http://easyelectronics.ru/repository.php?act=view&id=107

          1. Я говорю про ноль в смысле синуса от -1 до +1. В таблице от 0 до 255 это значения в области 127. Здесь синус меняется быстрее всего. В указаной тобой таблице изменения такие: 124,128, 131, т.е. скачки в 3-4. Максимальная плавность функции должна быть 1, иначе можно не 8 битную ЦАП ставить, а меньше.

  31. Ты имеешь виду перекристаллизацию, но тогда значительно уменьшится полоса сигнала и соответственен максимальная частота синусоиды, которую ты сможешь получить на выходе этого ЦАП-а.

    1. Есть еще погрешность, связанная с сопротивлением подтягивающих транзисторов к земле и к напряжению питания. Они не учтены. А могут к тому-ж быть разными. И еще сама схема R2R она не очень точная, порядка 0,5%(вроде).

  32. Землю через резистор 200ом соеденил с пинами (мерял на 0-7). На пины програмно подал 1. Померял напряжение питания и на резисторе. Посчитал. отличная воспроизводимость!

    1. У DI кстати, резистор на 2К идущий к конденсатору вроде как лишний. Если считать, что входное сопротивление усилителя подсаживает напряжение на выходе резисторной цепочки на 1/256(одну ступень). То надо чтобы оно было больше 6к*256=1,5мом. (6к-сопротивление столба резисторов до земли). т.е. этот резистор не увеличивает (сколько надо)выходное сопротивление цап.

      1. Похоже я ошибся с ручными расчетами. Proteus говорит, цепочка R2R работает точно. А использование любой нагрузки, даже с очень маленьким сопротивлением, просто уменьшает выходной сигнал, не нарушая его линейности.

  33. Если делать по такой схеме «лабораторный» звуковой генератор, какого уровня искажений можно ожидать? Как это понять/посчитать?
    Если пытаться рулить амплитудой сигнала программно, пересчитывая таблицу, будет теряться разрешение. На малых амплитудах будет совсем кисло, да?
    Кстати, рулить всё равно надо — хотя бы для компенсации завала характеристики ФНЧ, чтобы не делать фильтр мегасложным.
    Или для регулировки использовать «цифровой потенциометр»?

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha