Как сгенерировать ШИМ с задержкой?
Я реализую изолированный повышающий преобразователь. Я должен сгенерировать сигнал ШИМ для переключателей, приведенных на рисунке ниже. Мне трудно понять шаблон. Схема ШИМ выглядит следующим образом: вначале все четыре переключателя включены, затем переключатели 1, 4 остаются включенными, а переключатели 2, 3 замкнуты, как показано на рисунке. Пожалуйста, помогите мне начать работу над этой проблемой. Как я могу сгенерировать этот тип ШИМ? Затем в более позднее время ШИМ должен быть сдвинут на некоторое время рабочего цикла для Q2, Q3. Я сбит с толку. Как мне добавить задержку или сместить ШИМ? Я использую микроконтроллер pic18f45k22, а инструментом для программирования является MikroC.
1 ответ
Я не знаю, критична ли длительность времени выключения, но предположим, что соотношение метка / пробел составляет 1:3, как показано на вашей временной диаграмме,
Q1,Q4 1011101110111
Q2,Q3 1110111011101
Сконфигурируйте таймер автономного режима так, чтобы он прерывался на четверть необходимого периода цикла. При каждом прерывании он выполняет одну из четырех последовательных задач, таких как этот псевдокод
void timer_interrupt() {
static int operation = 0; // is initialised only once
clear_timer_status(); // acknowledge the interrupt
switch (operation) {
case 0: Q14_off();
break;
case 1: Q14_on();
break;
case 2: Q23_off();
break;
case 3: Q23_on();
break;
}
operation = (operation + 1) % 4; // advance to next operation
}
Если вы хотите меньшее отношение метки / пространства, вы можете сделать это аналогичным образом. Предположим, вы хотите соотношение 1:7, представленное
Q1,Q4 101111111011111110
Q2,Q3 111110111111101111
теперь в этом случае частота таймера должна составлять одну восьмую цикла, но не каждое прерывание будет иметь действие
void timer_interrupt() {
static int operation = 0; // is initialised only once
clear_timer_status(); // acknowledge the interrupt
switch (operation) {
case 0: Q14_off();
break;
case 1: Q14_on();
break;
case 4: Q23_off();
break;
case 5: Q23_on();
break;
}
operation = (operation + 1) % 8; // advance to next operation
}
Есть и другие способы сделать это: например, массив выходных битовых комбинаций, которые вы смотрите как pattern[operation]