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

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Сообщение astrgan »

Как с помощью шим сформировать синусоиду на мк?
В смысле как расчитать таблицу синуса и как задать частоту?
Зарание спасибо отвечающим.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Вот описание принципа: http://www.telesys-ru.1gb.ru/electronic ... hp?do=p035
Только вместо ЦАП выводить в ШИМ.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 17070
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Сообщение astrgan »

А полученные значения для таблицы придется округлять?
И как узнать частоту получившейся синусойды?
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Сообщение astrgan »

Про частоту разобрался.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 17070
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

astrgan писал(а):А полученные значения для таблицы придется округлять?
К примеру, я мог позволить себе работать с числами формата float, поэтому брал значения синуса as is, как куркулятор насчитал. Если float не допускается, то полученные значения придётся обработать - разумеется, заранее, не самим МК.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Например, вот таблица синуса (четверть периода) для генерации его с помощью 12-разрядного ШИМ. В таблице 129 точек, так как между точками я использовал линейную интерполяцию.
Вложения
Sin128.zip
(494 байт) 457 скачиваний
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

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

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

где k - номер элемента, а Nf - количество точек на период, т.е., частота дискретизации. Для остальных случаев аналогично. Ну и домножить фазу по вкусу для получения нужной частоты.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Чт фев 03, 2011 17:36:53
Откуда: Новосибирск

Сообщение Aenigma »

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

Если размещать значения со знаком, тогда удобнее старший бит традиционно использовать как знаковый, т.е. значения синуса (со знаком) умножаются на 127, округляются до целых и размещаются в 8-и битах. Сдвигать значения не нужно. В остальном - как описал YS.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 17070
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Чт фев 03, 2011 17:36:53
Откуда: Новосибирск

Сообщение Aenigma »

mickbell писал(а):зависит от разрядности того устройства, в которое этот код будет выдан
Я бы сказал, не от разрядности устройства, а от разрядности структуры данных, выбранной автором для хранения значений.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Почему? Именно от разредности ЦАП. Если разрядность структуры данных выбрана другой, то это ошибка. Или нет?
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Чт фев 03, 2011 17:36:53
Откуда: Новосибирск

Сообщение Aenigma »

Число с плавающей точкой можно разместить в ячейке, состоящей из любого количества бит, которое хочет программист. Нужно только соответствующим образом привести число к заданному целочисленному диапазону. Другое дело, что на практике часто удобно выбирать размер ячейки, кратный 8.
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

float в контроллерах? Не, не слышал. :wink:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Чт фев 03, 2011 17:36:53
Откуда: Новосибирск

Сообщение Aenigma »

YS, Вы по поводу моих сообщений? Я говорю о целочисленной аппроксимации float.
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Фиксированная точка, в смысле? Это можно. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 17070
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

YS писал(а):float в контроллерах? Не, не слышал. :wink:
Я применял. Если контроллер успевает - почему бы и нет? Мне надо было амплитуду регулировать, приходилось взятое из таблицы умножать на число, полученное по интерфейсу. Можно было и в целых числах... зачем?
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Чт фев 03, 2011 17:36:53
Откуда: Новосибирск

Сообщение Aenigma »

YS писал(а):Фиксированная точка, в смысле? Это можно.
Если недостаточно чисел с фиксированной точкой, можно сэмулировать float, отведя, например, 1 байт под экспоненциальную часть числа. Правда, для работы с float (фактически, эмуляции математического сопроцессора) нужно иметь достаточную квалификацию... Или набор готовых подпрограмм. :)
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

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

А так, короткий ответ на последний вопрос - чтобы не раздувать объем программы. Хотя, вдруг в Вашем МК был аппаратный FPU? Я-то не знаю. Да и сейчас могут прийти люди, которые начнут кричать, что, дескать, память-то ныне дешевая и процы быстрые, так что писать можно все, вплоть до очевидного быдлокода. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Чт фев 03, 2011 17:36:53
Откуда: Новосибирск

Сообщение Aenigma »

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

Вернуться в «Теория»