Таймер TCC1 для генерации ШИМ на персональной плате, построенной на SAMD21E18A.

Я пытаюсь сгенерировать сигнал ШИМ из TCC1. У меня есть персональная плата, созданная с помощью SAMD21E18A. Я хочу использовать контакт 27 PA30, в моем variant.cpp у меня есть эта строка:

{ PORTA, 30, PIO_PWM, PIN_ATTR_DIGITAL|PIO_SERCOM, No_ADC_Channel, NOT_ON_PWM, TCC1_CH0, EXTERNAL_INT_10 }, // SWCLK

Я понимаю, что могу использовать TCC1_CH0 на этом выводе с PIO_TIMER. Вот что я попробовал в конце настройки:

  pinPeripheral(27, PIO_TIMER);
  pinMode(27, OUTPUT);

  ....

  Tcc* TC = (Tcc*)GetTC(TCC1_CH0);
  TC->CTRLA.reg &= ~TCC_CTRLA_ENABLE; 
  TC->CTRLA.reg |= TCC_CTRLA_PRESCALER_DIV1; 
  TC->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM; 
  TC->PER.reg = 255; 
  TC->CC[0].reg = 128; 
  TC->CTRLA.reg |= TCC_CTRLA_ENABLE; 

Но это не работает: у меня на булавке ничего нет.

Изменить: я также пробовал это в своей настройке:

  GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(TCC1_GCLK_ID) |
                     GCLK_CLKCTRL_GEN_GCLK0 |
                     GCLK_CLKCTRL_CLKEN;
  while (GCLK->STATUS.bit.SYNCBUSY);

  Tcc* TC = (Tcc*) TCC1;
  TC->CTRLA.reg &= ~TCC_CTRLA_ENABLE; 

  TC->WAVE.reg = TCC_WAVE_WAVEGEN_NPWM;

  TC->CTRLA.reg |= TCC_CTRLA_PRESCALER_DIV1 | 
                   TCC_CTRLA_RUNSTDBY;        

  PORT->Group[PORTA].PINCFG[30].bit.PMUXEN = 1; 
  PORT->Group[PORTA].PMUX[15].reg = PORT_PMUX_PMUXE_E; 

  TC->CC[0].reg = 1000;     
  TC->CC[1].reg = 4000;  

  // Activer le timer
  TC->CTRLA.reg |= TCC_CTRLA_ENABLE;
  while (TC->SYNCBUSY.bit.ENABLE);

У меня что-то есть на осциллографе, но сигнал кажется плохим, ВЫСОКИЙ сигнал очень быстрый, а низкий сигнал очень длинный.

, 👍0


1 ответ


1

Например, настройки для ATSAMR21G18A (аналог вашего MCU), PA08 PWM:

Закрепить инициализацию:

// GPIO PA08 PWM (DO)
PORT->Group[0].PINCFG[8].reg = PORT_PINCFG_PMUXEN;
PORT->Group[0].PMUX[8/2].bit.PMUXE = PORT_PMUX_PMUXE_E_Val; // TCC0/WO[0]

Инициализация таймера:

void timer0_init()
{   
    GCLK->CLKCTRL.reg =   GCLK_CLKCTRL_ID_TCC0_TCC1 // Идентификатор выбора Gen Clk TCC0_TCC1
                | GCLK_CLKCTRL_GEN_GCLK0    // Общий тактовый генератор 0
                | GCLK_CLKCTRL_CLKEN;       // Включение часов
    
    PM->APBCSEL.reg = PM_APBCSEL_APBCDIV_DIV1;      // Делим на 1
    PM->APBCMASK.reg |= PM_APBCMASK_TCC0;           // Включение часов APB TCC0
    
    TCC0->WAVE.reg = TCC_WAVEB_WAVEGENB_NPWM;

    TCC0->PER.reg = 80; //TCC0/WO[0] ШИМ 100 кГц DT=50%
    TCC0->CC->reg = 40;
    
    TCC0->CTRLA.reg = TCC_CTRLA_CPTEN0 | TCC_CTRLA_ENABLE;  // Давать возможность
}
,

Я пробовал что-то подобное @Dimitri, но это не сработало, мои сомнения исходят из этой строки в моем variant.cpp{ PORTA, 30, PIO_PWM, PIN_ATTR_DIGITAL|PIO_SERCOM, No_ADC_Channel, NOT_ON_PWM, TCC1_CH0, EXTERNAL_INT_10 }, // SWCLK Я не уверен насчет NOT_ON_PWM, могу ли я использовать TCC1_CH0 для PWM`??, @simon