Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить

Как с помощью шим сформировать синусоиду на мк?

Пн апр 30, 2012 18:32:09

Как с помощью шим сформировать синусоиду на мк?
В смысле как расчитать таблицу синуса и как задать частоту?
Зарание спасибо отвечающим.

Re: Как с помощью шим сформировать синусоиду на мк?

Пн апр 30, 2012 19:11:03

Вот описание принципа: http://www.telesys-ru.1gb.ru/electronic ... hp?do=p035
Только вместо ЦАП выводить в ШИМ.

Re: Как с помощью шим сформировать синусоиду на мк?

Пн апр 30, 2012 19:31:24

astrgan писал(а):Как с помощью шим сформировать синусоиду на мк?
В смысле как расчитать таблицу синуса

Калькулятором, в экселе, програмку написать на любом ЯВУ - как удобнее. Потом перенести полученные значения в сишный текст программы для МК. Я считал на калькуляторе, когда надо было. Через один градус - трудов не так много. Достаточно обсчитать четверть периода - это предыдущий оратор уже объяснил.

Re: Как с помощью шим сформировать синусоиду на мк?

Пн апр 30, 2012 19:54:22

А полученные значения для таблицы придется округлять?
И как узнать частоту получившейся синусойды?

Re: Как с помощью шим сформировать синусоиду на мк?

Вт май 01, 2012 04:32:02

Про частоту разобрался.

Re: Как с помощью шим сформировать синусоиду на мк?

Вт май 01, 2012 10:20:20

astrgan писал(а):А полученные значения для таблицы придется округлять?

К примеру, я мог позволить себе работать с числами формата float, поэтому брал значения синуса as is, как куркулятор насчитал. Если float не допускается, то полученные значения придётся обработать - разумеется, заранее, не самим МК.

Re: Как с помощью шим сформировать синусоиду на мк?

Вт май 01, 2012 10:37:56

Например, вот таблица синуса (четверть периода) для генерации его с помощью 12-разрядного ШИМ. В таблице 129 точек, так как между точками я использовал линейную интерполяцию.
Вложения
Sin128.zip
(494 байт) Скачиваний: 438

Re: Как с помощью шим сформировать синусоиду на мк?

Пт май 04, 2012 19:29:01

А полученные значения для таблицы придется округлять?


Загонять в нужный диапазон. Например, для восьми бит максимальное значение 255. Таким образом, значения надо сместить на 128 вверх и растянуть на 127:

x[k]=128+(uint8_t)(127*sin(((2*π)/Nf)*k))

где k - номер элемента, а Nf - количество точек на период, т.е., частота дискретизации. Для остальных случаев аналогично. Ну и домножить фазу по вкусу для получения нужной частоты.

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 05:59:25

Как уже говорилось выше, достаточно создать таблицу от 0° до 90°. Тогда для размещения в одном байте значения синуса в первой четверти просто умножаются на 255 и округляются до целых.

Если размещать значения со знаком, тогда удобнее старший бит традиционно использовать как знаковый, т.е. значения синуса (со знаком) умножаются на 127, округляются до целых и размещаются в 8-и битах. Сдвигать значения не нужно. В остальном - как описал YS.

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 08:04:10

На что именно умножать: на 255, 1023, 4095, ещё на что-то - зависит от разрядности того устройства, в которое этот код будет выдан. В данном случае, счётчика-таймера, который будет формировать сигнал ШИМ.

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 09:38:20

mickbell писал(а):зависит от разрядности того устройства, в которое этот код будет выдан
Я бы сказал, не от разрядности устройства, а от разрядности структуры данных, выбранной автором для хранения значений.

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 09:50:26

Почему? Именно от разредности ЦАП. Если разрядность структуры данных выбрана другой, то это ошибка. Или нет?

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 14:04:46

Число с плавающей точкой можно разместить в ячейке, состоящей из любого количества бит, которое хочет программист. Нужно только соответствующим образом привести число к заданному целочисленному диапазону. Другое дело, что на практике часто удобно выбирать размер ячейки, кратный 8.

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 14:31:17

float в контроллерах? Не, не слышал. :wink:

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 14:41:20

YS, Вы по поводу моих сообщений? Я говорю о целочисленной аппроксимации float.

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 14:43:45

Фиксированная точка, в смысле? Это можно. :)

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 15:00:42

YS писал(а):float в контроллерах? Не, не слышал. :wink:

Я применял. Если контроллер успевает - почему бы и нет? Мне надо было амплитуду регулировать, приходилось взятое из таблицы умножать на число, полученное по интерфейсу. Можно было и в целых числах... зачем?

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 15:15:06

YS писал(а):Фиксированная точка, в смысле? Это можно.
Если недостаточно чисел с фиксированной точкой, можно сэмулировать float, отведя, например, 1 байт под экспоненциальную часть числа. Правда, для работы с float (фактически, эмуляции математического сопроцессора) нужно иметь достаточную квалификацию... Или набор готовых подпрограмм. :)

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 16:24:54

Если контроллер успевает - почему бы и нет? ... Можно было и в целых числах... зачем?


Смотря что за контроллер, смотря что за задача, смотря сколько памяти. На самом деле тут много всяких соображений. Но начинающим я всегда даю простой совет - не использовать float. Дорастут - там можно будет дискутировать. :)

А так, короткий ответ на последний вопрос - чтобы не раздувать объем программы. Хотя, вдруг в Вашем МК был аппаратный FPU? Я-то не знаю. Да и сейчас могут прийти люди, которые начнут кричать, что, дескать, память-то ныне дешевая и процы быстрые, так что писать можно все, вплоть до очевидного быдлокода. :)

Re: Как с помощью шим сформировать синусоиду на мк?

Вс май 06, 2012 17:29:48

Леонид Иванович писал(а):Почему? Именно от разредности ЦАП. Если разрядность структуры данных выбрана другой, то это ошибка. Или нет?
Что касается выбора разрядности, то Вы правы. Если, например, используется 12-разрядный ШИМ, как в Вашем примере, то на вход этого ШИМ нужно подавать 12-разрядные числа. А я говорил про общий случай представления вещественных чисел: разрядность структуры данных определяет программист в зависимости от цели (например, от требуемой точности аппроксимации), а множитель при переводе зависит от выбранной разрядности.
Ответить