Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Генериране на честоти
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5769
Страница 1 от 3

Автор:  kasparov [ Сря Май 07, 2008 8:33 pm ]
Заглавие:  Генериране на честоти

Интересувам се, ако някой може да ми даде идея, на какъв принцип
да генерирам с микроконтролер плавно нарастваща честота, от 0 до към 30 kHz,
нарастването трябва да е линейно във времето, също така, добре е да може да се
контролира и скоростта на нарастване, например от 0 до 30 kHz за 1- 2 десети от секундата.
Контролера мисля да е pic18f1320.

Автор:  Ки4о [ Сря Май 07, 2008 8:55 pm ]
Заглавие: 

Само с контролер или може да има към него и PLL ? Друго за което се сещам - контролер,ЦАП,преобразувател напрежение/честота.

Автор:  [ Сря Май 07, 2008 9:08 pm ]
Заглавие: 

Контролера ще се занимава ли други задачи или ще работи само като генератор ? Каква е минималната стъпка на нарастване/намаляване ?

Автор:  kasparov [ Сря Май 07, 2008 9:30 pm ]
Заглавие: 

Сценарият е следния: за 0,1 сек. генерираме поредица от импулси чиято честота нараства от 0 до f, след това за 0,4 сек. поддържаме честотата f, и накрая следва спадане на честотата на импулсите от f до 0. Получава се трапецовиден профил на честотата във времето, или т. нар ramp generator. През това време не е необходимо процесора да прави друго, но може да се наложи да се поддържа някаква индикация, за което остава половин секунда между два цикъла. Добре е да се знае броя на генерираните импулси.
За минималната скорост на нарастване, ако съм разбрал правилно въпроса, е около 30 кHz/s, до към 120 kHz/s.

Автор:  plameniv [ Чет Май 08, 2008 1:12 am ]
Заглавие:  MM

kasparov написа:
Сценарият е следния: за 0,1 сек. генерираме поредица от импулси чиято честота нараства от 0 до f, след това за 0,4 сек. поддържаме честотата f, и накрая следва спадане на честотата на импулсите от f до 0. Получава се трапецовиден профил на честотата във времето, или т. нар ramp generator. През това време не е необходимо процесора да прави друго, но може да се наложи да се поддържа някаква индикация, за което остава половин секунда между два цикъла. Добре е да се знае броя на генерираните импулси.
За минималната скорост на нарастване, ако съм разбрал правилно въпроса, е около 30 кHz/s, до към 120 kHz/s.

Няма ли да стане ако го реализираш с вградения PWM на някой контролер , така процесора може да си върши нещо друго през това време а изхода на PWM ще си изкарва честоата без да има нужда да зависи от софтуера , като смяната на честотата ще я направиш чрез свободния таймер когато прекъсва на определено време 0.1сек и след н прекъсвания сменяш времето на прекъсване на 0.4сек и т.н. А софтуера нека си обслужва дисплей и каквото искаш още там ?

Автор:  tgi [ Чет Май 08, 2008 1:51 am ]
Заглавие: 

С 2 MHz MCU с "output compare" съм правил неща, които биха го докарали
до 5 kHz с лекота (май границата беше към 10, ама не помня, беше преди
14 години).
Та в днешно време едва ли е проблем да го направиш с 6 пъти по-бърз
контролер, който има output compare; просто трябва да обработваш
по едно прекъсване на всеки цикъл и там да задаваш дължината на следващия.
Какви дължини следват се върти някак в прекъсваната част от кода.

Автор:  Desert Leo [ Чет Май 08, 2008 8:17 am ]
Заглавие: 

Това курсова работа ли е?
От 0 до f за 0,1 сек нещо не го виждам. При 0,1Hz периода е 10 сек, при 1Hz - 1сек, а при 10Hz - 0,1 сек.
С други думи, за 0,1сек на изхода ще получиш рамп генератор в килохерцовата област. При ниски честоти просто не достига време за установяване на генерациите.

Автор:  kasparov [ Чет Май 08, 2008 12:26 pm ]
Заглавие: 

Desert Leo написа:
Това курсова работа ли е?
..С други думи, за 0,1сек на изхода ще получиш рамп генератор в килохерцовата област. ..


Desert Leo, нали това е целта, за определено време да се достигнат килохерци. Опитах се да го представя и графично. Задачата не е курсова, сам съм си направил такова задание. Реално ще се ползва за задвижване на тяло с променлива ъглова скорост, и искам да задам ускорение, после движение с постоянна скорост и плавно спиране до нула.

относно PWM -а, дали ще може да му се променя плавно честотата и в широки граници?

tgi, "output compare" какво е, CCP модула ли ли е или нещо друго?

Прикачени файлове:
Gen.jpg
Gen.jpg [ 89.23 KiB | Прегледано 1741 пъти ]

Автор:  Desert Leo [ Чет Май 08, 2008 1:23 pm ]
Заглавие: 

Да де, ама не от нула Hz. Задай някаква минимална честота, защото просто няма да стане за 0,1сек.
А и дали има нужда да бъде от нула.

Автор:  sthx [ Чет Май 08, 2008 1:26 pm ]
Заглавие: 

"output compare" е част от таймера на моторолските процесори - сравнява текущото значение на брояча със зададеното и формира автоматично на изхода определено състояние - 1 или 0. След прекъсването се формира ново задание по вкус. 30 кHz трябва да могат да се догонят по този начин. За пик-овете не зная как е.

Автор:  ps66 [ Чет Май 08, 2008 1:45 pm ]
Заглавие: 

kasparov написа:
...нали това е целта, за определено време да се достигнат килохерци. Опитах се да го представя и графично. Задачата не е курсова, сам съм си направил такова задание. Реално ще се ползва за задвижване на тяло с променлива ъглова скорост, и искам да задам ускорение, после движение с постоянна скорост и плавно спиране до нула.
...


това ми напомня на CNC контролер за у-е на степер.

ако държиш да е пик - можеш да намериш няколко опънсорс контролера с пик и да им ги разгледаш сорса - иначе принципа е елементарен - на всяка стъпка променяш ширината на импулса (периода на прекъсването от таймера) като я смяташ или ползваш таблица ... за да си реализираш рампата....
30кHz не са много за подобни цели !

Автор:  ji4ka [ Чет Май 08, 2008 3:13 pm ]
Заглавие: 

PWM - това е решението щом си с пик!Генерирането на честота с контролер НИКОГА не може да е линейно. Виж формулите за PWM-a и може да си сметнеш валидните честоти в Ексел-а например и да си избереш тия които ти трябват. Самия PWM си има прекъсване и може да го ползваш като "часовник", но може и с ТМР0. Правиш си една табличка със стойностите на честотите(периодите им) и втора с времето м/у тях и ги зареждаш в прекъсването при повикване от PWM/TMR2. За времето между стъпките ползвай брояч. За да ти е по-лесен живота първо си преобразувай честотите в период или направо в тактове и работи с тях в контролера.
И гледай запълването на PWM да е под 99% за да не ти спрат импулсите. Хубавото на PWM е ,че е хардуерно буфериран ,така че може да го зареждаш и асинхронно - промяната се появява чак след изтичане на текущия му период.
В останалото от прекъсването време може да си движиш друг код стига да не е времево чувствителен.

Автор:  Ки4о [ Чет Май 08, 2008 3:27 pm ]
Заглавие: 

Може да си направи и софтуеерно - константно запълване на импуса,променлив период.Ако се подберат правилно стойностите на изменение на честотата то тогава може да се постигне добра линейност,още повече че е двигател,т.е имаш филтър усредняваш ;) Но трябва да работиш на максималната честота която пика позволява.Както каза @ps66 - с таблица.

Автор:  tgi [ Чет Май 08, 2008 6:18 pm ]
Заглавие: 

Както sthx обясни, output compare (OC) го има в таймерите на разните
контролери от Motorola/Freescale; аз първо го видях в HC11.
По-гъвкав вариант от това е трудно да се измисли, човек може
всеки цикъл да зададе колко дълъг да е следващият и да контролира
какво да прави някакъв изход в края на цикъла (т.е. изходът реагира,
а обработката на прекъсването следва и латентността и не влияе).
И понеже човек може да програмира изхода да отиде горе, долу, да се
обърне, или да не прави нищо и т.н., могат да се генерират произволни
серии от щракания, стига да няма два последователни интервала, чиято
обща дължина да е по-малка от времето за обслужване на прекъсването*2.
Има едни малки нови Coldfire базирани контролери, MCF51QE и MCF51JM,
те се клочат до 50 MHz за ядрото (25 за останалото, май и таймерът е
там), със сигурност биха свършили работа - и не са скъпи, под $5 ги
гледам за 1000+. Та те имат OC в таймерите си, де.

Автор:  kasparov [ Чет Май 08, 2008 6:58 pm ]
Заглавие: 

Не съм много сигурен, но мисля че го открих този "output compare" за който говорите,
в 18F1320 (и в други), има таймер2 модул, към който има асоциран регистър PR2 в който може да се пише,
таймера генерира прекъсване когато стойността му се изравни с тази на PR2.
Ако това е така, това ще е единия начин по който ще опитам.
Относно Coldfire, по-нататък, за сега още сме на "дървена" платформа. :)

Другото решение, PWM-а - оказва се че същия този регистър PR2 дава времева база за PWM периода,
и ще може да се променя плавно този период, така че и това може да се види като второ решение.

Явно ще остава и доста свободен ресурс.

Жичка, ако може да дешифрираш "Генерирането на честота с контролер НИКОГА не може да е линейно"

P.S благодарности на всички за ценните напътствия до момента

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/