Цифровые сигнальные процессоры Вопросы, связанные с применением цифровых сигнальных процессоров: программирование, отладочные средства, алгоритмы... |
10.07.2008, 16:05
|
|
Частый гость
Регистрация: 09.05.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
программная точная частота с МК
Посоветуйте, пожалуйста, алгоритмы выставления точной частоты на ногу МК с минимальным кодом программы.
допустим, 16 МГц резонатор,
надо 15 кГц
таймерами можно выставить только конкретное значение чуть больше или меньше 15кГц, что не удовлетворяет условиям поставленной задачи =15кГц (+/- 2Гц).
мой алгоритм.
в циклически повторяемом прерывании выставляю частоту выхода на прерывание по 5 раз 15039 и 14932 и один раз 15154 в среднем получается 15000,81.
что в принципе устраивает, НО необходимы оптимальные алгоритмы, возможно такие что позволяют не баловаться с частотами в таком диапазоне или каким либо образом уменьшающие код программы в разы.
|
|
|
|
10.07.2008, 16:53
|
|
Прописка
Регистрация: 16.03.2005
Сообщений: 244
Сказал спасибо: 78
Сказали Спасибо 85 раз(а) в 55 сообщении(ях)
|
Неполучится требуемая точность ни какой программой- 16 Мгц -63,5 нс, 15кГц - 66,7мкс (+/- 2Гц)-267ppm= 17.8нс. Если сильно хочется- можно так- внешняя логика + тамер МК. -На каком МК делаем?
Я немного еще подумал... Да согласен- алгоритм Ваш работать будет, но - прерывание будет происходить с погрешностью в добрый десяток тактов- работа со стеком- если конечно Си и программа что-то делает еще помимо генерации 15кГц. ![Улыбка](images/smilies/icon_smile.gif) .
|
|
|
Сказали "Спасибо" mike7815
|
|
|
11.07.2008, 05:28
|
|
Частый гость
Регистрация: 09.05.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
данная операция выполняется не постоянно,
всего 3600 раз это примерно 250мс.
поэтому сильно убежать по моему алгоритму не должно.
приоритет прерывания высокий, стараюсь сделать наивысшим, т.е. никакая зараза не помешает ![Улыбка](images/smilies/icon_smile.gif)
МК AT90USB1287.
внешняя логика никак не прокатит, а вдруг надо будет не выводить на ногу, а считывать с ноги состояние с такой вот частотой.
|
|
|
|
11.07.2008, 08:20
|
|
Гражданин KAZUS.RU
Регистрация: 13.07.2005
Сообщений: 602
Сказал спасибо: 14
Сказали Спасибо 40 раз(а) в 19 сообщении(ях)
|
Re: программная точная частота с МК
Сообщение от konstsm
|
по 5 раз 15039 и 14932 и один раз 15154 в среднем получается 15000,81
|
Средняя температура в больнице за сутки = 36,6 ![Улыбка](images/smilies/icon_smile.gif)
Может сделать внешний задающий генератор и немного его подстроить? 1600500000:1067=15,000 кГц.
|
|
|
|
11.07.2008, 08:42
|
|
Частый гость
Регистрация: 30.09.2004
Сообщений: 39
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
Re: программная точная частота с МК
Сообщение от konstsm
|
Посоветуйте, пожалуйста, алгоритмы выставления точной частоты на ногу МК с минимальным кодом программы.
допустим, 16 МГц резонатор,
надо 15 кГц
таймерами можно выставить только конкретное значение чуть больше или меньше 15кГц, что не удовлетворяет условиям поставленной задачи =15кГц (+/- 2Гц).
мой алгоритм.
в циклически повторяемом прерывании выставляю частоту выхода на прерывание по 5 раз 15039 и 14932 и один раз 15154 в среднем получается 15000,81.
что в принципе устраивает, НО необходимы оптимальные алгоритмы, возможно такие что позволяют не баловаться с частотами в таком диапазоне или каким либо образом уменьшающие код программы в разы.
|
Кварц для МК берем 14.7456 МГц, их везде полно. Настраиваем таймер на 983. Получается 14745600/983=15000.6104. Если это плохо, то можно конденсаторами скорректировать частоту кварца, снизив ее до 15000 * 983 = 14745000 Гц., т.е. надо уменьшить на 600 Гц.
|
|
|
|
11.07.2008, 10:43
|
|
Прохожий
Регистрация: 21.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: программная точная частота с МК
Сообщение от konstsm
|
Посоветуйте, пожалуйста, алгоритмы выставления точной частоты на ногу МК с минимальным кодом программы.
|
Посмотрите в сторону программного DDS.
Реализовывал подобную штуку на ATTiny2313. Выходная частота 0-100 000 кГц. Нужен был шаг 1 Гц, но данный метод позволяет использовать и значительно меньший шаг (вплоть до 0,05Гц).
Код, как и требуется, минимальный. Итак...
Функция main():
void main(void){
InitChip();
#asm
.EQU PORTB=0x18
;Watchdog settings
ldi R30,0x18 ;WDE=1 WDCE=1
wdr
out WDTCR,R30
ldi R30,0x03 + 0x08 ;Interval code + WDE=1
wdr
out WDTCR,R30
;Clear PHACC
clr R18
clr R19
clr R20
;Set initial DELTA (0 Hz)
ldi R21,0x00 ;low byte
ldi R22,0x00
ldi R23,0x00 ;high byte
sei
;Main loop - 8 system clocks
Start:
add R18,R21
adc R19,R22
adc R20,R23
out PORTB,R20
wdr
nop
rjmp Start
#endasm
}
Все... ![Весело](images/smilies/icon_laugh.gif)
Код требуемой частоты заносится в DELTA (R21-R23)
Данный код рассчитывается по формуле:
DELTA = (2^24 * 8 *Fout )/Fsys,
где Fout - требуемая частота Fsys-частота кварца
Для Fsys=11,0592МГц формула примет вид:
DELTA = (2^13 * Fout)/675) = (Fout‹‹13)/675
Выходной сигнал (прямоугольные импульсы требуемой частоты) будут на ножке РВ7.
Дерзайте
|
|
|
|
11.07.2008, 12:04
|
|
Частый гость
Регистрация: 30.09.2004
Сообщений: 39
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
Re: программная точная частота с МК
[quote="dealex77"]
Сообщение от konstsm
|
Выходной сигнал (прямоугольные импульсы требуемой частоты) будут на ножке РВ7.
Дерзайте
|
Но при этом способе:
1) точность частоты плохая (а надо 15000+-2 Гц);
2) период частоты "гуляет";
3) МК кроме получения частоты должен еще что-то делать, очевидно. А здесь он занят только формированием частоты!
|
|
|
|
11.07.2008, 12:20
|
|
Частый гость
Регистрация: 09.05.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
kmw, полностью согласен.
менять резонатор крайне нежелательно, нужны алгоритмы оптимального кода.
(к примеру такие как инкремент до определенной частоты, далее сброс и всё по новой.)
|
|
|
|
11.07.2008, 12:37
|
|
Прохожий
Регистрация: 21.06.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: программная точная частота с МК
Сообщение от kmw
|
Но при этом способе:
1) точность частоты плохая (а надо 15000+-2 Гц);
2) период частоты "гуляет";
3) МК кроме получения частоты должен еще что-то делать, очевидно. А здесь он занят только формированием частоты!
|
1) Не правда! Практика показывает следующее: 100000+-0,1Гц
2) С чего это ему гулять??? Аргументируйте?
3) У меня сделано следующим образом. Есть основной МК, а есть МК-генератор. Приведенный кусок кода - как раз для МК-генератора. Проме main есть еще обработчик прерывания от посл. порта, в котором 3 байта кода частоты принимается и выкладываются в регистры DELTA. А на основном МК уже реализована вся остальная необходимая функциональность (работа с ЖКИ, памятью, клаиатурой и т.п.)
Предвидя возгласы типа "Лишний МК=лишние расходы":
Думаю, что 2-3 бакса (МК+кварц) за достаточно высокоточный DDS не такая уж и большая цена...
|
|
|
|
11.07.2008, 12:47
|
|
Прохожий
Регистрация: 27.10.2006
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
может чего не понял, но разве нельзя бонально организовать новую частоту по таймеру? и через
time = 65535UL - (int)(11719/(iFreq)) ;
TCNT1H = (unsigned char)(time ›› ![Горд собой](images/smilies/icon_dovl.gif) ;
TCNT1L = (unsigned char)time;
отмерять нужные интервалы?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:41.
|
|