Частота ШИМ изменяется, когда я генерирую ШИМ на CCP1 и CCP2 одновременно в PIC18F46K22.

Когда я генерирую ШИМ только на CCP1, я могу получить ШИМ 50 Гц с частотой коммутации 10 кГц. Когда я включаю ШИМ на CCP2 для другого ШИМ, частота обоих ШИМ меняется. Но если я генерирую его на любом из выходов, он работает нормально. Я пытаюсь создать 2 SPWM с фазовым сдвигом 90 градусов, для sin и cos, как на частоте переключения 50 Гц, так и на частоте 10 кГц.

   void main(void)
{
    ANSELD=0X00;
    ANSELC=0X00;
    PORTD = 0;
    TRISD = 0;
    TMR2 = 0;

    PR2 = 199;   // PWM period = (PR2+1) * prescaler * Tcy
    CCPR1L = 0;
    CCPR2L = 0;
    TRISC = 0; //0b11111011;     // Make pin 17 (RC1/CCP2) an output
    T2CON = 0b00000100;     // Enable TMR2 with prescaler = 1
    CCP1CON = 0b00001100;   // Enable PWM on CCP1
    CCP2CON = 0b00001100;
    PIR1.TMR2IF = 0;
    T2CON.TMR2ON = 1;
    j = i+50;

    while(1)
    {
            PIR1.TMR2IF = 0;

            while( PIR1.TMR2IF ==0);

            CCPR1L = 0.99*sin_table[i];
            CCPR2L = 0.99*sin_table[j];

             i = i+2;
             j = j+2;

             if(i==100)
             {
              i=0;
             }

             if(j==100)
             {
              j=0;
             }

    }
}

person Ken Adams    schedule 11.04.2018    source источник


Ответы (1)


Проблема заключается в совместном использовании таймера 2. На странице руководства 181) три действия происходят, когда таймер равен регистру PRx. Они есть:

  1. TMRx очищается
  2. Вывод CCPx установлен.
  3. Рабочий цикл ШИМ фиксируется от CCPRxL до CCPRxH.

Поскольку TMRx (TMR2 в вашем случае) очищается, это сбрасывает период обоих выходов. Есть и другие небольшие проблемы, например, вы специально не записывали в регистр «CCPTMRSx», который назначает, какой таймер использовать, и я предполагаю, что вы удалили запись в PR1, чтобы проверить только второй выход, но вам нужно записать в оба PR1. и PR2 для установки периодов.

Решение должно состоять в том, чтобы назначить TMR2 на CCP1 и TMR4 на CCP2, если вы хотите по-настоящему независимые ШИМ.

person Joe Thomas    schedule 11.04.2018
comment
Я тоже это пробовал. Использование TMR2 и TMR4 также вызывает небольшое изменение частоты, и в этом случае также нарушается разность фаз. - person Ken Adams; 11.04.2018
comment
у вас есть полный список кодов с включенными ШИМ, которые вы можете опубликовать? - person Joe Thomas; 12.04.2018
comment
CCPTMRS0 и CCPTMRS1 по умолчанию установлены на все нули, что связывает таймер 2 с обоими ШИМ. Обратитесь к странице 201 руководства для порядка битов, но без установки этого регистра вы не полностью назначили таймер 4 на PWM2, он все еще использует таймер 2. - person Joe Thomas; 12.04.2018
comment
Не могли бы вы предложить, где я должен добавить эту вещь в код? Кроме того, вы говорите, что я должен добавить следующую команду: CCPTMRS0 = 110100; - person Ken Adams; 12.04.2018
comment
добавить CCPTMRS0 = 10001000; сразу после инициализации ccp2con это должно исправить - person Joe Thomas; 13.04.2018
comment
Проблема все еще существует. Фазовый сдвиг по-прежнему не составляет 90 градусов, а также изменяется частота при генерации обоих ШИМ. - person Ken Adams; 13.04.2018
comment
ОБНОВЛЕНИЕ: я исправил проблему фазового сдвига, но другая проблема осталась. Также мне нужно изменить амплитуду и частоту одновременно, чтобы соотношение v/f оставалось прежним. Любые идеи о том, как изменить частоту, например, 5 Гц, 10 Гц, ......, 50 Гц. - person Ken Adams; 13.04.2018
comment
Ладно, кажется, я вижу, что происходит. Когда вы говорите частоту обоих изменений, я предполагаю, что они становятся медленнее, верно? Проблема, скорее всего, в том, что код выполняется слишком долго, и вы, скорее всего, получаете повторяющиеся рабочие циклы (поскольку регистры все еще содержат старые точки срабатывания. Проще говоря, 10 кГц ШИМ имеет период 100 мкс. вы пытаетесь найти значение, умножьте его на 0,99, а затем дважды отрегулируйте счетчик. Удалите умножение и посмотрите, стабилизируются ли частоты. Что касается изменения частоты SPW, для этого потребуется несколько таблиц sin, по одной для каждого Гц - person Joe Thomas; 13.04.2018
comment
Удалил 0,99, и это, кажется, работает, но мне нужно умножить значения поиска в конечном итоге, потому что мне нужна линейно возрастающая амплитуда, которая начинается с 0 и достигает 5 В (амплитуда синусоиды) через определенное время. Проблема возникает, когда я умножаю переменную с плавающей запятой. Есть ли способ преодолеть эту проблему? - person Ken Adams; 15.04.2018
comment
Что ж, первое, что нужно сделать, это установить на запасном цифровом выводе (выходе) высокий уровень, когда один из таймеров переполняется, а затем установить на этом выводе низкий уровень в конце оператора if. Это позволит вам точно определить, сколько времени занимает одна процедура таймера. Сделайте это с умножением и без него. У вас есть только 100 us для игры (10 кГц), поэтому я не уверен, что вы можете позволить себе умножение с плавающей запятой. Единственное что приходит в голову решить это расставить таймеры, щас они переполняются одновременно. Инициируйте первый, когда он составляет 50% от значения счетчика, инициируйте второй, чтобы поразить их - person Joe Thomas; 15.04.2018