Вывод данных в serial - ардуино начинает замедляться
- Войдите на сайт для отправки комментариев
Добрый день!
Столкнулся с проблемой, что ардуино выводит данные в serial, но через некоторое время начинает выводить из раз в секунду, что еще и замедляет работу общего цикла.
<!--break-->
к ардуине подключен binary counter CD74HCT393, который считает количество импульсов.
Ардуина берет это число и отправляет в serial
и пропорционально числу выставляет напряжение на одной из ножек с PWM
в цикле стоит задержка 100мс.
Какое-то небольшое время (от 3 до 10 минут) все работает отлично, но потом, значения начинают приходить раз в секунду, и соответственно, вывод на ножке c PWM так же медленно изменяется.
Попробовал убрать печать в serial, и следил только за значеним PWM - все отлично работает.
Раньше у меня программа была на ардуино, которая принимала значение через serial и меняла pwm, так она тоже через какое-то время начинала тупить. Я тогда решил вопрос тем, что если порт "подвисал", то программа делала реконект порта, и дальше все опять отлично летело.
Нагуглить схожую проблему не получилось, возможно не по тем словам ищу.
Есть идеи как решить это затуп?
В строке <хер-знет-какая> ошибка в переменной <хер-знает-какой>.
Чудо! код вставь. И, плз, по правилам, указанным в прикрепленной теме.
Прошу прощения, вот код)
На строке 73 закоментированный вывод значения счетчика,
На строке 84, выводил значение PWM для отладки
(на строках 79-81 исправление косяка с DAC, что при увеличении битности, при команде analogWrite(pin, 255) - PWM заполняется на 100%, хотя при 10 битах, это четверть)
Платформа: Arduino Pro Micro (ATmega32u4), но так же затупы замечены на Uno (ATmega 328)
int q0 = 7; int q1 = 6; int q2 = 5; int q3 = 4; int q4 = 1; int q5 = 0; int q6 = 2; int q7 = 3; int q8 = 21; int q9 = 20; int q10 = 19; int q11 = 18; int q12 = 15; int q13 = 14; int q14 = 16; // int q15 = 10; 10й пин ушел для шима на выход int dac = 10; int mr = 8; int time = 50; int maxValue = 5000; int noise = 1000; float outValue = 0; void setup () { TCCR1A = TCCR1A & 0xe0 | 3; TCCR1B = TCCR1B & 0xe0 | 0x09; // initialize serial communication at 9600 bits per second: Serial.begin(2000000); // make the pushbutton's pin an input: pinMode(q0, INPUT); pinMode(q1, INPUT); pinMode(q2, INPUT); pinMode(q3, INPUT); pinMode(q4, INPUT); pinMode(q5, INPUT); pinMode(q6, INPUT); pinMode(q7, INPUT); pinMode(q8, INPUT); pinMode(q9, INPUT); pinMode(q10, INPUT); pinMode(q11, INPUT); pinMode(q12, INPUT); pinMode(q13, INPUT); pinMode(q14, INPUT); pinMode(mr, OUTPUT); pinMode(dac, OUTPUT); } void loop() { //peripheral_loop(); int qState[] = {digitalRead(q14),digitalRead(q13),digitalRead(q12),digitalRead(q11),digitalRead(q10),digitalRead(q9),digitalRead(q8),digitalRead(q7),digitalRead(q6), digitalRead(q5),digitalRead(q4),digitalRead(q3),digitalRead(q2),digitalRead(q1),digitalRead(q0)}; digitalWrite(mr, HIGH); digitalWrite(mr, LOW); unsigned int value = 0; for (byte i=0; i<15; i++) { value *= 2; value += qState[i] ; } unsigned int freq = value *1e3/time; //Serial.println(freq, DEC); outValue = (freq - noise); if (Out outValue = outValue*1023/maxValue; outValue = int(outValue); if (outValue == 255) { outValue = 254; } analogWrite(dac, outValue); //Serial.println(outValue, DEC); delay(time); }А в#76 селёдку заворачивали?
Оу. Там должна была быть проверка на outValue > 1023... но я отвлекся.
Вчера поработал с контроллером - затупов не обнаружил. Странно это. но ладно.
Вопрос пока что закрыт, спасибо за уделенное время!