Генерация ШИМ без analogWrite()

Я пишу кастомное ядро для Arduino Mega 2560 и мне нужно генерировать ШИМ, кодом такого вида:

bitSet(TCCR0A, COM0A1);
        OCR0A = duty;

Какие значения мне нужно подставить, чтобы ШИМ был не только на 13 пине (таймера...)?


Ответы (2 шт):

Автор решения: gbg

Аппаратная генерация ШИМ возможна только на пинах, которые прописаны в даташите как пины для аппаратного ШИМ.

На остальные пины можно выдать ШИМ только программно, что имеет ряд ограничений.

→ Ссылка
Автор решения: K_R_O_K_O_D_I_L_L_O

Вот работающий код:

 switch (pin) {
    case 2:
      bitSet(TCCR3A, COM3B1);
      OCR3B = duty; // set pwm duty
      return;
    case 3:
      bitSet(TCCR3A, COM3C1);
      OCR3C = duty; // set pwm duty
      return;
    case 4:
      bitSet(TCCR0A, COM0B1);
      OCR0B = duty; // set pwm duty
      return;
    case 5:
      bitSet(TCCR3A, COM3A1);
      OCR3A = duty; // set pwm duty
      return;
    case 6:
      bitSet(TCCR4A, COM4A1);
      OCR4A = duty; // set pwm duty
      return;
    case 7:
      bitSet(TCCR4A, COM4B1);
      OCR4B = duty; // set pwm duty
      return;
    case 8:
      bitSet(TCCR4A, COM4C1);
      OCR4C = duty; // set pwm duty
      return;
    case 9:
      bitSet(TCCR2A, COM2B1);
      OCR2B = duty; // set pwm duty
      return;
    case 10:
      bitSet(TCCR2A, COM2A1);
      OCR2A = duty;
      return;
    case 11:
      bitSet(TCCR1A, COM1A1);
      OCR1A = duty;
      return;
    case 12:
      bitSet(TCCR1A, COM1B1);
      OCR1B = duty;
      return;
    case 13:
      bitSet(TCCR0A, COM0A1);
      OCR0A = duty;
      return;
→ Ссылка