реклама на сайте
подробности

 
 
> Плавная перестройка чатоты генерации меандра., STM32F103
misyachniy
сообщение Jun 23 2014, 15:28
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Для поиска чатоты резонанса поисковой катушки (ориентировочно 5..20 кГц) нужно генерировать меандр с помошью таймера.
Понятно что можно менять как предделитель таймера, так и с помощью регистров OCR.

Прошерстил интернет в поисках готового решения или "рыбы" но не нашел.

Предлагается в основном формирование синусоиды даже с дискретностю до 0.1 или 0.01 Гц.

Меня бы устроила шкала в 10Гц.

Есть ли где "рыба"?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Jun 24 2014, 08:51
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если для поиска резонанса подавать прямоугольный сигнал, то резонансов найдется много. Когда каждая гармоника (там они нечетные только будут) попадет на резонанс...
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Jun 24 2014, 15:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Цитата(ViKo @ Jun 24 2014, 11:51) *
Если для поиска резонанса подавать прямоугольный сигнал, то резонансов найдется много. Когда каждая гармоника (там они нечетные только будут) попадет на резонанс...


В первый раз слышу. чтобы контур имел несколько резонансных частот.

По поводу моего вопроса.
Я сегодня написал программу "полного" перебора частот выдаваемых таймером с помощью перебора коэффициентов предделителя и значения до которого считает таймер.

Я ограничил значения от 1 до 256.
На ПК перебирает за доли секунды. На МК займет намного больше. Завтра проверю.

Но задача типичная - нахождение двух множителей произведение которых максимально близко приближаются к требуемому значению делителя.
Go to the top of the page
 
+Quote Post
Scientificer
сообщение Jun 24 2014, 17:49
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 6-07-13
Из: Минск
Пользователь №: 77 417



Цитата(misyachniy @ Jun 24 2014, 18:37) *
В первый раз слышу. чтобы контур имел несколько резонансных частот.


Резонировать будет несколько раз, я это гарантирую. У меня лежит прибор по мотивам "Юного радиолюбителя", основанный на том, что у реального меандра много гармоник, до мегагерца, так точно. Я этим прибором буду промежуточную частоту 465 кГц настраивать в ламповом приемнике на досуге, хотя основная частота этого пробника1 кГц. И таки настрою, не сомневайтесь.

Синусоиду нужно делать, а то будете гадать на кофейной гуще. Мы же серьезные люди.

Сообщение отредактировал Scientificer - Jun 24 2014, 17:54


--------------------
Мысли и действия должны чередоваться как вдох и выдох.
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Jun 25 2014, 15:44
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Написал на Builder несколько ускоренную программу поиска коэффициентов файл "calc_presc.rar"

Функция на STM32F103 на 72 Мгц рассчитывает перебирает варианты за время около секунды.

CODE
#define MAX_PRESC 65535
#define MAX_PERIOD 256
//---------------------------------------------------------------------------
void calc_presc(int target_freq, unsigned short *presc_value, unsigned short *half_period_value)
{
int i, j;

float freq, best_calc_freq;
int presc, period;

// разница между заданой чаcтотой и рассчитаной
// в предыдущей итерации и а текущей
float prev_dif, cur_dif;

best_calc_freq=0;

for (i=0;i<MAX_PRESC; i++)
for (j=1; j<=MAX_PERIOD/2; j++)
{

prev_dif = cur_dif;

freq = (SYSCLK_FREQ_72MHz)/ ((1+i) * j*2);
/*
if (sign(target_freq - freq) == sign(target_freq - (SYSCLK_FREQ_72MHz)/ ((1+MAX_PRESC) * MAX_PERIOD)))
{
j = MAX_PERIOD/2;
}
*/
cur_dif = fabs(freq - target_freq);

if (cur_dif < fabs((best_calc_freq - target_freq)))

{
best_calc_freq = freq;
presc = i;
period =j;
}
else
{
if (j>1) // если уже есть с сравнивать
{
if (fabs(prev_dif) < fabs(cur_dif)) j=MAX_PERIOD/2; //результат ухудшается
}
}

}

*presc_value = presc;
*half_period_value = period;
}



Прескалер прямо пишется в регистры таймера, half_period_value прямо в CCR а удвоенное значение в элемент структуры TIM_Period

CODE
// Инициализация таймера управления катушкой
void coil_generator_init(int prescaller, int period)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;


GPIO_InitStructure.GPIO_Pin = COIL_MASK;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(COIL_PORT, &GPIO_InitStructure);

// Map TIM5 OC4 to PA3
GPIO_PinRemapConfig(GPIO_Remap_TIM5CH4_LSI,DISABLE);


// Init PWM TIM5
// Enable Timer1 clock and release reset
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE);

TIM_InternalClockConfig(TIM5);

// Time base configuration
TIM_TimeBaseStructure.TIM_Prescaler = prescaller;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = period*2 -1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

// Channel 2 Configuration in PWM mode
//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //vovka TIM_OCMode_Toggle

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;


TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0x00;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC4Init(TIM5,&TIM_OCInitStructure);
// Double buffered
TIM_ARRPreloadConfig(TIM5, ENABLE);

// TIM5 counter enable
TIM_Cmd(TIM5,ENABLE);

TIM5->CCR4 = period;
}



Перебор прескаллера 16 бит, периода 8 бит, так как для частот около 15..20гКц никакой выгоды от двух 16 битных коэффициентов нет.
Закомментированый кусок кода еще должен ускорить перебор, но в IAR нет функции Sign().
Но меня и такой вариант устраивает.

Сообщение отредактировал IgorKossak - Jun 25 2014, 19:56
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!

Прикрепленные файлы
Прикрепленный файл  calc_presc.rar ( 667.94 килобайт ) Кол-во скачиваний: 4
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- misyachniy   Плавная перестройка чатоты генерации меандра.   Jun 23 2014, 15:28
- - dac   делал одну поделку, шаг зависит от частоты, в райо...   Jun 23 2014, 15:51
|- - jcxz   Цитата(ViKo @ Jun 24 2014, 14:51) Если дл...   Jun 24 2014, 16:06
|- - misyachniy   Цитата(jcxz @ Jun 24 2014, 19:06) Только ...   Jun 24 2014, 16:32
- - Genadi Zawidowski   Просто для информации... Около секунды! Это чт...   Jun 25 2014, 19:24
- - misyachniy   ЦитатаПросто для информации... Около секунды! ...   Jun 26 2014, 18:54
- - Genadi Zawidowski   Абсолютно бесполезный ответ - это мои эмоции по Ва...   Jun 26 2014, 19:01
|- - alexf   DDS - безусловно правильное решение. Не внешний, а...   Jun 29 2014, 00:21
- - Golikov A.   младшие ли биты? Если прибавлять по 256 то в них в...   Jun 29 2014, 05:38
- - rx3apf   Совершенно верно - именно старшие биты аккумулятор...   Jun 29 2014, 08:01
- - Сергей Борщ   Из таблицы - в ЦАП, с ЦАПа - на аналоговый фильтр ...   Jun 29 2014, 09:00
- - misyachniy   Цитата(Сергей Борщ @ Jun 29 2014, 12:00) ...   Jun 29 2014, 09:59


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016