Основываясь на ваших комментариях, вы используете часы ~ 12 МГц в качестве входных данных для своего таймера, а из вашего кода вы используете 8-битный таймер 0 в режиме CTC с OCR0A в качестве верхней части. У вас есть OC0A, настроенный на включение сравнения совпадений.
Согласно техническому описанию 2560, частота вашего таймера определяется следующим образом:
F_CLK/(2*(1 + OCR0A)) | F_CLK ~= 12 МГц
Это 8-битный таймер, так что это означает, что ваша минимальная частота, которую может генерировать ваш ШИМ, определяется как:
12e6/(2*(1 + 255)) ~= 20 кГц
Вы просто не сможете генерировать звуковой сигнал с этой конфигурацией, если только вы не замедлите часы, которые используете для своего таймера, или не используете таймер, который может считать больше.
1) Используйте 16-битный счетчик (например, таймер 1). Это даст вам минимальную частоту ~ 90 Гц и максимальную частоту ~ 6 МГц, что должно дать вам достаточный диапазон для генерации тонов:
/* WGM BITS = 0100: CTC Mode */
/* COMA BITS = 01: Toggle OC1A on compare match */
/* CS BITS = 111: External clock source on rising edge */
TCCR1A = (0 << COM1A1) | (1 << COM1A0) | (0 << WGM01) | (0 << WGM00);
TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS02) | (1 << CS01) | (1 << CS00);
2) Используйте внутренний источник часов в качестве часов таймера вместо внешнего источника. Если вы не изменили фьюз-биты или не изменили их где-то в коде, тактовая частота будет 1 МГц. Предварительное масштабирование часов на 8 дает вам частотный диапазон от ~ 250 Гц до ~ 60 кГц.
/* WGM BITS = 010: CTC Mode */
/* COMA BITS = 01: Toggle OC1A on compare match */
/* CS BITS = 010: Prescale the internal clock by 8 */
TCCR0A = (0 << COM0A1) | (1 << COM0A0) | (1 << WGM01) | (0 << WGM00);
TCCR0B = (0 << WGM02) | (0 << CS02) | (1 << CS01) | (0 << CS00);
person
rlphillipsiii
schedule
06.06.2017
TCCR0B |= (1 << CS02) | (1 << CS01) | (1 << CS00);
. Если все три установлены, это означает: Внешний источник синхронизации на выводе T0. Часы на переднем фронте. Если у вас нет внешнего источника синхронизации на T0, просто установитеCS00
, чтобы получить, например, частоту ЦП в качестве источника без какого-либо предварительного делителя. - person Andre Kampling   schedule 06.06.2017t = (1/f_CPU) * uintTone / 2
. Вы хотите, чтобы параметрuintTone
был результирующей частотой? Я опубликую его позже, когда у меня будет время в качестве ответа. - person Andre Kampling   schedule 06.06.2017uintTone
был результирующей частотой? Да, было бы здорово, Но у меня кварц экстерна 11059200Гц вместо 16МГц. - person Radim Sejk   schedule 06.06.2017