5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
1

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

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

Author24 — интернет-сервис помощи студентам
Поставили предо мной задачу: написать на асме под MCS-51 цифро-аналоговый преобразователь, который бы выводил синусоиду. А я даже не знаю с чего начать...
Может ли кто-нибудь подсказать с алгоритмом? Все формулы, что я находил, использовали функцию sin() - её в АСМе 8051, кажется, нет. Как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2013, 11:55
Ответы с готовыми решениями:

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

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

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

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

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

30
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
12.12.2013, 18:01  [ТС] 21
Author24 — интернет-сервис помощи студентам
Попробовал реализовать идею построения синусоиды по заранее подготовленной таблице 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();
                }            
        }
    }
}
MCS-51. Реализация ЦАП, который бы выводил синусоиду


Работает отлично. А вот как заставить ШИМ вырисовывать импульсами синусоиду по этим значениям - так и не понял...
0
1022 / 157 / 10
Регистрация: 16.01.2013
Сообщений: 544
12.12.2013, 18:57 22
Поскольку в порт можно подавать только 0 или единицу то на выходе простого интегратора на RC цепочке можно получить только положительные напряжения. Добавим к синусоиде постоянную составляющую, чтобы перенести её в область положительных значений. Эти значения и используем для управления ШИМ.
0
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
12.12.2013, 21:11  [ТС] 23
Цитата Сообщение от 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 24
Не об этом.
0
1022 / 157 / 10
Регистрация: 16.01.2013
Сообщений: 544
12.12.2013, 21:42 25
Формула
Y = 127 + 127 * Math.sin(3.14 * x * 0.007843)
Для Y верна. Но для синтеза синусоиды такая дискретность по x (по времени) избыточна.
Сначала нужно определится с требованиями к синусоиде по допустимым нелинейным искажениям. По диапазону частот. Для большинства случаев на (практике) даже 16 точек на полупериод уже избыточно.
0
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
13.12.2013, 15:42  [ТС] 26
Цитата Сообщение от 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
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
24.01.2014, 21:49  [ТС] 27
Забыл выложить результат. Исправляем. Если кто-то не понимает, что это за числа в конце и откуда они берутся - см. мою предыдущую запись, там описан процесс расчета.

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
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
27.01.2014, 01:20 28
Daemon2017, на верном пути но еще не все . Надо теперь передавать свой набор значений не в порт (P1), а в таймер, который работает в режиме ШИМ (предварительно его настроив, конечно). Или делать его самому, программно.
0
5 / 5 / 2
Регистрация: 07.01.2013
Сообщений: 102
27.01.2014, 04:22  [ТС] 29
Цитата Сообщение от Voland_ Посмотреть сообщение
Daemon2017, на верном пути но еще не все . Надо теперь передавать свой набор значений не в порт (P1), а в таймер, который работает в режиме ШИМ (предварительно его настроив, конечно). Или делать его самому, программно.
Поздно) "Отлично" уже получено
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
27.01.2014, 15:41 30
"я мзды не беру... Мне за державу обидно" <C>
0
0 / 0 / 0
Регистрация: 02.07.2019
Сообщений: 1
02.07.2019, 21:07 31
Daemon2017,
У меня сейчас такое же задание , и проблема с кодом для контроллера
Не мог бы скинуть его в полном виде?


Добавлено через 41 минуту
Voland_, не подскажите может у вас есть код?
0
02.07.2019, 21:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2019, 21:07
Помогаю со студенческими работами здесь

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

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

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

Как написать код, который при вводе чисел х, y, r выводил бы в какую область попадаем?
Доброго времени суток. Собственно, не понимаю, как написать код, который при вводе чисел х,y,r...

Можно ли сделать так, чтобы Winamp выводил музыку на колонки, а PotPlayer выводил звук из фильма на наушники?
привет у меня мать Elitegroup со встроенным звуковым движком &quot;RealtekHD&quot; - на матери присутствует...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru