300кгц частота

fsdb
Offline
Зарегистрирован: 24.10.2015

Добрый день. правильно ли я понимаю что данная функция даст бОльший выход частоты чем tone?

мне нужно до 300кгрц

 

#define OUT 9          // вывод выходного сигнала

void setup()
{
  Serial.begin(9600);
  pinMode(OUT, OUTPUT);
}

void loop()
{
  if(Serial.available()) 
  {
    long frequency = Serial.parseInt();
    Serial.print(Set_frequency(frequency));
    Serial.println(" Hz");
  }
}


long Set_frequency(long freq)
{
  TCCR1A = 0b01000000; 
  uint16_t ocr;
  if(freq < 134) 
  {
    TCCR1B = 0b00001010; 
    ocr = 1000000UL/freq - 1;
    freq = 1000000UL/(ocr+1);
  }
  else 
  {
    TCCR1B = 0b00001001;
    ocr = 8000000UL/freq - 1;
    freq = 8000000UL/(ocr+1);
  }
  OCR1AH = highByte(ocr);
  OCR1AL = lowByte(ocr);
  TIMSK1 = 0;
  return freq;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот здесь есть и готовый код для генерации сигналов разной частоты, и калькулятор, которым можно расчитать параметры для кода.

fsdb
Offline
Зарегистрирован: 24.10.2015

Боюсь что мне этот калькулятор не по зубам. имхо-те кто разбирается - он им не нужен- а кто не разбирается - он не по силам

для 328 этот код корректен? был корманный осцилограф но товарищь спалил. проверить нечем.

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Вот так на уно, 300000 с терминала передано.

fsdb
Offline
Зарегистрирован: 24.10.2015

о. класс. спасибо!!!

fsdb
Offline
Зарегистрирован: 24.10.2015

Евгений, не сочтите за наглость. помогите сменить  9 порт на 2 в функции. магия в функции мне не подвластна(.
Логически могу предположить что в 20 строчке номер порта и нужно заменить на 0b10000100 .

 


void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
}

void loop()
{
  if(Serial.available()) 
  {
    long frequency = Serial.parseInt();
    Serial.print(Set_frequency(frequency));
    Serial.println(" Hz");
  }
}


long Set_frequency(long freq)
{
  TCCR1A = 0b01000000; //это номер порта? нужно вписать 0b10000100?
  uint16_t ocr;
  if(freq < 134) 
  {
    TCCR1B = 0b00001010;          //какой то счетчик?
    ocr = 1000000UL/freq - 1;
    freq = 1000000UL/(ocr+1);
  }
  else 
  {
    TCCR1B = 0b00001001;         //какой то счетчик?
    ocr = 8000000UL/freq - 1;
    freq = 8000000UL/(ocr+1);
  }
  OCR1AH = highByte(ocr);
  OCR1AL = lowByte(ocr);
  TIMSK1 = 0;
  return freq;
}
mixail844
Offline
Зарегистрирован: 30.04.2012

если мне не изменяет интуиция то 

TCCR1A = 0b01000000; //это настройтка регистра таймера

который задает частоты

из вашего описания , я понимаю что вам надо что бы комп определял Ардуину на 2 портю вместо 9 ? 

штука в том что не ардуина решает на каком порту ей "сидеть",a ваша операционная система распределяет номера портов,меняеться в Диспетчере Устройств,естественно если желаемый порт свободен

 

fsdb
Offline
Зарегистрирован: 24.10.2015

mixail844, не правильно поняли т.к. я немного не корректно написал. этот скетч генерирует частоту в большом диапазоне на 9 пине ардуины, а мне нужно на 2 пине.

mixail844
Offline
Зарегистрирован: 30.04.2012

а на 2-ой пин низя вывести ,

так как судя по описанию на 2-ой пине не выходит никакой таймер.вот на 3-ий можно,и на 6 можно .как это уже другой вопрос и будет ли он соответствовать ващим требованиям

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fsdb пишет:

mixail844, не правильно поняли т.к. я немного не корректно написал. этот скетч генерирует частоту в большом диапазоне на 9 пине ардуины, а мне нужно на 2 пине.

Если у Вас UNO/Nano и т.п., то можно только на 3, 5, 6, 9, 10 и 11

Если Mega, то на 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46

У Вас что?

fsdb
Offline
Зарегистрирован: 24.10.2015

у меня Nano, подскажите пожалуйста где в этом коде номер пина? в 20 строчке? Раз 2 пин нельзя, то хотелось бы на 5тый сменить.
Спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На 5-ый теоретически можно, но не стоит. У Вас сломается millis, delay и прочее, что с ними связано. Тоже и про 6-ой - они на одном таймере

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

fsdb пишет:

у меня Nano, подскажите пожалуйста где в этом коде номер пина? в 20 строчке? Раз 2 пин нельзя, то хотелось бы на 5тый сменить.
Спасибо.

Да нет в этом коде номеров пинов. Тут прямая работа с аппаратными таймерами AVR. Ардуиновская нумерация там не используется. Есть вывод OC1A аппаратного Timer1. Он соответствует ардуиновскому пину 9. Выше на картинке распиновки это видно. Переназначить выходы аппаратных таймеров нельзя, можно только выбрать другие доступные на этом таймере. Или выбрать другой аппаратный таймер, если он нигде не используется. Но как написал выше ЕвгенийП, некоторые таймеры уже используются Arduino для своих целей (millis, delay).

P.S. У Вас вообще нет понимания, как настраиваются и работают аппаратные таймеры. Далеко Вы так не уедете, поэтому читайте матчасть:

http://easyelectronics.ru/avr-uchebnyj-kurs-tajmery.html

http://chipenable.ru/index.php/programming-avr/171-avr-timer-t0-ch1.html

https://www.youtube.com/watch?v=y8MbIbPd_Zs

http://mainloop.ru/avr-atmega/avr-timer-counter.html

http://samou4ka.net/page/tajmer-schetchik-mikrokontrollerov-avr