Корректный по фазе и частоте режим PWM Arduino Mega 2560

Я написал код для генерации правильного по фазе и частоте ШИМ-сигнала 1 кГц от Arduino mega 2560 с использованием таймера 4. Когда я пробую код в быстром режиме ШИМ, он работает идеально. Но правильный режим фазы не дал ожидаемого результата. Что не так с моим кодом?

unsigned int b=7999;
void setup() {
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);

TCCR4A=0;
TCCR4B=0;
//Timer 1 1kHz mode 8: phase and frequency correct pwm oc1a non inverting

TCCR4A=(1<<COM4A1)|(0<<COM4A0)|(0<<WGM41) ;//| (0<<WGM40)
TCCR4B=(1<<WGM43)|(0<<WGM42);//
ICR4=b;
OCR4A=int(b*1/5);
TCCR4B|=(1<<CS10);
TIMSK4 |=(1<<OCIE4A);
}

void loop() {
  } 

ISR(TIMER_COMPA_vect){

  }   

Выходные данные кода для различных рабочих циклов приведены ниже Рабочий цикл:0,2 (OCR4A=b/5)

Рабочий цикл:0,2 (OCR4A=b/2)

, 👍1

Обсуждение

см. Диаграммы синхронизации шим в таблице данных, @Juraj

Не могли бы вы объяснить, что случилось, @Vivek Vijayan

в корректном по фазе ШИМ счетчик отсчитывает вверх, а затем вниз, и поэтому он совпадает с регистром сравнения дважды за один период. первый во время обратного отсчета второй матч во время обратного отсчета. Вывод меняет состояние на обоих совпадениях, @Juraj

Это то, что мне нужно. Но из формы волны ясно, что штифт срабатывает при подсчете вниз и сразу же сбрасывается как глюк, @Vivek Vijayan


1 ответ


2

Вы написали:

TIMSK4 |= (1<<OCIE4A);

и затем никогда не определял ISR(TIMER4_COMPA_vect). Как только вы получаете сопоставление, вы получаете неправильное прерывание, которое по умолчанию сбрасывает вашу программу и снова перезапускается с вектора сброса.

,

Когда я добавил процедуру обслуживания прерываний (ISR(TIMER4_COMPA_vect)), форма выходного сигнала действует точно так же, как быстрый ШИМ. Он не обеспечивает правильную фазу волны, @Vivek Vijayan

@VivekVijayan: Вы получаете ожидаемую частоту? Если да, то как вы можете сказать, что это неверная фаза?, @Edgar Bonet

@Edger Bonet: Я получаю ожидаемую частоту. Но когда я наблюдаю форму волны, все волны с разным рабочим циклом начинаются с одной и той же точки. Я считаю, что в фазокорректном режиме ШИМ контакты OCnA или OCnB устанавливаются во время подсчета. Таким образом, я мог бы ожидать разных начальных точек(во времени) для волн с разными рабочими циклами, @Vivek Vijayan

@VivekVijayan: Вы бы не получили 1 кГц в быстром режиме ШИМ. Re “_different starting points (in time)_”: Какова ваша временная привязка для определения начальных точек? Вы пользуетесь осциллографом? Если да, то как вы настроили его триггер?, @Edgar Bonet

Я мало что знаю о КРО. Я использую электронный модуль под названием Expeyes, который в основном действует как DSO. Я использовал ось отсчета времени для определения точек запуска. Expeyes не имеет никакой возможности контролировать запуск. Я сгенерировал Быстрый ШИМ, используя другой код, и сравнил его с выводом вышеупомянутого кода., @Vivek Vijayan

@VivekVijayan: Ваша фазокорректная форма сигнала в порядке. Вам это кажется неправильным только потому, что вы не понимаете, как ваш DSO устанавливает свою временную ось., @Edgar Bonet

Спасибо, что уделили мне время. Я продолжаю в том же духе. Попробую несколько RC - фильтров для идентификации выходной формы сигнала., @Vivek Vijayan