Аватар для Daemon2017
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102

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

08.12.2013, 11:55. Показов 8392. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru