roboforum.ru

Технический форум по робототехнике.

 

генератор частоты и скважности одновременно на атмеге8

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

генератор частоты и скважности одновременно на атмеге8

Сообщение к561ЛА7 » 26 фев 2013, 22:59

Можно сделать аппаратную регулировку скважности на таймере 2
или частоты , включив его в режиме "сброс при совпадении"

а можно ли одновременно аппаратно, без прерываний,
управлять и частой, и скважностью на меге8?

или хотя бы управлять скважностью какой то заранее выставленной частоты,
но выставленой не делителем тактовой частоты частоты на 1-8- и т.д,
а к примеру частоты 1000 герц ?
О любимый мой учитель АВР 123
Надавал ты мне советов, и что вышло, посмотри
Я теперь паяю платы, программирую МК
Заказал я их по почте, у Семенова М.К.
Аватара пользователя
к561ЛА7
 
Сообщения: 337
Зарегистрирован: 08 дек 2009, 19:21
Откуда: Й-Ола

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение RootAdmin » 26 фев 2013, 23:59

Можно. Но без счетчика и прерывания - зачем?
Проще всего - по алгоритму управления многими сервами.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1674
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение Duhas » 27 фев 2013, 06:14

в голову пришло одно - на двухканальном счетчике, по одному совпадению ШИМить - по второму сбрасывать... реально ли - хз... надо глядеть доку. ессно с ростом частоты будет падать разрешение ШИМ
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6341
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение к561ЛА7 » 27 фев 2013, 11:11

есть какой то режим с коррекцией фазы и частоты, якобы можно задавать и заполнение ШИМ и верхний предел счета счетчика. Но буржуи пишут на плохо понятном техническом языке, который с трудом обрабатывается моим процессором и не вмещается в мою память :cry: . Помогите, плиз.
О любимый мой учитель АВР 123
Надавал ты мне советов, и что вышло, посмотри
Я теперь паяю платы, программирую МК
Заказал я их по почте, у Семенова М.К.
Аватара пользователя
к561ЛА7
 
Сообщения: 337
Зарегистрирован: 08 дек 2009, 19:21
Откуда: Й-Ола

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение Radist » 27 фев 2013, 12:18

Аппаратно такого режима нет. Можно сделать на двух таймерах. Один будет следить за периодом, второй за длительностью импульса. Если посильнее извратиться, то можно обойтись и одним таймером. Естественно, есть ограничения на частоту и разрешение шим.
Аватара пользователя
Radist
 
Сообщения: 2233
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение RootAdmin » 27 фев 2013, 15:11

Делал так:
Сч=начала считаем сколько надо счетчику насчитать чтоб получить заданный период импульса.
Получаем количество "тиков". Потом умножаем количество тиков на заданную скважность. Получаем - длительности высокого и низкого состояния.
Счетчик считает рассчитанное количество полных циклов плюс рассчитанный "остаток" пока не насчитает заданный импульс (высокое состояние). Вывод "out" переключается. Затем счетчик считает период "низкого состояния"
Сейчас попробую накидать скетч.

Добавлено спустя 2 часа 46 минут 51 секунду:
Быстро подправил один из скетчей.
loop() можно чистить вообще.

Код: Выделить всёРазвернуть
/*
Генератор частоты-скаважности
*/

// ISR interrupt service routine
//#include < interrupt.h >


#define TOGGLE_IO 6 //вывод Arduino для переключения по таймеру ISR
#define TOGGLE_IO_GND 5 //земля светодиода

#define ClockHZ 1 //Частота в герцах
#define Skvaz 0.9 //Скважность

unsigned int latency;
unsigned int latencySum;
unsigned int sampleCount;
unsigned int CountPer;
long timerLoadValue; //Количество тиков
long Tick1; //Тиков для "1" ЦЕЛЫХ
long Tick0; //Тиков для "0" ЦЕЛЫХ
long TickCount; //Тиков для обработки в прерывании



void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);
//Устанавливает порт, который нам нужно переключать в ISR, выходным.
pinMode(TOGGLE_IO,OUTPUT);
pinMode(TOGGLE_IO_GND,OUTPUT);
digitalWrite(TOGGLE_IO_GND, LOW);
 
interrupts();                                 // Разрешить прерывания глобально

//Запускает последовательный порт
Serial.begin(9600);

//Сообщение о запуске программы
Serial.println("Timer Test"); 

//Запускает таймер Настройка таймера.
timerLoadValue=SetupTimer2(ClockHZ);

//Выводит рассчитанное значение таймера
Serial.print("Timer2 Period=");
Serial.println(timerLoadValue);
Tick1=timerLoadValue*Skvaz;
Tick0=timerLoadValue-Tick1;
Serial.print("Timer2 Tick1=");
Serial.println(Tick1);
Serial.print("Timer2 Tick0=");
Serial.println(Tick0);
TickCount=Tick1;
digitalWrite(TOGGLE_IO, HIGH);

}





void loop() {
 


//  digitalWrite(13, HIGH);   // set the LED on
  delay(5000);              // wait
  digitalWrite(13, LOW);    // set the LED off
//  delay();              // wait for a second
//    Serial.println( TCNT2 );
//   Serial.print("  ");
//    Serial.print( TestPerem );
//   Serial.print("  ");
//locateSensor=digitalRead(LOC_INPUT);


  delay(5000);              // wait
//  Serial.print (curstep) ;
//    Serial.print (" ") ;
  Serial.print ("TickCount=") ;
   Serial.println (TickCount) ;
//  Serial.println (" ");
//Serial.println( digitalRead(LOC_INPUT) );
//  TestPerem=locateStat;
   digitalWrite(13, HIGH);

  //Собирает текущее значение задержки из ISR и увеличивает счетчик на 1
//the sample counter
latencySum+=latency;
sampleCount++;

//Как только наберется 20 замеров, вычисляет и выводит результат измерений
if(sampleCount>20) {
float latencyAverage;
float loadPercent;

//Вычисляет среднюю задержку
latencyAverage=latencySum/100.0;

//обнуляет значения сумм
sampleCount=0;
latencySum=0;

//Вычисляет ожидаемый процент загрузки процессора
loadPercent=latencyAverage/(float)timerLoadValue;
loadPercent*=100; //Переводит доли в проценты;

//Выводит среднюю задержку
Serial.print("Latency Average:");
Serial.print((int)latencyAverage);
Serial.print(".");
latencyAverage-=(int)latencyAverage;
Serial.print((int)(latencyAverage*100));

//Выводит ожидаемый процент загрузки
Serial.print(" Load:");
Serial.print((int)loadPercent);
Serial.println("%");
}
 
 
}





//Timer2 указатель вектора прерывания по переполнению
ISR(TIMER2_OVF_vect) {
//Проверим счетчик TickCount
//Проверим состояние выхода, если 1 - то
if (TickCount==0) {
if (digitalRead(TOGGLE_IO)){ TickCount=Tick0;}
else { TickCount=Tick1;}
digitalWrite(TOGGLE_IO,!digitalRead(TOGGLE_IO)); //Переключение IO-вывода в другое состояние.
}
else{
  //проверяем - больше ли счетчик целого чикла (255)
  if (TickCount<255) {
     TCNT2=255-TickCount+TCNT2;
     TickCount=0;} //Компенсация того, что натикало.
  else {
      TickCount-=255;}
}
 
//  if (curstep> 400 || curstep<0){dir=-dir;}
//  curstep+=dir;
//  //Переключение IO-вывода в другое состояние.
//  digitalWrite(TOGGLE_IO,!digitalRead(TOGGLE_IO));



//Захват текущего значения таймера. Это величина ошибки
//из-за задержки обработки прерывания и работы этой функции
int latency=TCNT2;

//Перезагрузка таймера и коррекция по задержке
//TCNT2=latency+timerLoadValue;
//TCNT2=timerLoadValue;
}


long SetupTimer2(long Frequency){
#define TIMER_CLOCK_FREQ 15625.0
#define  TIMER_CLOCK_TICK 2000000.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz
  //Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает количество тиков таймера на один период требуемой частоты


//Установки Таймер2: Делитель частоты /8, режим 0
//Частота = 16MHz/1024 = 15625 герц или 64 мкс
//Делитель /1024 дает нам хороший рабочий диапазон
//Но нужен 16MHz/8 = 2Mhz или 0.5 мкс
//так что сейчас мы просто жестко запрограммируем это.
TCCR2A = 0;
TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20; //это на 8
// TCCR2B = 7; //Это на 1024

//Подключение прерывания по переполнению Timer2
TIMSK2 = 1<<TOIE2;

//загружает таймер для первого цикла (если меньше 255, или
TCNT2=0;
//Количество тиков:
long CountPer=TIMER_CLOCK_TICK/(long)Frequency;

return(CountPer);
}



Добавлено спустя 2 минуты 47 секунд:
Да, если нужна бОльшая точность - то делитель счетчика можно установить =1.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1674
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение к561ЛА7 » 27 фев 2013, 16:57

Ну ты умная голова. Спасибо, друг. Обрабатываю твой код
О любимый мой учитель АВР 123
Надавал ты мне советов, и что вышло, посмотри
Я теперь паяю платы, программирую МК
Заказал я их по почте, у Семенова М.К.
Аватара пользователя
к561ЛА7
 
Сообщения: 337
Зарегистрирован: 08 дек 2009, 19:21
Откуда: Й-Ола

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение к561ЛА7 » 27 фев 2013, 21:59

Идею понял, но если чесно, :bad: код не осилил. :bad:
видимо мой процессор слегка перегрелся :(

В общем мучаюсь вопросами:

А можно ли задать аппаратно (именно аппаратно) частоту генератора,
а потом регулировать скважность?

Или наоборот, задать скважность а потом регулировать частоту?

И может ли вообще человек по своему хотению аппаратно выдать сигнал
на ногу заранее определенной частоты и скважности?

Или мы поставлены судьбою в рамки предделителя 1-8-64-256-1024?
О любимый мой учитель АВР 123
Надавал ты мне советов, и что вышло, посмотри
Я теперь паяю платы, программирую МК
Заказал я их по почте, у Семенова М.К.
Аватара пользователя
к561ЛА7
 
Сообщения: 337
Зарегистрирован: 08 дек 2009, 19:21
Откуда: Й-Ола

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение Radist » 27 фев 2013, 22:40

Я уже ответил, что нельзя. Читайте даташиты на русском.
Аватара пользователя
Radist
 
Сообщения: 2233
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение Angel71 » 27 фев 2013, 22:57

к561ЛА7, нескромный вопрос, а для чего нужно генерировать такой хитрый сигнал?
Аватара пользователя
Angel71
 
Сообщения: 9231
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение к561ЛА7 » 27 фев 2013, 23:02

Я так и думал что найдуться люди которых заинтересует этот вопрос :) .
какие будут предположения :)

ладно, не терзайся, экспререментирую с накачкой колебательного контура.

кстати, если сделать генерацию не таймере и в прерывании менять значения счетчика до которого он считает, не помешает ли это прерывание работе другого прерывания?
Последний раз редактировалось к561ЛА7 28 фев 2013, 00:06, всего редактировалось 1 раз.
О любимый мой учитель АВР 123
Надавал ты мне советов, и что вышло, посмотри
Я теперь паяю платы, программирую МК
Заказал я их по почте, у Семенова М.К.
Аватара пользователя
к561ЛА7
 
Сообщения: 337
Зарегистрирован: 08 дек 2009, 19:21
Откуда: Й-Ола

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение Radist » 27 фев 2013, 23:08

Нет.
Аватара пользователя
Radist
 
Сообщения: 2233
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение RootAdmin » 28 фев 2013, 01:10

ТС, озвучь техзадание - накидаю скетч. Можно и счетчик на ходу менять и предделитель и вообще вообще чего угодно, хоть на 5 ног вывести разные частоты/скважности.

Добавлено спустя 4 минуты 35 секунд:
А чем приведенный код плох? Килогерц до 100 работать должен, частоту равно как и скважность можно га лету менять как угодно.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1674
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение Angel71 » 28 фев 2013, 09:05

к561ЛА7, так терзаться наоборот ещё больше стал. почему недостаточно только просто шима с постоянной частотой и изменяющейся скважностью? если это какой импульсник, может проще достать специализированнйю микру? или или шим контроллер с внешней тактовой? или использовать шим и на резюках внешний цап?
про waveform генератор в даташите много написано, но никогда не вчитывался, т.к. необходимости небыло.
вот проектик генератора http://www.avr-asm-tutorial.net/avr_en/signalgen/rectgen_m8_v1_main.html с регулируемой ччастотой и скважностью.
Аватара пользователя
Angel71
 
Сообщения: 9231
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: генератор частоты и скважности одновременно на атмеге8

Сообщение к561ЛА7 » 28 фев 2013, 12:36

у колебательного контура есть своя резонансная частота, которая с 1-8-64-256 не совпадает. и накачивать его надо короткими импульсами , не с 50 процентным заполнением.
тоесть надо как можно больше аппаратно подстроиться под частоту контура и его накачивать,
програмно нельзя потому что время цикла программы раз в 500 больше частоты генерации.
тоесчть нужно выдать на ногу ОС2 сигнал с частотой контура и маленькой скважностью, а программа в это врямя пусть занимается другими делами

В проект генератора так сразу не вьеду так как пишу на С++ и содвижнавр
Последний раз редактировалось к561ЛА7 28 фев 2013, 12:39, всего редактировалось 1 раз.
О любимый мой учитель АВР 123
Надавал ты мне советов, и что вышло, посмотри
Я теперь паяю платы, программирую МК
Заказал я их по почте, у Семенова М.К.
Аватара пользователя
к561ЛА7
 
Сообщения: 337
Зарегистрирован: 08 дек 2009, 19:21
Откуда: Й-Ола

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 2

Mail.ru counter