Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее
Пн апр 30, 2012 18:32:09
Как с помощью шим сформировать синусоиду на мк?
В смысле как расчитать таблицу синуса и как задать частоту?
Зарание спасибо отвечающим.
Пн апр 30, 2012 19:11:03
Вот описание принципа:
http://www.telesys-ru.1gb.ru/electronic ... hp?do=p035Только вместо ЦАП выводить в ШИМ.
Пн апр 30, 2012 19:31:24
astrgan писал(а):Как с помощью шим сформировать синусоиду на мк?
В смысле как расчитать таблицу синуса
Калькулятором, в экселе, програмку написать на любом ЯВУ - как удобнее. Потом перенести полученные значения в сишный текст программы для МК. Я считал на калькуляторе, когда надо было. Через один градус - трудов не так много. Достаточно обсчитать четверть периода - это предыдущий оратор уже объяснил.
Пн апр 30, 2012 19:54:22
А полученные значения для таблицы придется округлять?
И как узнать частоту получившейся синусойды?
Вт май 01, 2012 04:32:02
Про частоту разобрался.
Вт май 01, 2012 10:20:20
astrgan писал(а):А полученные значения для таблицы придется округлять?
К примеру, я мог позволить себе работать с числами формата float, поэтому брал значения синуса as is, как куркулятор насчитал. Если float не допускается, то полученные значения придётся обработать - разумеется, заранее, не самим МК.
Вт май 01, 2012 10:37:56
Например, вот таблица синуса (четверть периода) для генерации его с помощью 12-разрядного ШИМ. В таблице 129 точек, так как между точками я использовал линейную интерполяцию.
- Вложения
-
- Sin128.zip
- (494 байт) Скачиваний: 438
Пт май 04, 2012 19:29:01
А полученные значения для таблицы придется округлять?
Загонять в нужный диапазон. Например, для восьми бит максимальное значение 255. Таким образом, значения надо сместить на 128 вверх и растянуть на 127:
x[k]=128+(uint8_t)(127*sin(((2*π)/Nf)*k))
где k - номер элемента, а Nf - количество точек на период, т.е., частота дискретизации. Для остальных случаев аналогично. Ну и домножить фазу по вкусу для получения нужной частоты.
Вс май 06, 2012 05:59:25
Как уже говорилось выше, достаточно создать таблицу от 0° до 90°. Тогда для размещения в одном байте значения синуса в первой четверти просто умножаются на 255 и округляются до целых.
Если размещать значения со знаком, тогда удобнее старший бит традиционно использовать как знаковый, т.е. значения синуса (со знаком) умножаются на 127, округляются до целых и размещаются в 8-и битах. Сдвигать значения не нужно. В остальном - как описал YS.
Вс май 06, 2012 08:04:10
На что именно умножать: на 255, 1023, 4095, ещё на что-то - зависит от разрядности того устройства, в которое этот код будет выдан. В данном случае, счётчика-таймера, который будет формировать сигнал ШИМ.
Вс май 06, 2012 09:38:20
mickbell писал(а):зависит от разрядности того устройства, в которое этот код будет выдан
Я бы сказал, не от разрядности устройства, а от разрядности структуры данных, выбранной автором для хранения значений.
Вс май 06, 2012 09:50:26
Почему? Именно от разредности ЦАП. Если разрядность структуры данных выбрана другой, то это ошибка. Или нет?
Вс май 06, 2012 14:04:46
Число с плавающей точкой можно разместить в ячейке, состоящей из любого количества бит, которое хочет программист. Нужно только соответствующим образом привести число к заданному целочисленному диапазону. Другое дело, что на практике часто удобно выбирать размер ячейки, кратный 8.
Вс май 06, 2012 14:31:17
float в контроллерах? Не, не слышал.
Вс май 06, 2012 14:41:20
YS, Вы по поводу моих сообщений? Я говорю о целочисленной аппроксимации float.
Вс май 06, 2012 14:43:45
Фиксированная точка, в смысле? Это можно.
Вс май 06, 2012 15:00:42
YS писал(а):float в контроллерах? Не, не слышал.
Я применял. Если контроллер успевает - почему бы и нет? Мне надо было амплитуду регулировать, приходилось взятое из таблицы умножать на число, полученное по интерфейсу. Можно было и в целых числах... зачем?
Вс май 06, 2012 15:15:06
YS писал(а):Фиксированная точка, в смысле? Это можно.
Если недостаточно чисел с фиксированной точкой, можно сэмулировать float, отведя, например, 1 байт под экспоненциальную часть числа. Правда, для работы с float (фактически, эмуляции математического сопроцессора) нужно иметь достаточную квалификацию... Или набор готовых подпрограмм.
Вс май 06, 2012 16:24:54
Если контроллер успевает - почему бы и нет? ... Можно было и в целых числах... зачем?
Смотря что за контроллер, смотря что за задача, смотря сколько памяти. На самом деле тут много всяких соображений. Но начинающим я всегда даю простой совет - не использовать float. Дорастут - там можно будет дискутировать.
А так, короткий ответ на последний вопрос - чтобы не раздувать объем программы. Хотя, вдруг в Вашем МК был аппаратный FPU? Я-то не знаю. Да и сейчас могут прийти люди, которые начнут кричать, что, дескать, память-то ныне дешевая и процы быстрые, так что писать можно все, вплоть до очевидного быдлокода.
Вс май 06, 2012 17:29:48
Леонид Иванович писал(а):Почему? Именно от разредности ЦАП. Если разрядность структуры данных выбрана другой, то это ошибка. Или нет?
Что касается выбора разрядности, то Вы правы. Если, например, используется 12-разрядный ШИМ, как в Вашем примере, то на вход этого ШИМ нужно подавать 12-разрядные числа. А я говорил про общий случай представления вещественных чисел: разрядность структуры данных определяет программист в зависимости от цели (например, от требуемой точности аппроксимации), а множитель при переводе зависит от выбранной разрядности.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.