Как получить 64Mhz часы для таймера / счетчика4 на микроконтроллере Atmega32u4? - PullRequest
0 голосов
/ 05 июля 2018

Так что в настоящее время мне нужно иметь ШИМ, сгенерированный из таймера / счетчика4 с частотой 64 МГц. Моя текущая частота равна системным часам 16 МГц, мне нужно как-то умножить это на 4. В техпаспорте утверждается, что с помощью часов PLL вы можете перейти на эту частоту, но кажется, что работа с регистрами PLL мешает связи через USB. Я приложил свой код, если кто-нибудь знает, как исправить или обойти проблему.

int D4 = 9;

//PWM Waveforms
byte arr1[] = {0x0C, 0x0C, 0x0F, 0x0F, 0x0C, 0x0C, 0x08, 0x08, 0x08, 0x08, 
0x04, 0x04, 0x0, 0x0, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08};
byte arr2[] = {0x00,0x8,0xF,0x8};

int i = 0; 
int b = 0; 
int g = 0;

void setup() {
  // put your setup code here, to run once:
  noInterrupts (); // no interrrupts during setup

//PLL Clock registers (Disabled so code will upload)
//  PLLCSR = (1<<PLLE);
//  PLLFRQ = (1<<PLLTM1)|(0<<PLLTM0);

//Timer/Counter1 used to controll PWM update
  TCCR1A = (1<<WGM11)|(1<<WGM10);
  TCCR1B = (1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
  OCR1A = 0xA0;

  TIMSK1 = (1<<TOIE1);

//Timer/Counter4 used to generate PWM
  DDRC = (1<<DDC7)|(1<<DDC6);
  TCCR4A = (0<<COM4A1)|(1<<COM4A0)|(1<<PWM4A);
  TCCR4B = (1<<PSR4);
  TCCR4B = (0<<DTPS41)|(0<<DTPS40)|(0<<CS43)|(0<<CS42)|(0<<CS41)|(1<<CS40); 
  TCCR4D = (0<<WGM41)|(0<<WGM40);
  pinMode(D4, OUTPUT);

 interrupts (); // enable global interrupts
//Setting 4 bit resolution
 OCR4C = 0xF;
}

ISR (TIMER1_OVF_vect) // Updating PWM on timer4 using timer1 interrupt 
{ 
 if (b == 8){
    OCR4A= 0x08;
    if (g == 400){
     b = 0;
     g = 0;
    }
    else{
      ++g;
    }
  }
 else{
    OCR4A= arr1[i];
    if (i < (sizeof(arr1)-1)){
    i++;
    }
    else{
      i = 0;
      ++b;
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

1 Ответ

0 голосов
/ 05 июля 2018

Так что в настоящее время мне нужно иметь ШИМ, сгенерированный из таймера / счетчика4 с частотой 64 МГц.

Этого не произойдет. Максимальное время для таймера / счетчика составляет 64 МГц; это приведет к максимальной выходной частоте 32 МГц.

При этом значения регистров, которые вам нужны:

PLLFRQ = _BV(PLLUSB) | _BV(PLLTM1) | _BV(PDIV3) | _BV(PDIV1);
PLLCSR = _BV(PINDIV) | _BV(PLLE);

Это устанавливает:

  • Входное масштабирующее устройство ФАПЧ до ÷ 2 (при входной частоте 8 МГц, что требуется)
  • Выходная частота ФАПЧ до 96 МГц
  • ФАПЧ USB делитель на ÷ 2 (что делает частоту USB 48 МГц, что требуется)
  • делитель таймера ФАПЧ до ÷ 1,5 (при частоте таймера 64 МГц)
...