Таймер 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);
У меня что-то есть на осциллографе, но сигнал кажется плохим, ВЫСОКИЙ сигнал очень быстрый, а низкий сигнал очень длинный.
@simon, 👍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; // Давать возможность
}
,
@Dmitrii
Смотрите также:
- Можно ли сгенерировать точный тактовый импульс 15 кГц с помощью ардуино?
- Генерация сигнала частотой 38 кГц без таймеров
- Светодиод Arduino PWM с замиранием в сборке
- Отрегулируйте расчет времени после изменения частоты Timer0
- Высокочастотный PWM на Adafruit Feather M0
- Как измерить ультразвуковой датчик без импульсного метода?
- Teensy 4.1 / 4.0 Когда использовать контакты FlexPWM и QuadTimer для стробирования светодиодов
- Seeeduino СЯО запись и чтение ШИМ продолжительность (период) с помощью таймеров
Я пробовал что-то подобное @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