Цифровые сигнальные процессоры Вопросы, связанные с применением цифровых сигнальных процессоров: программирование, отладочные средства, алгоритмы... |
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кГц. .
|
|
|
Сказали "Спасибо" mike7815
|
|
|
11.07.2008, 05:28
|
|
Частый гость
Регистрация: 09.05.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
данная операция выполняется не постоянно,
всего 3600 раз это примерно 250мс.
поэтому сильно убежать по моему алгоритму не должно.
приоритет прерывания высокий, стараюсь сделать наивысшим, т.е. никакая зараза не помешает
МК 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
Может сделать внешний задающий генератор и немного его подстроить? 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
}
Все...
Код требуемой частоты заносится в 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 ›› ;
TCNT1L = (unsigned char)time;
отмерять нужные интервалы?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:38.
|
|