Цитата(neurox @ Jan 22 2009, 10:37)

Желательная точность действительно +/- 1Гц. Возможно ли её при 10 000 Гц достичь? В вычислениях получается уж слишком большая погрешность.. О_о
Достичь можно, и погрешность, скорее всего, будет небольшой...
Цитата(neurox @ Jan 22 2009, 10:37)

... Через prescaler делю её на 1024, получается 9765,625 Гц ......... Как мне вычислить это значение?
Для того, чтобы погрешность округления делителя до ближайшего целого была минимальна, необходимо, чтобы деление в прескалере было бы минимальным. Исходя из этого идеально использовать пределитель равнй единице. Но, для всего диапазона единица пределителя неподходит - иначе значение OCR выходит за 16 бит. Весь диапазон необходимо разбить на несколько частей - в каждом поддиапазоне своё значение пределителя.
Как определить пределитель и значение OCR? Если заглянуть в DS, то легко найти формулу определения частоты на ноге ОС в режиме СТС. Несложными преобразованиями получаем:
OCR= Fclk/(Foc*2*N)-1
В этой формуле Fclk- частота задающего генератора; Foc- частота, которую необходимо получить на выходе; N- значение пределителя; OCR- значение, которое необходимо поместить в регистр для получения нужной частоты на выходе. Вспомним что N - имеет значение степени двойки и что деление на 2 (или степень двойки) - это сдвиг вправо. Попробуем вычислить OCR при этом подбирая значение пределителя такое - чтобы результат помещался в 16 бит.
1. Делим Fclk на Foc (обозначим результат как Х). Результат надо получить типа unsigned long (надеюсь, программируете на Си)
2. Проверяем насколько Х превышает размер 17 (!) бит. Именно 17 бит, т.к. осталось ещё деление на 2, но мы прибережем его (деление) для округления до ближайшего целого.
Если Х помещается в 17 бит - то пределитель = 1, и Y=X
иначе, если Х помещается в 20 бит - то делитель = 8, и Y=X>>3
иначе, если Х помещается в 23 бита - то делитель = 64, и Y=X>>6
иначе, если Х помещается в 25 бит - то делитель = 256, и Y=X>>8
иначе делитель = 1024, и Y=X>>10
3. Делим на 2 с округлением до ближайшего целого и вычитаем единицу Z=(Y+1)>>1 - 1 (это и будет вычисленное значение для OCR)
Ну, вот... Для заданной частоты генерации импульсов определили пределитель и значение OCR