Так что в настоящее время мне нужно иметь ШИМ, сгенерированный из таймера / счетчика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:
}