Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/27: Рейтинг темы: голосов - 27, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404

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

17.03.2014, 21:04. Показов 5377. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru