Чтение ШИМ 5 кГц
- Войдите на сайт для отправки комментариев
Пнд, 13/05/2019 - 11:45
Здравствуйте. Подскажите пожалуйста, способна ли Ардуино прочитать ШИМ с частотой 5 кГц? Заполнение 0 - 100%. Мне необходим вывод значения в процентах. Так же интересует насколько корректно будут читаться показания на этой скорости.
Извиняюсь заранее, если кому - то покажется этот вопрос очень глупым...
1.Может.
2.Точность предельная 0.03 %. (62.5 нс)
3.Корректность зависит от тебя.
4.Да, вопрос глупый.
Спасибо большое. Значит начинаю собирать макетку и ставить эксперименты.
Ардуина может, её я знаю.
Тебя - совсем не знаю, сможешь ты или нет - не могу сказать.
А вот тут я уже вопроса не задавал ;-)
Чтобы темы не плодить, спрошу тут.
Мне нужен был считыватель импульсов в секунду, и чтобы далеко не ходить, сделал генератор из своего же шима на nano. Когда я запустил сие на значении шима analogWrite(a, 1), количество импульсов показало ~900, в другой раз 787. На максимальных 255, показывает ~ 189300 импульсов. Получается, он не увеличивает длительность импульса в периоде, а увеличивает количество импульсов в том же самом периоде?
этот результат говорит только о том, что измеряете вы полную чепуху. При ШИМ 255 не должно быть импульсов вовсе, потому что 255 - это просто постоянное включение пина на HIGH
На сколько мне известно, в компьютерной техники нет постоянных токов, а только импульсные. Но спорить не буду, так как не уверен. Можете сами попробовать повторить эксперимент
Чем измерял импульсы?
утверждение неверное.
В любом случае сотни тысяч импульсов на стандартном ШИМе это бред. Если бы вы правильно измеряли - при значениях ШИМ от 1 до 254 должны были получить частоту ШИМ - 490 или 980 Гц(в зависимости от пина), а на значениях 0 и 255 - постоянку.
Входом digitalRead(), количество импульсов добавлялось в счётчик в течении секунды, потом счётчик обнуляется и все заново.
код выложите?
Со смартфона, поэтому без форматирования выкладываю, уж простите:
byte buttonPin = 12;
byte PWM = 3;
unsigned long Time = 0;
unsigned long sum = 0;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(PWM, OUTPUT);
}
void loop() {
analogWrite(PWM, 1);
Time = millis();
while (millis() - Time < 1000){
if (digitalRead(buttonPin) == HIGH) {
sum ++;
}
}
Serial.println(sum);
sum = 0;
Time = 0;
}
шикарный код :)
А где в нем детектор импульсов ? Вы понимаете, что для того чтобы детектировать импульс - нужно поймать момент перехода между LOW и HIGH - или наоборот.
В вашем коде ничего похожего нет, он просто в цикле считывает уровень пина. Если на пине постоянный HIGH - счетчик насчитает столько, сколько раз ваш код успеет выполнится за секунду.
Более того, этот код будет неверно считать импульсы и при тех значениях ШИМ, где импульсы все-таки есть
В общем, как я и писал вначале - измеряете чепуху
Похоже вы правы, надо ловить переход.
А количество чего он насчитывает в данном случае?
для ШИМ 255 - число "оборотов" цикла while() в секунду. Для других ШИМ будет меньше
Немного не в тему, но думаю пригодится.
Стояла задача сделать BLINK на ШИМе, её можно приспособить и под ваши цели
1. Шимим пин ардуино связанный с прерыванием, использовал ПИН 3 прерывание INT1
2. В процедуре прерывания увеличиваем счетчик
Осталось только дать точку отсчета запомнив значение millis()
и через отрезок в 1000 миллисекунд, останавливаем прерывания и считываем значение счётчика
Как-то так...
Я правда не настоящий сталевар, делаю по крестьянски, ГУРУ наверное подскажут как правильно
ЗЫ кстати это analogWrite(PWM, 1); изменить на это analogWrite(PWM, 0х80); будет правильней (дути 50%)
Хм, а как количество оборотов while связано с шим? Разве скорость прохождения цикла не привязано к скорости процессора?
никак
1. Вряд ли у кого возникнет желание "повторять эксперимент", результат которого известен заранее.
2. Чем выдвигать необоснованные предположения и предлагать кому-то их проверить, лучше бы взяли, да сами посмотрели осциллографом. Глядишь, и появились бы какие-то зачатки понимания, какие "токи" бывают в компьютерной технике.
Дело было вечером, делать было нечего:
Набросок и вывод порта:
ЗЫ на самом деле о точности в 0,2% на рассыпухе раньше можно было только мечтать )))
и еще один набросок, генератор сделан на таймере, частота 5 Кгц, смотрим разброс показаний:
0,0014 = 0,14% )))
Код:
да в строках 5 и 6 можно и ручками установить делители
Попробовал, а насколько точно измеряет на частоте 100кГц
И на пределе этой технологии )))
"А девкой был бы краше" )))
И вывод:
и еще один набросок, генератор сделан на таймере, частота 5 Кгц, смотрим разброс показаний:
0,0014 = 0,14% )))
разброс был бы неплох, если бы среднее значение совпало с теоретическим. А оно занижено на 30 гц - ошибка вчетверо выше "разброса", что полностью обесценивает эту "кучность" :) Где-то в счетчике систематическая ошибка?
По подключению - правильно я понял, выход 11 физически подключен на вход прерывания пин 3?
По подключению - правильно я понял, выход 11 физически подключен на вход прерывания пин 3?
если верхние скетчи, то да, на крайнем на 5 ногу
а если коээфициенты ввести в соответствии с калькулятором, то:
Интересно, какой теоретический предел в частоте вызова функции прерывания для ардуино нано, у меня получается 150 килогерц ...
ЗЫ... тема поменялась на частотомер и первый пост не соответсвует...
способна ли Ардуино прочитать ШИМ с частотой 5 кГц? Заполнение 0 - 100%. Мне необходим вывод значения в процентах.
в процентах чего от чего? / это Скважность на частоте 5 кГц измерить? указав частоту и скважность...?
чатотомер это хорошо, но неколько не соответсвует ТЗ первого поста...
ЗЫ... тема поменялась на частотомер и первый пост не соответсвует...
способна ли Ардуино прочитать ШИМ с частотой 5 кГц? Заполнение 0 - 100%. Мне необходим вывод значения в процентах.
в процентах чего от чего? / это Скважность на частоте 5 кГц измерить? указав частоту и скважность...?
чатотомер это хорошо, но неколько не соответсвует ТЗ первого поста...
Для измерения скважности я пользовался библиотекой от ЕвгенийП правда для частоты 100 герц, позволяет измерять с точностью 0.1 микросекунды, ТС это устроит?
скважности я пользовался библиотекой от ЕвгенийП правда для частоты 100 герц, позволяет измерять с точностью 0.1 микросекунды, ТС это устроит?
это был вопрос к ТС... просто несколько раз перечитывал первый пост, так и не понял о каких процентах идет речь...
да и топик был открыт 2 месяца назад, а недавно поменял проф ариентацию на простой частотомер
скважности я пользовался библиотекой от ЕвгенийП правда для частоты 100 герц, позволяет измерять с точностью 0.1 микросекунды, ТС это устроит?
это был вопрос к ТС... просто несколько раз перечитывал первый пост, так и не понял о каких процентах идет речь...
да и топик был открыт 2 месяца назад, а недавно поменял проф ариентацию на простой частотомер
я так понимаю о DUTY а хотел видимо этого )))
Интересно, какой теоретический предел в частоте вызова функции прерывания для ардуино нано, у меня получается 150 килогерц ...
Где-то так.
В проекте http://arduino.ru/forum/proekty/floppy-hdd-music я разгонял прерывания до 110 кГц. Правда, при единственном голосе. И еще ставил условие, чтобы для фонового процесса оставалось не менее некоторого процента времени. Если мне не изменяет память, это было 50%.
выше 150кгц у меня миллис падает, тикает в 4 раза медленней
Время выполнения millis() 4-6 мкс.
на 150 кгц расчетное время между вызовами прерывания где-то 3,3 мкс, ещё отрабатывает, а стоит счетчик грузить значением 52 вместо 53 и всё - затык...
Значит нормально будет порядка 10 килогерц, время и на другие операции останется
Все куда проще.
Частоту можно узнать таймером считывая и обнуляя TCNT по прерыванию.
А зная частоту посчитать скважность замерив длинну лог1, функцией pulseIn();
Больше того pulseIn можно померить HIGH и LOW, их отношение скважность, а единица деленная на сумму частота.
Так точность будет ниже.
В идеале HIGH тоже лучше таймером мерять, но там уже код усложняется.
Обоснуйте. С измерением частоты да, со сважностью на этой частоте и выводом в процентах какая будет ошибка? Зато трудозатраты несоимеримо меньше.
Об этом, еще в посте #30 озвучено, я даже скетчик, поправив для ардуины нано скидал, правда не проверял:
Проверил, измеряет как бык по дороге прошёл )))
Всё не просто плохо, а очень плохо, что по нижним частотам, что по верхним, видимо алгорим подсчёта не совсем удачный
На WAVGAT всё выглядит аналогично плохо, в оригинале процессор был atmega8 может косяки адаптирования?
Написал, хотел проверить, но сдернули работать
Написал, хотел проверить, но сдернули работать
Проверил на WAVGAT, как то так: (соединял 11 и 8 пины)
Код:
Если соединяю пин 2 и пин 11 (на 11 меандр частоты 25кгц обязан быть)
вот так вот вроде правильно измеряет, метод какой-то получился частотозависимый:
Неправильно так
FRQ=250000/(_HL+_LL)*4;
Не нужно умножать правую часть на 4, я уже левую поделил на 4.
Иначе было бы так:
FRQ=1000000/((_HL+LL)*4);
иначе частота вычисляется неверно
Ну по логике: 1 тик =4мкс,
Потому как множитель 64/16000000(частота CPU)=0,000004
В секунде 1е6 мкс.
FRQ=1000000/((_HL+LL)*4);
А это вроде как то же самое, что и
FRQ=250000/(_HL+_LL);
Завтра, если время будет проверю на стенде, где генерировать частоту/скважность ШИМ буду генератором
Только int надо заменить на word или unsigned int для HL LL и скважность перевернуть HL/(HL+LL)*100
Ну можно и множители менять на ходу. Но тут не разработка конечного продукта а просто некая концепция
Концепция работает.
Не ясно пока почему в протеусе при 50/50 высокий уровень импульса всегда длинее низкого...
Для TC - на 16 МГц чипе без предделителя (таймер на частоте кварца) диапазон измерений будет 4-94 процента. (по методу перехвата прерывания по входу)