300кгц частота
- Войдите на сайт для отправки комментариев
Ср, 21/02/2018 - 23:05
Добрый день. правильно ли я понимаю что данная функция даст бОльший выход частоты чем 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;
}
Вот здесь есть и готовый код для генерации сигналов разной частоты, и калькулятор, которым можно расчитать параметры для кода.
Боюсь что мне этот калькулятор не по зубам. имхо-те кто разбирается - он им не нужен- а кто не разбирается - он не по силам
для 328 этот код корректен? был корманный осцилограф но товарищь спалил. проверить нечем.
Вот так на уно, 300000 с терминала передано.
о. класс. спасибо!!!
Евгений, не сочтите за наглость. помогите сменить 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; }если мне не изменяет интуиция то
который задает частоты
из вашего описания , я понимаю что вам надо что бы комп определял Ардуину на 2 портю вместо 9 ?
штука в том что не ардуина решает на каком порту ей "сидеть",a ваша операционная система распределяет номера портов,меняеться в Диспетчере Устройств,естественно если желаемый порт свободен
mixail844, не правильно поняли т.к. я немного не корректно написал. этот скетч генерирует частоту в большом диапазоне на 9 пине ардуины, а мне нужно на 2 пине.
а на 2-ой пин низя вывести ,
так как судя по описанию на 2-ой пине не выходит никакой таймер.вот на 3-ий можно,и на 6 можно .как это уже другой вопрос и будет ли он соответствовать ващим требованиям
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
У Вас что?
у меня Nano, подскажите пожалуйста где в этом коде номер пина? в 20 строчке? Раз 2 пин нельзя, то хотелось бы на 5тый сменить.
Спасибо.
На 5-ый теоретически можно, но не стоит. У Вас сломается millis, delay и прочее, что с ними связано. Тоже и про 6-ой - они на одном таймере
у меня 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