Двухканальный ШИМ без таймеров.
Здравствуйте. Возникла задача создать двухканальный ШИМ с разными периодами каналов и меняющейся скважностью. Возможно ли это сделать на МК без таймеров? Пока интересует именно без таймеров
- Реклама
Еще бы желательно о требованиях к ШИМу рассказать: частота, разрядность...
Период первого канала 1с, второго - .5с. Максимальное знкчение скважности первого канала .7, второго - .8. Минимальное знкчение скважности первого - .2, второго - .3. Еще есть начальное смещение второго канала относительно первогг на .25с
Для генерации временных интервалов вместо таймера можно использовать свободные интерфейсы SPI, UART, I2C. По сути теже самые счётчики только менее удобный вариант. Раньше, когда и того не было, считали такты процессора.
Да, я про это знаю. Тут дело в другом. Можно ли сделать это на тупых циклах? Подозреваю, что нет.
- Реклама
Что мешает на циклах? Сиди считай, в нужный момент дрыгай ногами. Нужно знать частоту МК и команды с их временем исполнения. Эта тайна раскрыта в даташите .
Осталось Вам раскрыть секрет отказа от таймеров.FireProoF писал(а):Да, я про это знаю. Тут дело в другом. Можно ли сделать это на тупых циклах? Подозреваю, что нет.
Судя по ТЗ - что-то связанное с получением образования.. Прям как из методы переписано.
Если не ошибаюсь, то этим во всю пользовались во времена спектрумов и прочих самодельных компьютеров даже для получения звуков и музыки.
Целесообразность действительно под вопросом. Даже примитивные PIC10F имеют хотябы 1 таймер.
Целесообразность действительно под вопросом. Даже примитивные PIC10F имеют хотябы 1 таймер.
Да, действительно пора раскрыть карты)
По лабе надо на aduc812 смоделировать двухканальный ШИМ с параметрами (см. выше). Предварительно его надо смоделировать на ПК без применения многопоточности (вот отсюда начались проблемы), а потом уже на МК. Причем про таймеры в методичке ничего не сказано. Я, конечно аам понимаю, что без них никак, но вдруг я чего-то тут не знаю)
По лабе надо на aduc812 смоделировать двухканальный ШИМ с параметрами (см. выше). Предварительно его надо смоделировать на ПК без применения многопоточности (вот отсюда начались проблемы), а потом уже на МК. Причем про таймеры в методичке ничего не сказано. Я, конечно аам понимаю, что без них никак, но вдруг я чего-то тут не знаю)
С такими параметрами (канала 1с, второго - .5с -черепахоходный) никаких проблем хош энное число "ШИМОВ" программно натворить.

Обещали мне уже возможность поднятия такого ШИМ, но этим то всё и ограничивалось.
А на то и студентам задачки дают, чтоб они СВОИМИ МОЗГАМИ ШЕВЕЛИЛИ.
Сделай на таймере опроный интервал меньше наименьшего требуемого раза в два и по прерыванию от этого маркера крути программные циклы по каждому из каналов ШИМ.

Сделай на таймере опроный интервал меньше наименьшего требуемого раза в два и по прерыванию от этого маркера крути программные циклы по каждому из каналов ШИМ.
Еще раз призываю вновь отвечающих прочитать сообщения в теме.
С таймером и так всё понятно. Можно без него?
Нужен ДВУХканальный ШИМ.
С таймером и так всё понятно. Можно без него?
Нужен ДВУХканальный ШИМ.
- Сообщения: 59
- Зарегистрирован: Чт сен 12, 2013 17:10:37
Можно и на циклах сделать. В цикле 1-го канала проверяем состояние второго канала: не обнулился? - ничего не делаем; обнулился? - выполняем соответствующие действия (меняем состояние пинов порта для формирования ШИМ во 2-м канале). Аналогично - для цикла 2-го канала, там проверяем состояние 1-го канала. Для контроля состояния каналов лучше всего использовать флаги, например: 1 = счётчик обнулился, 0 = пока ещё не обнулился. Установка флагов состояния происходит в телах циклов, как только цикл закончил счёт. Установленный флаг нужно сбрасывать только после выполнения действий по формированию сигнала ШИМ.
Таким образом, с помощью подобного механизма флагов, мы можем отслеживать состояние другого канала и выполнять действия по формированию сигнала в этом другом канале.
Менять скважность можно кнопками, повешенными на RB7...RB4. В прерывании по изменении состояния этих линий можно изменять числовые значения длительности импульсов ШИМ (разумеется, не забывая про подавление дребезга контактов кнопок). А в телах вышеупомянутых циклов мы используем эти - изменяемые в прерываниях - значения.
Таким образом, с помощью подобного механизма флагов, мы можем отслеживать состояние другого канала и выполнять действия по формированию сигнала в этом другом канале.
Менять скважность можно кнопками, повешенными на RB7...RB4. В прерывании по изменении состояния этих линий можно изменять числовые значения длительности импульсов ШИМ (разумеется, не забывая про подавление дребезга контактов кнопок). А в телах вышеупомянутых циклов мы используем эти - изменяемые в прерываниях - значения.
Вам же уже сказали - можно. Даже описали как. В чём проблема ?FireProoF писал(а):Можно без него?
А менять то как собрались ?FireProoF писал(а):и меняющейся скважностью
И что будет, если Вы попытаетесь ещё что-нибудь добавить в программу ? У Вас же все времена, периоды, скважности, ... уплывут хз куда.
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
"...Предварительно его надо смоделировать на ПК без применения многопоточности (вот отсюда начались проблемы), а потом уже на МК..."
А если не использовать сами прерывания от таймера а в главном цикле просто проверять флаг таймера, то это вроде не должно относится к многопоточности? Ну а дальше как рассказывал BOB51.
А если не использовать сами прерывания от таймера а в главном цикле просто проверять флаг таймера, то это вроде не должно относится к многопоточности? Ну а дальше как рассказывал BOB51.
Ну и что?FireProoF писал(а): Нужен ДВУХканальный ШИМ.
ШИМ очень медленный, поэтому не составит труда найти наименьшее общее кратное (НОК) к ОБОИМ тактовым частотам ШИМов.
И с этим НОК построить цикл формирования ДВУХ ШИМов одновременно.
FireProoF, лови:
PS: таким макаром можно хоть 10 шим каналов наворотить, только один минус чем больше каналов тем меньше частота шимов получается,
да кстати с тебя пиво
Код: Выделить всё
int i1,i2,s1,s2; // s-скважность от 0 до k
const int k1=20, k2=30; // периоды каналов
void main()
{
i1=0;
i2=0;
PORTA.B0=0;
PORTA.B1=0;
while(1)
{
if(i1<k1) i1++;
else i1=0;
if(i1<s1)PORTA.B0=0;
else PORTA.B0=1;
// тоже самое для второго
if(i2<k2) i2++;
else i2=0;
if(i2<s2)PORTA.B1=0;
else PORTA.B1=1;
}
}да кстати с тебя пиво


