|
ШИМ Сortex-M0, реализация синусоиды |
|
|
|
Sep 28 2014, 00:20
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 14-07-14
Пользователь №: 82 243

|
Всем добрый день!
Я начинающий чел в этом деле. Хочу попробовать сделать, чтобы лампочка изменяла яркость как функция синус. Т.е мне надо сделать шим. Я разобрался как например работает шим, но теперь не могу понять, как реализовать это програмно. Т.е. пусть я делаю счетчик. Дальше что? Т.е мне надо считать тики (пример: в течении 75% от периода подавать на ножку логическую единицу.) и в течении определенного кол-ва тиков подавать на ножку 1? Но возникает вопрос: Т.е к примеру я хочу получить синусоиду. В начале я должен подать 1 в течении 3 тиков, потом в течении 20 и т.д. (цифры конечно рандомные. надо все говорить относительно периода сигнала). Потом меняю полярность (есть в hal drivers функция). Но как сделать чтобы с каждым периодом менялась скважность сигнала?
не могу понять как это реализовать программно. Буду рад любым объяснениям блок схемам и программам.
З.Ы. Может кто скинет кодик с пояснением, что как почему и зачем. А то что-то мне тяжело это дается.
|
|
|
|
|
Sep 28 2014, 10:20
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да все тут понятно надо синус на шиме генерить.
задача разбивается на 2.
1. - это ШИМ. Обычно надо взять таймер (это железный модуль в проце) и запустить его в режиме ШИМ. И выдать его выход на ножку. Это работает так. Таймер - счетчик который считает с заданной частотой для него задается максимальное число счета (до максимума таймера или до заданного числа), досчитав до него таймер сбрасывает в ноль и считает заново. Это число определяет период ШИМ. Вторым задает скважность - это число регистра сравнения, от 0 до максимума таймера. И на железном уровне задается что когда таймер от 0 до этого числа он на ножку выдает 1, а за пределами этого числа 0 (или наоборот, как вам больше нравиться). Дальше вам остается задавать скважность, и выходной сигнал генериться автоматически на железном уровне.
2. - это сам синус. Тут уже много творческих реализаций имеется. Наиболее часто делают так. Берут второй таймер который генерит прерывания с заданным периодом. Каждое прерывание внутри вычисляют очередную точку синуса (х координату точки) по формуле W*t+fi, то есть на самом деле есть sum=fi в начальный момент и каждое прерывание считают sum = sum + W*dt. где dt - период таймера. А дальше по полученному значению вычисляют синус либо по таблице, либо приближенно каким то рядом аля фурье и так дальее... И вот это вычисленное значение пихаете в ваш первый ШИМ, который и выдаст его на ружу.
Как то так. Период таймера выбирает в зависимости от мощности проца, как быстро он сможет считать новые точки.
|
|
|
|
|
Sep 28 2014, 14:35
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Sep 28 2014, 16:22)  Да? А при чём тут лампочка? Вот зачем лампочке синус, объясните мне, раз уж вам всё понятно. Если чисто для визуализации, то лучше не синус, а треугольник - визуально будет лучше восприниматься. Ну и по-хорошему - нужно учесть зависимость яркости лампочки от приложенного напряжения. PS: Хотя конечно сначала ТСу нужно научиться программировать. Именно программировать, без привязки к ембеддед. А это значит - научиться формализовывать задачу, разбивать её на этапы и т.п. Что как видно он не умеет. А иначе, да - всё это бессмыслица  Цитата(Golikov A. @ Sep 28 2014, 16:20)  Как то так. Период таймера выбирает в зависимости от мощности проца, как быстро он сможет считать новые точки. Странное однако умозаключение... Т.е. (следуя вашей логике) - если ТС возьмёт Cortex на 100МГц, то ему нужно выбирать частоту генерации новых отсчётов синуса == 1МГц? Ведь потянет-же! Вообще-то следует действовать как раз наоборот - CPU выбирать под задачу, а не задачу подгонять под CPU. Если задача - динамическое управление яркостью лампочки, то первым делом выбирается период обновления ШИМ. А он выбирается исходя из инертности глаза. Думаю - достаточно будет 100Гц максимум. Далее определяется необходимая дискретность установки яркости (сколько уровней яркости нужно). Это значение (уменьшенное на 1) умножается на 100Гц и получается частота ШИМ.
|
|
|
|
|
Sep 28 2014, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Столько слов и все по делу.... И лампочка не такая, и задача не та... ведь все написано не чтобы помочь, а чтобы себя показать... вот к примеру Цитата Цитата как быстро он сможет считать новые точки. Можно ничего не считать , а сделать таблицу из "четвертинки" это замечательное предложение, а как узнать какую точку в какой момент времени выбрать из таблицы? А так чтобы синус был заданной частоты? Цитата Странное однако умозаключение... wacko.gif Т.е. (следуя вашей логике) - если ТС возьмёт Cortex на 100МГц, то ему нужно выбирать частоту генерации новых отсчётов синуса == 1МГц? Ведь потянет-же! Да именно так, если потянет то 1 МГц, потянет 10, то лучше взять 10. Потому что частота с которой вы находите новое значение которое надо задать на ШИМе никак ни связана с частотой шима и частотой финально получаемого синуса. И чем она выше, тем лучше и плавнее будет синус, он будет представлен большим количеством точек, и не важно что многие из низ будут повторятся... Строго говоря есть ограничения на обновления ШИМ, и излишняя частота может быть просто не нужна, но хуже от нее точно не будет... А также эта частота ограничивает синус по частоте сверху, и вот тут как раз чем выше тем лучше... Цитата Вообще-то следует действовать как раз наоборот - CPU выбирать под задачу, а не задачу подгонять под CPU. Тоже не верно, иногда есть в распоряжении ЦПУ и задача, и хотят поглядеть что будет. Делают на максимум, получилось хорошо, нет можно думать. Если рассуждать здраво вряд ли в наше время развития техники кто-то серьезно будет делать мигалку диодом по синусу на контроллере  Это какие-то образовательные тесты, потому все ресурсы проца могут пойти на эту бедную лампочку) и пойдут ресурсы того проца что есть в наличии. Цитата Если чисто для визуализации, то лучше не синус, а треугольник - визуально будет лучше восприниматься. rolleyes.gif Ну и по-хорошему - нужно учесть зависимость яркости лампочки от приложенного напряжения. а вот тут кстати не факт. Треугольник - линейная функция, а яркость воспринимается экспоненциально. Синус тоже не очень подходит, но тут хотя бы математика какая-то, а линейка - это счетчик с коэффициентом и все... не интересно А вот зависимости яркость от напряжения мало интересна, ведь напряжение то всегда одно, вместо лампы будет скорее всего диод, и гореть будет на максимум, разница яркости будет достигаться разницей времени горения и не горения... Даже в случае лампы накаливания вряд ли она достаточно зафилтрует шим чтобы сделать его напряжением зависящим от скважности...
|
|
|
|
|
Sep 28 2014, 16:44
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 14-07-14
Пользователь №: 82 243

|
Цитата(jcxz @ Sep 28 2014, 14:35)  PS: Хотя конечно сначала ТСу нужно научиться программировать. Именно программировать, без привязки к ембеддед. А это значит - научиться формализовывать задачу, разбивать её на этапы и т.п. Что как видно он не умеет. А иначе, да - всё это бессмыслица  Что подразумевается под прогать? Одно дело прогать софт (этим я занимался), другое дело прогать МК! Здесь другая логика(и если начинать с 0 долго доходит). Это не лаба и не курсач. Просто пытаюсь освоить МК. Конечно можно забить на все и после учебы спать, а можно брать и пытаться хоть что-то сделать на МК! Спасибо за дельные комменты!
|
|
|
|
|
Sep 28 2014, 17:00
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Golikov A. @ Sep 28 2014, 21:30)  ведь все написано не чтобы помочь, а чтобы себя показать... Надеюсь Вы это и к себе тоже относите? Цитата(Golikov A. @ Sep 28 2014, 21:30)  а вот тут кстати не факт. Треугольник - линейная функция, а яркость воспринимается экспоненциально. Вы бы сначала попробовали, а потом теоретизировали Над этим "а яркость воспринимается экспоненциально." долго думал, но так и не понял - как это? Цитата(Golikov A. @ Sep 28 2014, 21:30)  А вот зависимости яркость от напряжения мало интересна, ведь напряжение то всегда одно, Не знаю, где в сообщении ТС Вы углядели диод, но даже в этом случае, даже если с выхода ШИМ ток идёт прямо на диод (лампу) (без RC-цепочки), то в моём замечании "напряжение" просто нужно заменить на "средний протекающий ток". И всё равно тогда это замечание остаётся в силе. Как бы так сказать... Средний протекающий ток (или отношение времени горения к времени негорения) и субъективные зрительные ощущения от создаваемого света не прямопропорциональны. Или сказать по-другому: Если взять K==выводимому в ШИМ значению (в %: 0%-все биты в состоянии "погашено"; 100% - все биты в сост. "горят"); то увеличение K в области минимальных значений (близких к 0) будет гораздо более заметно глазу, чем в области максимальных (близких к 100) значений. Соответственно как середина яркости глазом будет восприниматься уровень скажем K==30% (условно) на ШИМ, а не K==50%. Цитата(shtunder @ Sep 28 2014, 22:44)  Что подразумевается под прогать? Одно дело прогать софт (этим я занимался), другое дело прогать МК! Здесь другая логика(и если начинать с 0 долго доходит).  До того как начинать "прогать", сначала надо формализовать задачу, разбить её на этапы, прикинуть алгоритм. Это должно занимать 80% времени. И тогда "другого" в программировании МК совсем мало, по отношеннию к любому другому программированию. А у Вас как видно по первому сообщению "смешались в кучу люди, кони...". Касаемо разбивки на этапы, что-то подобное Вам уже попытался сделать ув. Golikov A. в своём первом сообщении.
|
|
|
|
|
Sep 28 2014, 18:09
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Надеюсь Вы это и к себе тоже относите? конечно, иначе зачем мы тут  ответ на вопрос дан в моем первом сообщении) Цитата Вы бы сначала попробовали, а потом теоретизировали laughing.gif Над этим "а яркость воспринимается экспоненциально." долго думал, но так и не понял - как это? я не теоретизирую, у меня диплом есть по данному вопросу) Забавно что вы тоже про это знаете, только упускаете причину, и работаете только со следствием. Цитата Средний протекающий ток (или отношение времени горения к времени негорения) и субъективные зрительные ощущения от создаваемого света не прямопропорциональны. Причиной этому что наши органы чувств воспринимаю все не линейно, а степенно. То есть если что-то свети, и вы распределите яркость так что вам будет казаться между точками яркость увеличивается на одинаковую дельту, то по факту окажется что она увеличивалась в одинаковое число раз. Это позволяет нам охватывать огромный диапазон воздействий при этом различать даже малейшие возмущения около нуля. И так у нас со всем с глазами, ушами и прочим. Потому децибелы так прижились в звуке. Конечно есть и нелинейность свечения от входного среднего тока, но она значительно меньше влияния вызываемого устройством наших органов восприятия... Цитата Просто пытаюсь освоить МК. Конечно можно забить на все и после учебы спать, а можно брать и пытаться хоть что-то сделать на МК! Может я так хорошо понял ваш вопрос, потому что так же начинал. Так что не обращайте ни на кого внимание и двигайтесь вперед, будут вопросы задавайте. хотя вашу тему переместили.... а в этот раздел я редко заглядываю
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|