Я реализую изолированный повышающий преобразователь. Мне нужно сгенерировать ШИМ-сигнал для переключателей, указанных на рисунке ниже. Мне трудно понять схему. Схема ШИМ выглядит следующим образом: вначале все четыре переключателя остаются включенными, затем переключатели 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]