Аппаратная настройка частоты на ардуино Уно

Kakmyc
Offline
Зарегистрирован: 15.01.2018

"Нет повести печальнее на свете,
чем повесть о дебиле в интернете ..."

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

продолжение

Сцена первая.
Чуду был дан конкретный ответ в цифрах и информация
по методам расчетов.
Шло время....

Сцена вторая.
Чудо появилось на другом ресурсе, с вопросом о том,
почему он не может выставить нужную ему частоту ШИМ.
с примером где то спизженного кода.
На что ему был дан , ответ , что перед настройкой таймеров их
следует сбрасывать.
А код типа TCCR1B|=(0 сдвигWGM11) это гавно говняное. (Как корректно вывести символы сдвига ?)

Сцена третья
( ресурс тоже наверное)
Чудо пожаловалось на то, что он заводит таймер и все должно работать,
но ШИМ нужной частоты на пинах (абсолютно левых) отсутствует.
Чуду было объяснено, что аппаратные пины привязаны жёстко
и менять их смысла нет никакого.

Сцена четвертая

ШИМ вроде работает, но в программе написанной
(во всех смыслах) Чудом, частота ШИМ ~400Гц, хотя таймер настраивается
на 150Гц. Примерно так и звучал вопрос.

Было объяснено, что если таймер настраивается ручками,
то нет никакого смысла в вызове функции analogWrite.
тем более в виде : analogWrite(PWM1,OCR1A);
Кроме того, полный код был написан и выложен специально по
просьбе нашего Чудесного друга.
С полной настройкой регистров и осцилограммой.
Что опять же не помешало ещё раз задать этот вопрос.

Сцена пятая

Автору прилетело оповещение, о сообщении, в котором было указано, что
код выдает ШИМ, частотой в два раза меньше заявленной.
Я бросил все , собрал макет , залил код , проверил своим
любимым fluke 190-204...
Потратил 40мин жизни.
Пиздежь...
Все работает ровно так, как и должно работать.
Сделал вывод, что помогать дебилу бесполезно и
сослался на то, что калькулятор и осциллограф бракованные...

Сцена шестая.
РАЗВЯЗКА.
Чудо написало, что да все работает нормально ,
а написано было данное гавно для того, что бы
я , ОТОЗВАЛСЯ НА ЕГО ПРОСЬБЫ О ПОМОЩИ...
Тебя что мама дома в ванной ,наполненной рыбным супом, рожала ?
А собственно говоря, с какого такого перепугу
кто то должен отзывается на твои просьбы ?
Тут до меня дошло, что Чудо относится к категории
риэлторов/перекупов/прочихпидорасов(нужное зачеркнуть).
И я решил что "Йенг тебе по всей морде лица нужно размазать",
а не код за тебя писать.

PS. да у меня бомбит, но от такого отношения
от того кому помогаешь, забомбит у любого.

nik182
Offline
Зарегистрирован: 04.05.2015

hristo3 пишет:

Возможно моя программа скорее всего не правильная, потому что я хотел так: Чтобы А 0 изменял ШИМ который на 9 пине,а А1 на 10 пине и они друг другу не мешали. Из  предыдущих коментариев об инертности я сделал вывод что отбросить часть входных  можно при помощи функции delayЯ сделал задержку 15 мс потом сделал 25 мс.Это не привело к результату раздельного управления,хорошо еще осталось повесить емкость на входа.(увидел из сообщений пкф)Я не знаю где взять эту информацию.Администратор если несу спам удали пожалуйста все мои сообщения.Заканчимваю с Ардуино.!Всем спасибо за внимание!!!

О! Ну как же можно быть таким упоротым. Задержка здесь не поможет, если ты не считываешь после задержки ещё раз тот же канал. Если после задержки считываешь другой канал, то переключение происходит после задержки. Поэтому последовательность действий такая. Считываем значение канала и забываем про него - этим мы переключили АЦП на нужный канал. Делаем задержку. 1мс будет достаточно! Ещё  раз считываем тот же канал - получаем правильное значение. Считываем второй канал, задержка 1 мс, считываем второй канал ещё раз и используем правильное значение.

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

Вроде, суббота уже.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

hristo3 пишет:

Из  предыдущих коментариев об инертности я сделал вывод что отбросить часть входных  можно при помощи функции delayЯ сделал задержку 15 мс потом сделал 25 мс.

Мне непонятно, как Вы пришли к такому выводу, и вообще, какое отношение delay() имеет к "отбросить".

Отбросить - это буквально следующее.:

ValUP = analogRead(joyUP);

ValUP = analogRead(joyUP);

Т.е. мы читаем первый раз, но результат не используем, после чего читаем второй раз в туже переменную (затирая значение с первого раза) и уже это значение используем для дальнейших вычислений. 

Еще: Вам уже неоднократно указывалось, что для оценки нужно знать выходное сопротивление источника. В вашем случае нужно знать номинал потенциометра. Но сами Вы, очевидно, посчитать постоянную времени не умеете, а с форумчанами (чтобы они Вам помогли) информацией не делитесь.

Если окажется, что сопротивление велико, то, вероятно, действительно между двумя вызовами analogRead() нужно вставить delay(). Т.е. должно получиться: 

ValUP = analogRead(joyUP);

delay(15);

ValUP = analogRead(joyUP);

Цитата:

Это не привело к результату раздельного управления,хорошо еще осталось повесить емкость на входа.(увидел из сообщений пкф)Я не знаю где взять эту информацию.

Входная емкость АЦП указана в дэйташите на контроллер. И рекомендации по выходному сопротивлению источника - там же.

 

hristo3
Offline
Зарегистрирован: 01.09.2022

Защекочу то потери сознания;)

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

hristo3 пишет:
Защекочу то потери сознания;)
Косите под тролля? Неудачно. Присоединяюсь к #47

Dumper
Offline
Зарегистрирован: 21.09.2020

Чувак, я тоже периодически обращаюсь к Кактусу за помощью. Прочитав мое сообщение в ВК, он делает паузу. Вероятно, блюëт или матерится с моей писанины и мировосприятия, но дебилом пока не называет. У меня ещё есть шанс)
Человек он грамотный, но без эмоций. Выдаëт информацию чëтко и быстро. И требует такого же оперативного восприятия.
В твоëм случае повестку в ПНХ тебе вручили, придётся перечитать всю тему, чтобы заполучить решение.

hristo3
Offline
Зарегистрирован: 01.09.2022

Спасибо большое всем кто участвовал в беседе! А так же тем кто развешивал ярлыки все таки буду объективным все равно мне помогли. Я еще с большим азартом окунулся в поиск решения, так как разведка не сдается!;)Способ "отбросить" результата не дал, сделал задержку тоже не получилось. Начал подумывать о  том чтобы что то менять в ADMUX и ADCSRA но это уже для взрослых ,хотя надо чуть позже разобраться. Вообщем решение подошло  отсюда, наверное это из  сферы емкости и инертности я подтянул аналоговые входы и все заработало.

hristo3
Offline
Зарегистрирован: 01.09.2022

Вот код

01#define joyUP A0
02#define joyDown A1
03#define  PWM1 9
04#define  PWM2 10
05 
06int ValUP;
07int ValDown;
08void setup() {
09  Serial.begin(9600);
10digitalWrite(14, HIGH);
11digitalWrite(15, HIGH);
12pinMode(joyUP,INPUT);
13pinMode(joyDown,INPUT);
14pinMode(9,OUTPUT);
15pinMode(10,OUTPUT);
16TCCR1A=0;
17TCCR1B=0;
18TCCR1B|=(1<<CS11);
19TCCR1A |= (1 << COM1B1)|(1 << COM1A1);
20 ICR1=13332;
21TCCR1A |=(1 << WGM11);
22 
23TCCR1B |=(1 << WGM12)| (1 << WGM13);
24 
25}
26 
27void loop() {
28  ValUP = analogRead(joyUP);
29   delay(1);
30    ValUP = analogRead(joyUP);
31     
32  Serial.print(F("ValUP "));Serial.println(ValUP);
33  
34 OCR1A= map(ValUP,0,1023,0,13332);
35  Serial.print(F("OCR1A "));Serial.println(OCR1A);
36 
37    ValDown = analogRead(joyDown);
38     delay(1);
39       ValDown = analogRead(joyDown);
40       
41  Serial.print(F("ValDown "));Serial.println(ValDown);
42 OCR1B= map(ValDown,0,1023,0,13300);
43  
44   Serial.print(F("OCR1B "));Serial.println(OCR1B);
45 
46}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

каков номинал переменных резисторов?

hristo3
Offline
Зарегистрирован: 01.09.2022

10 ком

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

hristo3 пишет:
10 ком

этого не может быть потому что не может быть никогда, у вас верхнее плечо резистора ВСЕГДА меньше внутреннего подтягивающего

nik182
Offline
Зарегистрирован: 04.05.2015

Странно. В обведённом абзаце написано, что подтягивающие резисторы на аналоговых входах используются в цифровом режиме, а в аналоговом они вносят погрешность в измерения. Как они смогли помочь в данном случае непонятно. 10к переменники достаточно малы, чтобы за 1 мс задержки полностью успели перезарядиться цепи АЦП. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

hristo3 пишет:

Это неправильный совет.

Подтяжка включается так:

pinMode(14, INPUT_PULLUP);

Собственно, приведенный на скриншоте способ тоже работает, но только для некоторых моделей Ардуино. Это связано со схемотехникой контроллеров AVR. 

Цитата:

, наверное это из  сферы емкости и инертности я подтянул аналоговые входы и все заработало.

Это неправильное решение.

Если Вам даже кажется, что "все заработало", то это далеко не так, и рано или поздно Вы с этим столкнетесь.

hristo3
Offline
Зарегистрирован: 01.09.2022

hristo3
Offline
Зарегистрирован: 01.09.2022

Согласен INPUT_PULLUP,я его хотел применить

hristo3
Offline
Зарегистрирован: 01.09.2022

Т.е если я буду использовать  INPUT_PULLUP,то это будет правильное решение?

hristo3
Offline
Зарегистрирован: 01.09.2022

ua6em пишет:

hristo3 пишет:
10 ком

этого не может быть потому что не может быть никогда, у вас верхнее плечо резистора ВСЕГДА меньше внутреннего подтягивающего

Если бы знал как скинуть видео ,то скинул бы.

nik182
Offline
Зарегистрирован: 04.05.2015

hristo3 пишет:

Т.е если я буду использовать  INPUT_PULLUP,то это будет правильное решение?

Нет. Сопротивление PULLUP резистора больше 100кОм. Попробуй посчитать как изменится сопротивление 5к - среднее положение переменника - если параллельно ему подключить 100кОм? Эти изменения ни как не могут повлиять на заряд цепей АЦП. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

Попробуй посчитать как изменится сопротивление 5к - среднее положение переменника

Вообще-то "среднее положение переменника" 2.5к.

nik182
Offline
Зарегистрирован: 04.05.2015

andriano пишет:

nik182 пишет:

Попробуй посчитать как изменится сопротивление 5к - среднее положение переменника

Вообще-то "среднее положение переменника" 2.5к.

10к с характеристикой А в режиме именно пременниика а не реостата?

hristo3
Offline
Зарегистрирован: 01.09.2022

Именно переменника.

hristo3
Offline
Зарегистрирован: 01.09.2022

Реостата переменника

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я и говорю, подтягивающий резистор тут как слону дробина

hristo3
Offline
Зарегистрирован: 01.09.2022

Переменника реостата.Вы что издеваетесь?

nik182
Offline
Зарегистрирован: 04.05.2015

hristo3 пишет:
Переменника реостата. Вы что издеваетесь?

Режим реостата это когда регулируемый вывод соединён с одним из крайних.  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

andriano пишет:

nik182 пишет:

Попробуй посчитать как изменится сопротивление 5к - среднее положение переменника

Вообще-то "среднее положение переменника" 2.5к.

10к с характеристикой А в режиме именно пременниика а не реостата?

В режиме потенциометра.

А что, в джойстике переменник подключается как-то иначе?

nik182
Offline
Зарегистрирован: 04.05.2015

andriano пишет:

В режиме потенциометра.

А что, в джойстике переменник подключается как-то иначе?

Да нет. Не иначе. Тогда как при линейной характеристике про повороте на 50% - среднее положение - из 10к получается 2.5 к? В джойстики ставят именно А, что бы в среднем положении было 50% - ровно половина. 

И хочу заметить что нет характеристики где 50% оборотов  соответствуют 25% сопротивления.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В среднем положении у нас снизу 5 кОм и сверху 5 кОм.

Как не трудно догадаться, они соединены параллельно, следовательно, сопротивление 2.5 кОм.

nik182
Offline
Зарегистрирован: 04.05.2015

Да уж. Неожиданный поворот. Я ж имел в виду сопротивление подключенное на прямую к PULLUP резистору. 2.5к это выходное сопротивление каскада, без учёта сопротивления цепей питания, через которые собственно и подключены резисторы. PULLUP резистор подключен не параллельно этому конгломерату. Схема получается сложнее да и расчёт тоже усложняется. А так да. Абсолютно согласен с 2.5к при расчёте постоянных времени. В даташите емкость S/H конденсатора АЦП 14пФ. Время перезарядки получается десятки наносекунд. Это на столько мало, что даже первое преобразование должно давать правильные цифры. У меня к пульту от вертолёта к резисторам джойстика 30к припаяны входы леонардо - входы АЦП такие же- в исследовательских целях. Леонардо генерит PWM для управления наной машинки. Считываю положение резюков 1 раз. Ничего не отбрасываю. Никаких влияний резюков нет. И до 100к в общем и не ожидается. А то что 100к PULLUP резистора сняло проблему говорит только о том, что резюки у ТС не 10кОм  а как минимум 10МОМ. Только в этом случае 100к может повлиять.  

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nik182 пишет:

Странно. В обведённом абзаце написано, что подтягивающие резисторы на аналоговых входах используются в цифровом режиме, а в аналоговом они вносят погрешность в измерения. Как они смогли помочь в данном случае непонятно.

  Возможно, схема "джойстика" собрана  неправильно. "Подтяжка", наоборот, приведёт к влиянию изменения одного сопротивления на другое ИМХО

 

hristo3 пишет:
Если бы знал как скинуть видео ,то скинул бы.

Неплохо бы схему подключения резисторов посмотреть, для общего развития))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

2.5к это выходное сопротивление каскада, без учёта сопротивления цепей питания, через которые собственно и подключены резисторы.

При номинале резистора более кОма сопротивление цепей питания можно считать равным 0. Что я и сделал.

Цитата:

PULLUP резистор подключен не параллельно этому конгломерату. Схема получается сложнее да и расчёт тоже усложняется. А так да. Абсолютно согласен с 2.5к при расчёте постоянных времени.

Хочешь сказать "по переменному току".

Так ведь в схеме нет частотно зависимых элементов. Следовательно, по постоянному току будет то же самое. 

Потенциометр, включенный между питанием и землей (а также во всех иных случаях, когда внутренним сопротивлением и того и другого можно пренебречь) имеет выходное сопротивление от 0 (в каждом из крайних положений) до R/4 - в среднем положении.

Цитата:

А то что 100к PULLUP резистора сняло проблему говорит только о том, что резюки у ТС не 10кОм  а как минимум 10МОМ. Только в этом случае 100к может повлиять.  

ТС вообще несет какую-то пургу.

Мне кажется, его утверждения помогло/не помогло имеет смысл обсуждать не раньше, чем он приведет схему, по которой у него все подключено.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Деду надо срочно новый сертификат разработать - Пургоносец )))

hristo3
Offline
Зарегистрирован: 01.09.2022

Дим-мычъ пишет:

nik182 пишет:

Странно. В обведённом абзаце написано, что подтягивающие резисторы на аналоговых входах используются в цифровом режиме, а в аналоговом они вносят погрешность в измерения. Как они смогли помочь в данном случае непонятно.

  Возможно, схема "джойстика" собрана  неправильно. "Подтяжка", наоборот, приведёт к влиянию изменения одного сопротивления на другое ИМХО

 

hristo3 пишет:
Если бы знал как скинуть видео ,то скинул бы.

Неплохо бы схему подключения резисторов посмотреть, для общего развития))

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

hristo3 пишет:

[

Это верно. Ещё бы "подтяжку" увидеть

hristo3
Offline
Зарегистрирован: 01.09.2022

Дим-мычъ пишет:

hristo3 пишет:

[

Это верно. Ещё бы "подтяжку" увидеть

Микроконтроллер Atmega имеет программируемые встроенные подтягивающие к питанию резисторы 20 кОм.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

как может повлиять подтягивающее 20 ком на входное не более (а в основном менее) 2.5 ком, практически никак, то-есть вы нас тут троллите?

hristo3
Offline
Зарегистрирован: 01.09.2022

ua6em пишет:

как может повлиять подтягивающее 20 ком на входное не более (а в основном менее) 2.5 ком, практически никак, то-есть вы нас тут троллите?

Как Вам видео показать?Я не могу найти способ в форуме.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

hristo3 пишет:

 Микроконтроллер Atmega имеет программируемые встроенные подтягивающие к питанию резисторы 20 кОм.

Точнее 20-50 кОм.

В Вашем случае, возможно дело ещё в сборке схемы, слишком длинных проводах, например.

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

ua6em пишет:

как может повлиять подтягивающее 20 ком на входное не более (а в основном менее) 2.5 ком

Вообще-то немного повлияет, т.к 20+20+2.5 при параллельном включении будет уже 2кОм.

Но это должно давать погрешность в измерении. Я бы попробовал лучше уменьшить сопротивление переменных резисторов, даже и до 5кОм.

 Тоже сталкивался с "необъяснимыми чудесами" в электронике, большинство со временем, объяснялись