1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404

ЦАП R-2R. Генерация треугольника

17.03.2014, 21:04. Показов 5386. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Собрал из резисторов 5 разрядный ЦАП к ATmega8, среда AVR Studio 6.
Вывожу треугольник следующим кодом
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(void)
{
    DDRD=0b11111111;
    PORTD=0b00000000;
    int count=31;
    while(1)
    {
        for(int i=0;i<31;i++)
        {
            count--;
            PORTD=count;
            
        }
       for(int i=0;i<31;i++)
       {
           count++;
           PORTD=count;
       }
       
       count=0;
    }
}
Однако на осциллографе сразу выявляется проблема - треугольник заваливается влево( не получается равнобедренным, левая сторона меньше длинной), и заваливает его именно цикл с декрементом. То есть операция вычитания происходит быстрее, и от этого время возрастания сигнала от нуля до максимума меньше чем убывание. В чем проблема? Компилятор так оптимизирует или что?
Решение проблемы какое? Написание кода на ассемблере?
Заранее спасибо за ответы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.03.2014, 21:04
Ответы с готовыми решениями:

генерация синусоидального сигнала через ЦАП STM32F407VG
есть код, написанный в cosox: #include &quot;stdyo.h&quot; #include &quot;stdlib.h&quot; #include &quot;stm32f4xx.h&quot; #include &quot;stm32f4xx_gpio.h&quot; ...

Даны длины a,b и с сторон некоторого треугольника. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника
Как сделать с процедурой

Даны длины a,b и с сторон некоторого треугольника. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника.
Даны длины a,b и с сторон некоторого треугольника. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника....

40
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.03.2014, 16:20
Студворк — интернет-сервис помощи студентам
...не знаю, в тему ли... у АВРок на tiny85 и tiny26 есть ШИМы на высокой частоте 64МГц. Это удобно, учитывая условно не такую высокую частоту самого процессора. В таком случае можно обойтись и без внешнего ЦАПа, и добиться сравнительно высокой производительности.
ЗЫ: а ввобще, я тоже за ЦАП+ SPI + DMA.

Добавлено через 5 минут
да, и еще двухполярный выход можно получить разделительным кондером. В большинстве случаев этого хватает.
Цитата Сообщение от Витальич Посмотреть сообщение
TM32 получал 10 разрядный синус с частотой 1мГц
не соврали таки ST-шники . В ДШ написано "DAC 1MS/s, Guaranteed by characterization, not tested in production."
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 16:24  [ТС]
Сразу хочу сказать, что это генератор сигналов делаю как обучающий проект + планирую использовать при изучении работы разных электронных схем, в том числе полупроводниковых (опять же обучение), а денег на реальный генератор не хватило, только на осциллограф наскреб.. Какая вообще максимальная частота может понадобиться для таких целей?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.03.2014, 16:49
georgfour, я бы сделал такой проект на DDS + контроллер с PLL (тот же STM32).
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 16:57  [ТС]
Понятно, а где можно найти исчерпывающую информацию по DDS генераторам?
Заранее спасибо
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
24.03.2014, 17:06
Достаточно DDS и контроля с верхнего уровня по USB.

https://www.cyberforum.ru/post4466189.html
Генератор синуса с цифровым управлением
https://www.cyberforum.ru/micr... 38707.html
Генератор произвольных частот на МК
https://www.cyberforum.ru/post5892305.html
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 19:22  [ТС]
Написал тут код для генерации синуса 5 разрядным цапом, получилось конечно ступенчато, однако максимальная частота поднялась до 16Мгц. Но тут появилась странная проблема
:
Assembler
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
.list
 
 .def temp=r17
 .def counter=r18
 .def cap_output=r19
 
 .cseg
 ;____________________Начальная установка__________________
 .org 0x000
 rjmp RESET
 ;____________________Вектор внешнего прерывания________________
 .org 0x00E
 rjmp TIMER1COMPAlbl
 
 ;____________________Обработчик прерывания___________________
 TIMER1COMPAlbl:
 
 ldi ZL, low(data*2)    
 ldi  ZH, high(data*2)
 clr temp
 add ZL, counter
 adc ZH, temp
 lpm temp, Z
 inc counter
 
 ;______________________Отправка данных в ЦАП____________________
 ldi cap_output, 0b00011111
 out PORTC, cap_output
 out PORTA, temp
 ldi cap_output, 0xFF
 out PORTC, cap_output
 ;_____________________Подготовка к следующей итерации___________
 ldi temp, 0b00000000
 out TCNT1H, temp
 out TCNT1L, temp
 cpi counter, 32
 breq work
 return:
 reti
 
 work:
 clr counter
 rjmp return
 
 ;__________________Инициализация стека и глобальное разрешение прерываний_____________
 RESET:
 ldi r16, high(RAMEND) 
 out SPH, r16 
 ldi r16, low(RAMEND)
 out SPL, r16
 sei
 
 ;__________________Инициализация портов________________
 ldi temp, 0x00
 out DDRD, temp
 ldi temp, 0xFF
 out PORTD, temp
 ldi temp, 0b00010000
 out TIMSK, temp
 ldi temp, 0b00000001
 out TCCR1B, temp
 ldi temp, 0b00000001
 out OCR1AL, temp
 ldi temp, 0x00
 out OCR1AH, temp
 
 ;__________________Начальная инициализация значений рабочих регистров для генерации сигналов____________
 ldi temp, 0xFF
 ldi cap_output, 0x00
 out DDRA, temp
 out DDRC, temp
 out PORTC, temp
 ldi temp, 0b00000000
 
 ;_________________Основной цикл_________________________
 m:
 
 rjmp m
 
 ;_____________________Таблица для синуса__________________
 data: 
    .db 127, 152, 175, 197, 217, 232
    .db 245, 251, 255, 251, 245, 232
    .db 217, 197, 175, 152, 127, 103
    .db 79, 57, 38, 22, 10, 3, 0, 3
    .db 10, 22 , 36, 57 , 79, 103, 127
Если записать в регистр OCR1A не 0b00000001, а 0b00000010, то синус перестает генерироваться.
В чем может быть проблема?

Добавлено через 8 минут
Килогерц конечно, опечатался =)
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
24.03.2014, 19:30
Цитата Сообщение от georgfour Посмотреть сообщение
Мне надо сделать генератор сигналов, у которого по нажатию кнопки нужно менять тип сигнала, а если опрашивать состояние кнопки во время генерации сигналов, то сами сигналы искажаются
самое простое и быстрое это табличный метод
набиваешь несколько таблиц и меняешь просто индекс

вот например твой треугольник и меандр (размерность лучше взять 256 и счетчик unsigned char)

C++
1
2
3
code unsigned char table[2][16]=
{{0,32,64,96,128,160,192,224,255,224,192,160,128,96,64,32},
{0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255}};
а сам индекс считать и опрос кнопки в прерываниях по таймеру
примерно так
C++
1
2
3
4
5
6
static unsigned char i=0;
PORTB=table[mode][i];// или на какой порт там выводим
 
//здесь опрос кнопки
i++;
i%=16;// если размер таблицы 256 то это лишнее
Добавлено через 2 минуты
пока писал тут уже и решение подоспело
вопрос какую максимальную частоту нужно получить и какой ЦАП?
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 19:38  [ТС]
ЦАП AD7302BNZ, параллельный.
Частота - какую смогу, как я уже выше написал, нужен для обучения электронике, то бишь для анализа схем, желательно конечно как мне кажется хотя бы до 20кГц дотянуть, но не получается
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
24.03.2014, 19:48
Цитата Сообщение от georgfour Посмотреть сообщение
ЦАП AD7302BNZ, параллельный.
по точнее
на него просто уровни подаются или есть и управляющие сигналы?
дай даташит

Цитата Сообщение от georgfour Посмотреть сообщение
бы до 20кГц дотянуть, но не получается
уменьшать количество выборок, уменьшать время таймера, брать другую микросхему у СТМки внутренняя частота 72 мГц
но быстродействия ЦАП хватит?
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 19:53  [ТС]
Управляющие сигналы есть, вот даташит

Я пока только с AVR работаю, у меня нет ни средств отладки, ни знаний для ARM.
Еще есть проблема у у меня из поста выше, повторюсь:
Если записать в регистр OCR1A не 0b00000001, а 0b00000010, то синус перестает генерироваться.

Спасибо за помощь.
Вложения
Тип файла: pdf DOC000143671.pdf (241.6 Кб, 5 просмотров)
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
24.03.2014, 20:02
частота Атмеги 16 мгц частота сигнала 20 кГц
16000/20 = 800
32 выборки 800/32=25 задержка таймера пределитель 1
теоретически должно хватить
но только табличный метод (никаких расчетов) и одна кнопка

Добавлено через 6 минут
Цитата Сообщение от georgfour Посмотреть сообщение
ATmega8,
Цитата Сообщение от georgfour Посмотреть сообщение
out DDRA, temp
а разве у восьмерки есть порт А?

Добавлено через 1 минуту
Цитата Сообщение от georgfour Посмотреть сообщение
Если записать в регистр OCR1A не 0b00000001, а 0b00000010, то синус перестает генерироваться.
никогда не работал с этим регистром, надо инструкции почитать
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 20:04  [ТС]
Нет, это сначала была восьмерка, но потом 32 поставил.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
24.03.2014, 20:10
Цитата Сообщение от georgfour Посмотреть сообщение
ет, это сначала была восьмерка, но потом 32 поставил.
в смысле?
конкретно камень укажи
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
24.03.2014, 20:13  [ТС]
Atmega32
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
24.03.2014, 20:16
Цитата Сообщение от georgfour Посмотреть сообщение
Atmega32
тогда я пас
никогда не работал с такими камнями, а без практики трудно давать какие либо советы
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
25.03.2014, 19:25  [ТС]
Кто-нибудь может помочь с этой проблемой?
Причем синус не выводится даже если менять значения в верхнем байте регистра.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.03.2014, 23:11
georgfour, отсутствие полного кода, полное отсутствие комментариев в коде, ничего не значащие какие-то выставленные битиках в регистрах настройки. Как вам помогать? Берите ДШ и вычитывайте. Иначе дополните ваш код недостающими элементами.
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
26.03.2014, 00:03  [ТС]
Assembler
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
.list
 
 .def temp=r17 ;основной рабочий регистр
 .def counter=r18 ;счетчик для генерации синуса
 .def cap_output=r19 ;регистр для установки битов управления ЦАП
 
 .cseg
 ;____________________Начальная установка__________________
 .org 0x000
 rjmp RESET
 ;____________________Вектор внешнего прерывания________________
 .org 0x00E
 rjmp TIMER1COMPAlbl
 
 ;____________________Обработчик прерывания от 16-ти разрядного таймера по совпадению___________________
 TIMER1COMPAlbl:
 
 ldi ZL, low(data*2) ; получение первого байта адреса первого байта в таблице синуса
 ldi  ZH, high(data*2) ;получение второго байта адреса  первого байта в таблице синуса
 clr temp
 add ZL, counter ;запись текущего байта в таблице
 adc ZH, temp
 lpm temp, Z ;получение текущего байта из таблицы синуса
 inc counter
 
 ;______________________Отправка данных в ЦАП____________________
 ldi cap_output, 0b00011111 ;установка в ноль командных битов ЦАПа
 out PORTC, cap_output ;выдача управляющих битов в порт
 out PORTA, temp ;выдача цифрового значения текущего уровня напряжения из таблицы синуса в порт
 ldi cap_output, 0xFF 
 out PORTC, cap_output ;снятие управляющих битов
 
 ;_____________________Подготовка к следующей итерации___________
 ldi temp, 0x00 
 out TCNT1H, temp ;обнуление счетчика 16 разрядного таймера
 out TCNT1L, temp
 cpi counter, 32 ; условие на обнуление счетчика - таблица синуса содержит 32 значения
 breq work 
 return:
 reti
 
 work: 
 clr counter ;в случае достижения конца таблицы (значение счетчика 32) - обнуление счетчика
 rjmp return
 ;________________Завершение обработчика прерывания_________________
 
 ;__________________Инициализация стека и глобальное разрешение прерываний_____________
 RESET:
 ldi r16, high(RAMEND) 
 out SPH, r16 
 ldi r16, low(RAMEND)
 out SPL, r16
 sei
 
 ;__________________Инициализация портов________________
 ldi temp, 0b00010000
 out TIMSK, temp ; разрешение прерываний по совпадению значений регистра 16 разрядного счетчика со значением в регистре OCR1A
 ldi temp, 0b00000001
 out TCCR1B, temp ;установка пределителя в значение 1:1
 ldi temp, 0b00000010
 out OCR1AL, temp ; установка значения, при достижении счетчиком которого происходит прерывание (младший байт)
 ldi temp, 0x00
 out OCR1AH, temp; установка значения, при достижении счетчиком которого происходит прерывание (старший байт)
 ldi temp, 0xFF
 ldi cap_output, 0x00
 out DDRA, temp ; порт выдачи значения уровня напряжения на ЦАП
 out DDRC, temp ; порт выдачи управляющих сигналов на ЦАП
 out PORTC, temp 
 ldi temp, 0b00000000
 
 ;_________________Основной цикл_________________________
 m:
 
 rjmp m
 
 ;_____________________Таблица для синуса__________________
 data: 
    .db 127, 152, 175, 197, 217, 232
    .db 245, 251, 255, 251, 245, 232
    .db 217, 197, 175, 152, 127, 103
    .db 79, 57, 38, 22, 10, 3, 0, 3
    .db 10, 22 , 36, 57 , 79, 103, 127
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
26.03.2014, 01:27
В коде я не нашел очевидных причин, почему не работает счетчик при изменении значения регистров, но проверить нужно два момента:
а) Если вы таки хотите оставить работу счетчика в обычном режиме, тогда нужно посмотреть стр.89 ДШ и исправить обращение к 16-битным регистрам счетчика. Это особенно актуально на его высоких частотах, без предделителя.
б) Все-таки будет правильнее перевести счетчик в режим CTC top OCR1A (выставив TCCR1B=0x09). Единственное, я точно не помню уже, в этом случае надо обрабатывать прерывание по переполнению (соотв. изменения в TIMSK и таблице прерываний), а не по сравнению с OCR1A. Но тогда сброс счетчика в прерывании делать не нужно, и работать будет правильнее и еще быстрее.

Добавлено через 17 минут
упс... сам не досмотрелся . Со сбросом счетчика у вас все ОК.

Добавлено через 3 минуты
...структуру
Assembler
1
2
3
4
5
6
7
8
cpi counter, 32 ; условие на обнуление счетчика - таблица синуса содержит 32 значения
 breq work 
 return:
 reti
 
 work: 
 clr counter ;в случае достижения конца таблицы (значение счетчика 32) - обнуление счетчика
 rjmp return
предлагаю заменить на:
Assembler
1
2
3
sbrc counter, 5
clr counter
reti
Добавлено через 3 минуты
... и счетчики в регистрах в АСМе (как у вас counter) быстрее будут работать, если считать в обратном порядке.
То есть сначала
ldi counter, 32

а потом в прерывании
Assembler
1
2
3
4
dec counter
brne exit
ldi counter, START_VALUE; в вашем случае START_VALUE=32
exit: reti
Это все экономит дражайшие такты
1
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
27.03.2014, 16:24  [ТС]
Спасибо, буду пробовать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2014, 16:24

Даны длины сторон треугольника a, b, c. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника
Даны длины сторон треугольника a, b, c. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника. Для...

ЦАП
как формируется пороговое напряжение на выходе ЦАП?

Внешний ЦАП
Доброе время суток!Недавно приобрел внешний ЦАП kguss q2 breeze audio.Звук очень нравится,однако периодически возникают милисекундные...

Делаю ЦАП
Чип PCM2705 Уже вторая попытка собрать по этой схеме: ...

ЦАП STM32
Хочу с помощью ЦАП вывести синус 50Гц с минимумом искажений. Думал всё просто - таблица на 4096 значений и в путь. Но наткнулся на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru