Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
 Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102

MCS-51. Реализация ЦАП, который бы выводил синусоиду

08.12.2013, 11:55. Показов 8367. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поставили предо мной задачу: написать на асме под MCS-51 цифро-аналоговый преобразователь, который бы выводил синусоиду. А я даже не знаю с чего начать...
Может ли кто-нибудь подсказать с алгоритмом? Все формулы, что я находил, использовали функцию sin() - её в АСМе 8051, кажется, нет. Как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2013, 11:55
Ответы с готовыми решениями:

ActiveX, который выводил бы bmp-файл на страничку
Мне нужно срочно написать activeX для ASP, который бы работал с бмп-шкой, и выводил ее на страницу.. и все...Но сколько я не долблюсь с...

Нужно написать код, который бы выводил сердце
Нужно написать код,который бы выводил сердце на С++. Помогите пожалуйста, очень надо!

Создать страницу со скриптом, который бы средствами скрипта выводил sqrt(x)
Создать страницу со скриптом, который бы средствами скрипта выводил sqrt(x), где x – числовая переменная, которой присвоено некоторое...

30
 Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
12.12.2013, 18:01  [ТС]
Студворк — интернет-сервис помощи студентам
Попробовал реализовать идею построения синусоиды по заранее подготовленной таблице Y-значений на C#.

C#
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Sine
{
    public partial class Form1 : Form
    {
        double X, Y=127, X_old, Y_old=127, line=127;
        byte[] sinus;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {           
                for (int i = 0; X <= 255; i++, X++)
                {
sinus = new byte[256] 
{127,130,133,136,139,142,145,148,151,154,157,160,164,166,169,172,175,178,181,184,187,189,192,195, 197,200,202,205,
207,210,212,214,217,219,221,223,225,227,229,231,232,234,236,237,239,240,242,243, 244,245,246,247,248,249, 250,251,
251,252,252,253,253,253,253,
 
253,254,253,253,253,253,252,252,251, 251,250,249,249,248,247,246,245,243,242,241,239,
238,236,235,233,231,230, 228,226,224,222,220,218, 215,213,211,209,206,204,201,199,196,193,191,188,185,182,180,177,
174,171,168,165,162,159,156,153, 150,147,144,141,137,134,131,128,
 
125,122,119,116,112,109,106,103,100,97,94,91,88,
85,82,79,76, 73,71,68,65,62,60,57,54,52,49,47,44,42,40,38,35,33,31,29,27,25,23,22,20,18,17,15,14, 12,11,10,8,7,6,5,
4,4,3,2,2,1,1,0,0,0,0,0,0,
 
0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,11,13,14,16,17,19,21,22,24, 26,28,30,32,34,36,39,41,43,46,
48,51,53,56,58,61,64,66,69,72,75,78,81,84,87,89,93,96, 99,102,105,108,111,114,117,120,123,127};
 
                    Y = sinus[i];
 
                    Graphics graph = pictureBox1.CreateGraphics();
                    Pen pen_black = new Pen(Brushes.Black, 2);
                    Pen pen_red = new Pen(Brushes.Red, 1);
 
                    graph.DrawLine(pen_red, 0, (float)(pictureBox1.Size.Height - line), pictureBox1.Size.Width, (float)(pictureBox1.Size.Height - line));
                    graph.DrawLine(pen_black, (float)X_old, (float)(pictureBox1.Size.Height - Y_old), (float)X, (float)(pictureBox1.Size.Height - Y));
 
                    if (X >= pictureBox1.Size.Width)
                    {
                        pictureBox1.Image = null;
                        X = 0;
                    }
 
                    X_old = X;
                    Y_old = Y;
 
                    label1.Text = Y.ToString();
                    label2.Text = X.ToString();
                }            
        }
    }
}


Работает отлично. А вот как заставить ШИМ вырисовывать импульсами синусоиду по этим значениям - так и не понял...
0
1022 / 157 / 10
Регистрация: 16.01.2013
Сообщений: 544
12.12.2013, 18:57
Поскольку в порт можно подавать только 0 или единицу то на выходе простого интегратора на RC цепочке можно получить только положительные напряжения. Добавим к синусоиде постоянную составляющую, чтобы перенести её в область положительных значений. Эти значения и используем для управления ШИМ.
0
 Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
12.12.2013, 21:11  [ТС]
Цитата Сообщение от MaslovVG Посмотреть сообщение
Поскольку в порт можно подавать только 0 или единицу то на выходе простого интегратора на RC цепочке можно получить только положительные напряжения. Добавим к синусоиде постоянную составляющую, чтобы перенести её в область положительных значений. Эти значения и используем для управления ШИМ.
Хм... не совсем понял про постоянную составляющую. 2^8=256. 256/4=64. От 0 до 63 идет нарастание синусоиды, от 64 до 127 - спад, от 128 до 192 продолжается спад, от 193 до 255 - нарастание.
Чтобы не было отрицательных значений, я добавил к обычной формуле расчета Y-координат синусоиды 127 единиц:
Y = 127 + 127 * Math.sin(3.14 * x * 0.007843)
Я ведь правильно делаю?) Или вы не об этом?
0
194 / 154 / 23
Регистрация: 16.08.2013
Сообщений: 738
12.12.2013, 21:22
Не об этом.
0
1022 / 157 / 10
Регистрация: 16.01.2013
Сообщений: 544
12.12.2013, 21:42
Формула
Y = 127 + 127 * Math.sin(3.14 * x * 0.007843)
Для Y верна. Но для синтеза синусоиды такая дискретность по x (по времени) избыточна.
Сначала нужно определится с требованиями к синусоиде по допустимым нелинейным искажениям. По диапазону частот. Для большинства случаев на (практике) даже 16 точек на полупериод уже избыточно.
0
 Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
13.12.2013, 15:42  [ТС]
Цитата Сообщение от MaslovVG Посмотреть сообщение
Формула

Для Y верна. Но для синтеза синусоиды такая дискретность по x (по времени) избыточна.
Сначала нужно определится с требованиями к синусоиде по допустимым нелинейным искажениям. По диапазону частот. Для большинства случаев на (практике) даже 16 точек на полупериод уже избыточно.
Понял, сейчас переделаю под 16 или 24 точки

Добавлено через 1 час 0 минут
Готово, воспользовался вот такой вот формулой:
C#
1
                Y = (int)(127 + 127 * Math.Sin(3.14 * X * 0.08695652173)); // 2*(1/23) = 0.08695652173
Получил 24 точки:
127, 161, 192, 219, 239, 251, 253, 246, 230, 207, 177, 144, 109, 76, 47, 23, 7, 0, 2, 14, 33, 60, 92, 126.

Если я правильно понял, из них нужно создать таблицу, из которой потом нужно будет читать значения для управления ШИМом:
Assembler
1
2
3
4
5
6
7
8
get_data:
movc a, @A+PC
ret
 
table_of_sin:
db 127
db 161
и т.д.
Верно?
0
 Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
24.01.2014, 21:49  [ТС]
Забыл выложить результат. Исправляем. Если кто-то не понимает, что это за числа в конце и откуда они берутся - см. мою предыдущую запись, там описан процесс расчета.

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
sinewv:
mov r7, #18h;   Загрузить кол-во значений ординат(24) от 0 до 345
snloop:
mov a, r7;      Загрузить порядковый номер ординаты
acall getord;   Загрузить из таблицы соответствующее значение
mov p1, a;      Отправить значение на порт P1
nop;    
nop;            Пропустить некоторое время
djnz r7, snloop;    Повторить для всех ординат
sjmp sinewv;    Повторить цикл снова
getord:
movc a, @A+PC;  Чтение из таблицы sintab
ret;
sintab:
db 07eh;        Значение для угла 345 градусов
db 05ch;
db 03dh;
db 022h;
db 0eh;
db 02h;
db 00h;
db 07h;
db 17h;
db 02eh;
db 04ch;
db 06dh;
db 090h;
db 0b1h;
db 0cfh;
db 0e6h;
db 0f6h;
db 0fdh;
db 0fbh;
db 0efh;
db 0dbh;
db 0c0h;
db 0a1h;
db 07fh;        Значение для угла 0 градусов
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
27.01.2014, 01:20
Daemon2017, на верном пути но еще не все . Надо теперь передавать свой набор значений не в порт (P1), а в таймер, который работает в режиме ШИМ (предварительно его настроив, конечно). Или делать его самому, программно.
0
 Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
27.01.2014, 04:22  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
Daemon2017, на верном пути но еще не все . Надо теперь передавать свой набор значений не в порт (P1), а в таймер, который работает в режиме ШИМ (предварительно его настроив, конечно). Или делать его самому, программно.
Поздно) "Отлично" уже получено
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
27.01.2014, 15:41
"я мзды не беру... Мне за державу обидно" <C>
0
0 / 0 / 0
Регистрация: 02.07.2019
Сообщений: 1
02.07.2019, 21:07
Daemon2017,
У меня сейчас такое же задание , и проблема с кодом для контроллера
Не мог бы скинуть его в полном виде?


Добавлено через 41 минуту
Voland_, не подскажите может у вас есть код?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2019, 21:07

Создать метод, который бы выводил значение числа от 0 до 99 в виде слов
Создайте метод у всех числовых объектов, который бы выводил значение числа от 0 до 99 в виде слов. Например число 45 должно выводиться как...

Создать скрипт, который бы контрастировал изображение методом соляризации и выводил гистограмму изображений
Нужно создать скрипт, который бы контрастировал изображение методом соляризации по формуле: y = k*x*(xmax - x) и выводил гистограмму...

Создать командный файл, который выводил бы содержимое каталога, указанного в качестве параметра...
Помогите определить в чем ошибка бат файла:( Задание: Создать командный файл, который выводил бы содержимое каталога, указанного в...

Создать компонент, который бы при оборачивании контента в нем выводил бы его вместе с тегом sup
Как можно создать компонент на Java, который бы при оборачивании контента в нем в конечно итоге выводил бы его вместе с тегом sup. То есть,...

Создать командный файл, который выводил бы содержимое каталогов, указанных в качестве параметров командной
Создать командный файл, который выводил бы содержимое каталогов, указанных в качестве параметров командной строки в файл протокола,...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru