За исцеления от хвори настойками и отварами когда-то на костре, говорят, жгли... Колдовство! Интересно было бы посмотреть, как бы Клапауций 003 инквизиции рассказывал про электричество и ФМРТ....
Одно другому не мешает. Катушку буду прикладывать к башке тем кто Диспезу читать не хочет)))))))) Мне сама идея нравиться, что люди что делают, деляться друг с другом. Я то по аптекам не хожу а оказываются туда по 3-5 т.р. могут за раз относить. Я там перекись для плат покупал и настойку прополиса, еще не купил прополис у пасечника чтобы свою сделать.
Одно другому не мешает. Катушку буду прикладывать к башке тем кто Диспезу читать не хочет)))))))) Мне сама идея нравиться, что люди что делают, деляться друг с другом. Я то по аптекам не хожу а оказываются туда по 3-5 т.р. могут за раз относить. Я там перекись для плат покупал и настойку прополиса, еще не купил прополис у пасечника чтобы свою сделать.
а источник прополиса кстати это тополь и возможно осина )))
Нас с сестрой мать в детстве лечила прополисом на спирту и еще банка с травами то ли на водке толи на спирту на все случаи жизни. И еще банки были на спину, и горчичники)) Но сестра поумнела и прозрела, не прочь побаловаться антибиотиками, дочь лечит антибиотиками, прям не сестра мне.
AJGrupp, правильно ли я понимаю, что на выложенном Вами видео именно то, о чём говорит Мишин?:
"... Физического схлопывания в центр ... Нужно сделать сдвигом фазы ... Второй объект это динамическая (?. невнятно) внешняя среда, которая схлопывается...".
Я в теме катушек Мишина с самого первого упоминания в Интернете. И ни разу не видел, чтобы сам Мишин или или кто-то из сообщества наглядно продемонстрировал. Только на словах.
это второе, что я пробовал, отказался, тоже цифровой фильтр применял, но первого порядка, сильно скакали показания, в абсолютных величинах единиц 10
На сегодняшний день INA219 самый стабильный вариант, в моих заказах на десяток - 2-3 неисправных было, да и INA удобней своим интерфейсом и, всё таки это законченное микропроцессорное устройство )))
да, программирование для меня просто хобби, так что пользовался "подсказкой зала" велика вероятность, что просто не одолел )))
Я заказал по одной и ту и ту. Посмотрим, с кем отношения сложаться)) Тут скорее проблема не в самой МAХе, а в АЦП меги. Очень "чувствительны" к трасировке, фильтрации и питанию....
может пока идут запчасти на программой удержания частоты поразмышляете?
ua6em, на работе и в жизни пока перегруз. Да и практика показала, что лучше сразу в железе рабработать. Подложку для катушки в 3d замоделировал, синтсинтезатор почти в руках - в сортировочном центре моего гогорода. Где купить медь 0.5 нашёл. Подразгребу дела и займусь.
1 Энкодер подключен кнопка-5, управление 6 и 7. Что он делает?
2 Зумер 12, pin INT1-3 шимим 490 Гц. Что это и зачем?
Спасибо за ответ, хочу повторить Ваш проект.
1. Пока ничего, будет работа с меню.
2. Это такой извращённый способ получения 1 секундных импульсов, суть - выводим ШИМ на пин, по умолчанию это частота 490 герц, так как этот пин привязан к прерыванию, 490 раз в секунду вызывается это прерывание в котором увеличивается значение переменной на единицу, при достижении этого значения инвертируется пин связанный с зуммером, то-есть таким образом зуммер пищит с периодом 1 секунда (если ему надо пищать)
PS способ на самом деле позволяет подобрать наиболее благозвучное звучание зуммера изменяя всего лишь одну константу
AJGrupp, правильно ли я понимаю, что на выложенном Вами видео именно то, о чём говорит Мишин?:
"... Физического схлопывания в центр ... Нужно сделать сдвигом фазы ... Второй объект это динамическая (?. невнятно) внешняя среда, которая схлопывается...".
Я в теме катушек Мишина с самого первого упоминания в Интернете. И ни разу не видел, чтобы сам Мишин или или кто-то из сообщества наглядно продемонстрировал. Только на словах.
Приветствую! Супруга попросила собрать девайс. Поизучав инет наткнулся на ваш проект. Пытаюсь повторить но на три раза прочитав тему нак и не пришел к общему знаменателю. Вернее вы перепираясь не пришли. Выписал все но при подключении и опросе 9833 не выдает свой адрес. Это нормально?
Проект от ua6em не компилируется - пишет, что невозможно скомпилировать для этой платы . У меня nano с micro usb. Другой проект из темы заливается но 219 показывает все по нулям и больше не реагирует. Куда двигаться пока не придумал...
Очень жаль, что уже третий месяц у вас в теме тишина. Может я чем-то смогу помочь? не программист. Электронщик больше. Тема заинтересовала. Тем более супруге помощь нужна теперь....
Проект от ua6em не компилируется - пишет, что невозможно скомпилировать для этой платы . У меня nano с micro usb. Другой проект из темы заливается но 219 показывает все по нулям и больше не реагирует. Куда двигаться пока не придумал...
Очень жаль, что уже третий месяц у вас в теме тишина. Может я чем-то смогу помочь? не программист. Электронщик больше. Тема заинтересовала. Тем более супруге помощь нужна теперь....
Что скажете, господа форумчане?
скажу так, сделай по быстрому на XR2206 с ручной настройкой тока, ток надо по максимумому (600ма - 1 ампер) но короткие экспозиции, минут по 10-15, так только в сон потянуло, выключать, подключать иммуномодуляторы, мёд, красная икра, любые естественные бады...
Скетч не выложу, не моя собственность, в разработке новый, он работает на макетке, на AD9833...
Какой именно не компилируется и под какой версией IDE?
Сделай на ХR2206, вот схему нашёл в сети. Если пищалка не нужна, то можно не ставить. Это видимо к китайскому таймеру схема генератора, раз бузер всунули.
скажу так, сделай по быстрому на XR2206 с ручной настройкой тока, ток надо по максимумому (600ма - 1 ампер)
Скетч не выложу, не моя собственность, в разработке новый, он работает на макетке, на AD9833...
Какой именно не компилируется и под какой версией IDE?
я с удовольствием бы, но в нашей глуши 2206 вообще не найти. Проще было выписать с китая 9833.
Собрал тоже на макетке. не заливается ваш скетч с гигхаба. 1.8.10 (пробовал разные)
Есть один человек ардуинщик до глубины как говориться, но очень уж занят. Хотя данным проектом я его заинтересовал - очень надеюсь и он присоединится...
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
02
03
(.text+0x0): multiple definition of `Adafruit_MCP4725::Adafruit_MCP4725()'
04
05
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
06
07
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
08
09
(.text+0x0): multiple definition of `Adafruit_MCP4725::Adafruit_MCP4725()'
10
11
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
12
13
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
14
15
(.text+0x0): multiple definition of `Adafruit_MCP4725::begin(unsigned char)'
16
17
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
18
19
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
20
21
(.text+0x0): multiple definition of `Adafruit_MCP4725::setVoltage(unsigned int, bool)'
22
23
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
24
25
collect2.exe: error: ld returned 1 exitstatus
26
27
Несколько библиотек найдено для "Adafruit_MCP4725.h"
28
Используется: C:\Program
29
Не используется: C:\Program
30
Несколько библиотек найдено для "Wire.h"
31
Используется: C:\Program
32
Не используется: C:\Program
33
Несколько библиотек найдено для "SPI.h"
34
Используется: C:\Program
35
Используем библиотеку Wire версии 1.0 из папки: C:\Program Files
36
Используем библиотеку SPI версии 1.0 из папки: C:\Program Files
37
Используем библиотеку Adafruit_MCP4725 версии 1.0.2 из папки: C:\Program Files
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c: In function '__vector_24':
02
03
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:447:49: warning: thisstatement may fall through [-Wimplicit-fallthrough=]
04
05
twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
06
07
^
08
09
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:448:5: note: here
10
11
caseTW_MR_SLA_ACK: // address sent, ack received
12
13
^~~~
14
15
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:529:9: warning: thisstatement may fall through [-Wimplicit-fallthrough=]
16
17
if(0 == twi_txBufferLength){
18
19
^
20
21
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:534:5: note: here
219 живая. Запустил. Меряет верно. Поправил везде все имена и места расположения, залился скет но на 40кHz так и стоит. ни на что не реагирует. Куда дальше копать?9833 что-то молчит... отсюда https://tsibrov.blogspot.com/2018/06/ad9833.html взял скетч на проверку, переназначил энкодер - по дисплею все отражает но на выходе тишина. вместо катушки подключил небольшой динамик. при касании 3 вывода - 50 герц наводится.
Большое подозрение, что 9833 мертвая. Как можно еще 100% проверить, что живая? Сканером должен определяться ее адрес или просто прописываем в нее значения и все?
Опять же на энкодер никакой реакции. Ни на нажатие ни на прокрутки...
Пришли с Китая 5 штук XR2206, все бракованые, наверное специально отбраковывают и на развес продают в Россию, так как ни чем не докажешь им, что не ты её спалил. Брал готовые генераторы у них, все работают. То есть генераторы КИТ, они комплектуют рабочими микрухами, а когда заказывашь одни микрухи, кладут тебе заведомый брак! Теперь если и буду заказывать, то буду продавцов предупреждать, что извлечение микросхем с посылки будет сниматься на видео, вполть до установке их в панельку рабочего генератора, вместе с осциллограммой, которую эти микросхемы на нём выдадут, (или не выдадут). И это видео будет доказательством в споре, ежели они положат брак, то деньги им придётся вернуть. Пусть думают перед тем,как брак отправлять.
про энкодер, пока не понятно, для чего он нужен, изначально предполагалось, что можно залить скетч генератора на ad9833.
Не сформировано требований, что будет реализовано для ручного режима, а автоматика работает и без него )))
ingfa, https://yadi.sk/d/8X1azfziMW01Pg это последнее что я делал и выкладывал, на схеме все модули какие нужны подписаны, там код от автора темы и библиотеки которые у меня компилировались. Ua6em, говрил что еще один нужен энкодер, активная пищалка и MCP4725. В 405 посту есть схема Alp и там он пишет про резистор который нужен чтобы исправить обрезанный синус. Так же с этой схемой работает код Владимира Циброва https://tsibrov.blogspot.com/2018/06/ad9833.html
вот код:
И меня есть предположения что ина 219 сиреневого цвета немного другой формы лучше чем синее , меньше брака. У Shurchik вроде такая стоит и Alp где тут фото выкладывал.
Отлично. Пока идет новая 9833 может и с энкодерами разберемся?
ua6em, в той версии платы что у вас под 2 энкодера пины на ардуине не в лучшем порядке был назначенные для травления, я там делал обводы, так как свободы в этом деле не имею я сделал по той схеме что была наскоряк. Переназначить для более компактной разводки эти пины только в другом порядке или на соседние я думаю это не проблема?
И в общем я понял что дорожки надо делать как можно толще и все заливать землей, помех чуть чуть меньше будет.
Мне пришли разъемы как на осциллографе и я купил еще разъемы под тюльпаны, и питание. Также обзавелся пищалками и MCP4725 пришла. Все это хозяйство пристрою. В этот раз думаю получиться уже законченная плата под травление!
И транзистор с АД9833 будем ставить чтобы до 1 вольта поднять?
1. по переназначению пинов пока не скажу, как там это делалось программно, надо пробовать
2. по пищалке тоже не помню на какой пин выводил, я с кодом бузе соригинальничал, тоже надо смотреть
3. Усиление надо добавить, всё таки режим провала синусоиды надо попробовать реализовать
вообще я приверженец простых решений, включил и пользуйся, таймер пожалуй да, сейчас подключил нажатие кнопки, попробую следующую функцию - короткие нажатия устанавливают таймер по кругу 5-10-15 минут, длинное запускает обратный отсчёт
а, сейчас за что тебя жгут, просветитель хренов!?
Андрэ! Тогда надо заняться чем0-то другим))))
был бы он программист, то просто бы бухал, а у него масса дел, яблоки вон подошли, кальвадос и оболю не ждёт...
Одно другому не мешает. Катушку буду прикладывать к башке тем кто Диспезу читать не хочет)))))))) Мне сама идея нравиться, что люди что делают, деляться друг с другом. Я то по аптекам не хожу а оказываются туда по 3-5 т.р. могут за раз относить. Я там перекись для плат покупал и настойку прополиса, еще не купил прополис у пасечника чтобы свою сделать.
Одно другому не мешает. Катушку буду прикладывать к башке тем кто Диспезу читать не хочет)))))))) Мне сама идея нравиться, что люди что делают, деляться друг с другом. Я то по аптекам не хожу а оказываются туда по 3-5 т.р. могут за раз относить. Я там перекись для плат покупал и настойку прополиса, еще не купил прополис у пасечника чтобы свою сделать.
а источник прополиса кстати это тополь и возможно осина )))
Нас с сестрой мать в детстве лечила прополисом на спирту и еще банка с травами то ли на водке толи на спирту на все случаи жизни. И еще банки были на спину, и горчичники)) Но сестра поумнела и прозрела, не прочь побаловаться антибиотиками, дочь лечит антибиотиками, прям не сестра мне.
АндрейS,
эко Вас занесло... "Эффект СТАДА" - он такой, отшибает самостоятельное мышление.
Когда чуток успокоитесь, гляньте одноминутное видео, может дойдёт. Обратите внимание, на 5 Вольт при 20 мА
https://www.youtube.com/watch?v=3_1BvnsPDRM
AJGrupp, правильно ли я понимаю, что на выложенном Вами видео именно то, о чём говорит Мишин?:
"... Физического схлопывания в центр ... Нужно сделать сдвигом фазы ... Второй объект это динамическая (?. невнятно) внешняя среда, которая схлопывается...".
Я в теме катушек Мишина с самого первого упоминания в Интернете. И ни разу не видел, чтобы сам Мишин или или кто-то из сообщества наглядно продемонстрировал. Только на словах.
Почему так? В чем тут проблема?
3) MAX471
это второе, что я пробовал, отказался, тоже цифровой фильтр применял, но первого порядка, сильно скакали показания, в абсолютных величинах единиц 10
На сегодняшний день INA219 самый стабильный вариант, в моих заказах на десяток - 2-3 неисправных было, да и INA удобней своим интерфейсом и, всё таки это законченное микропроцессорное устройство )))
да, программирование для меня просто хобби, так что пользовался "подсказкой зала" велика вероятность, что просто не одолел )))
может пока идут запчасти на программой удержания частоты поразмышляете?
ua6em, на работе и в жизни пока перегруз. Да и практика показала, что лучше сразу в железе рабработать. Подложку для катушки в 3d замоделировал, синтсинтезатор почти в руках - в сортировочном центре моего гогорода. Где купить медь 0.5 нашёл. Подразгребу дела и займусь.
Проект на Гитхабе, чтобы были разные версии.
Вопрсс к ua6em: ARDUINO UNO
1 Энкодер подключен кнопка-5, управление 6 и 7. Что он делает?
2 Зумер 12, pin INT1-3 шимим 490 Гц. Что это и зачем?
Спасибо за ответ, хочу повторить Ваш проект.
Вопрсс к ua6em: ARDUINO UNO
1 Энкодер подключен кнопка-5, управление 6 и 7. Что он делает?
2 Зумер 12, pin INT1-3 шимим 490 Гц. Что это и зачем?
Спасибо за ответ, хочу повторить Ваш проект.
1. Пока ничего, будет работа с меню.
2. Это такой извращённый способ получения 1 секундных импульсов, суть - выводим ШИМ на пин, по умолчанию это частота 490 герц, так как этот пин привязан к прерыванию, 490 раз в секунду вызывается это прерывание в котором увеличивается значение переменной на единицу, при достижении этого значения инвертируется пин связанный с зуммером, то-есть таким образом зуммер пищит с периодом 1 секунда (если ему надо пищать)
PS способ на самом деле позволяет подобрать наиболее благозвучное звучание зуммера изменяя всего лишь одну константу
Планируется ли доработка проекта с установкой начала и конца процесса, звукового оповещения?
Планируется ли доработка проекта с установкой начала и конца процесса, звукового оповещения?
да, как раз кнопкой энкодера и будет запускаться
АндрейS,
эко Вас занесло... "Эффект СТАДА" - он такой, отшибает самостоятельное мышление.
Когда чуток успокоитесь, гляньте одноминутное видео, может дойдёт. Обратите внимание, на 5 Вольт при 20 мА
https://www.youtube.com/watch?v=3_1BvnsPDRM
AJGrupp, правильно ли я понимаю, что на выложенном Вами видео именно то, о чём говорит Мишин?:
"... Физического схлопывания в центр ... Нужно сделать сдвигом фазы ... Второй объект это динамическая (?. невнятно) внешняя среда, которая схлопывается...".
Я в теме катушек Мишина с самого первого упоминания в Интернете. И ни разу не видел, чтобы сам Мишин или или кто-то из сообщества наглядно продемонстрировал. Только на словах.
Почему так? В чем тут проблема?
Всем тайным почитателям творчества AJGrupp посвящается http://arduino.ru/forum/otvlechennye-temy/katushka-mishina-i-ne-tolko-mi...
Для тех кто не в курсе, туда мы ходим мусорить и не только))
Приветствую! Супруга попросила собрать девайс. Поизучав инет наткнулся на ваш проект. Пытаюсь повторить но на три раза прочитав тему нак и не пришел к общему знаменателю. Вернее вы перепираясь не пришли. Выписал все но при подключении и опросе 9833 не выдает свой адрес. Это нормально?
Проект от ua6em не компилируется - пишет, что невозможно скомпилировать для этой платы . У меня nano с micro usb. Другой проект из темы заливается но 219 показывает все по нулям и больше не реагирует. Куда двигаться пока не придумал...
Очень жаль, что уже третий месяц у вас в теме тишина. Может я чем-то смогу помочь? не программист. Электронщик больше. Тема заинтересовала. Тем более супруге помощь нужна теперь....
Что скажете, господа форумчане?
Проект от ua6em не компилируется - пишет, что невозможно скомпилировать для этой платы . У меня nano с micro usb. Другой проект из темы заливается но 219 показывает все по нулям и больше не реагирует. Куда двигаться пока не придумал...
Очень жаль, что уже третий месяц у вас в теме тишина. Может я чем-то смогу помочь? не программист. Электронщик больше. Тема заинтересовала. Тем более супруге помощь нужна теперь....
Что скажете, господа форумчане?
скажу так, сделай по быстрому на XR2206 с ручной настройкой тока, ток надо по максимумому (600ма - 1 ампер) но короткие экспозиции, минут по 10-15, так только в сон потянуло, выключать, подключать иммуномодуляторы, мёд, красная икра, любые естественные бады...
Скетч не выложу, не моя собственность, в разработке новый, он работает на макетке, на AD9833...
Какой именно не компилируется и под какой версией IDE?
Библиотека отсутствующая в папке скетча
Что скажете, господа форумчане?
Сделай на ХR2206, вот схему нашёл в сети. Если пищалка не нужна, то можно не ставить. Это видимо к китайскому таймеру схема генератора, раз бузер всунули.
скажу так, сделай по быстрому на XR2206 с ручной настройкой тока, ток надо по максимумому (600ма - 1 ампер)
Скетч не выложу, не моя собственность, в разработке новый, он работает на макетке, на AD9833...
Какой именно не компилируется и под какой версией IDE?
я с удовольствием бы, но в нашей глуши 2206 вообще не найти. Проще было выписать с китая 9833.
Собрал тоже на макетке. не заливается ваш скетч с гигхаба. 1.8.10 (пробовал разные)
Есть один человек ардуинщик до глубины как говориться, но очень уж занят. Хотя данным проектом я его заинтересовал - очень надеюсь и он присоединится...
01
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
02
03
(.text+0x0): multiple definition of `Adafruit_MCP4725::Adafruit_MCP4725()'
04
05
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
06
07
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
08
09
(.text+0x0): multiple definition of `Adafruit_MCP4725::Adafruit_MCP4725()'
10
11
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
12
13
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
14
15
(.text+0x0): multiple definition of `Adafruit_MCP4725::begin(unsigned
char
)'
16
17
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
18
19
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\libraries\Adafruit_MCP4725\Adafruit_MCP4725.cpp.o (symbol from plugin): In function `Adafruit_MCP4725::Adafruit_MCP4725()':
20
21
(.text+0x0): multiple definition of `Adafruit_MCP4725::setVoltage(unsigned
int
,
bool
)'
22
23
C:\Users\1C28~1\AppData\Local\Temp\arduino_build_272562\sketch\Adafruit_MCP4725.cpp.o (symbol from plugin):(.text+0x0): first defined here
24
25
collect2.exe: error: ld returned 1
exit
status
26
27
Несколько библиотек найдено для
"Adafruit_MCP4725.h"
28
Используется: C:\Program
29
Не используется: C:\Program
30
Несколько библиотек найдено для
"Wire.h"
31
Используется: C:\Program
32
Не используется: C:\Program
33
Несколько библиотек найдено для
"SPI.h"
34
Используется: C:\Program
35
Используем библиотеку Wire версии 1.0 из папки: C:\Program Files
36
Используем библиотеку SPI версии 1.0 из папки: C:\Program Files
37
Используем библиотеку Adafruit_MCP4725 версии 1.0.2 из папки: C:\Program Files
38
exit
status 1
39
Ошибка компиляции для платы Arduino Nano.
Так XR2206 тоже с Китая все выписываем, так как у нас например цену ломят 150р. за штуку, с Китая я за 150 руб. 5 штук покупал.
Так XR2206 тоже с Китая все выписываем, так как у нас например цену ломят 150р. за штуку, с Китая я за 150 руб. 5 штук покупал.
Выписал... но когда прийдет... хотел на ардуинке собрать. Собрал но пнр не выходят...
у меня в 1.8.10 компилируется, немного поругался, но всё ок
01
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c: In function
'__vector_24'
:
02
03
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:447:49: warning:
this
statement may fall through [-Wimplicit-fallthrough=]
04
05
twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
06
07
^
08
09
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:448:5: note: here
10
11
case
TW_MR_SLA_ACK:
// address sent, ack received
12
13
^~~~
14
15
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:529:9: warning:
this
statement may fall through [-Wimplicit-fallthrough=]
16
17
if
(0 == twi_txBufferLength){
18
19
^
20
21
C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src\utility\twi.c:534:5: note: here
22
23
case
TW_ST_DATA_ACK:
// byte sent, ack returned
24
25
^~~~
Так XR2206 тоже с Китая все выписываем, так как у нас например цену ломят 150р. за штуку, с Китая я за 150 руб. 5 штук покупал.
у нас 400 -450 за штуку, XR2206 дешёвые из китая 50 штук 100% брак, деньги не вернули, брал внук приятеля, сказал фигня заморачиваться с возвратом )))
Так XR2206 тоже с Китая все выписываем, так как у нас например цену ломят 150р. за штуку, с Китая я за 150 руб. 5 штук покупал.
Выписал... но когда прийдет... хотел на ардуинке собрать. Собрал но пнр не выходят...
ina219 тоже много брака, меньше чем по 3 штуки лучше не брать
219 живая. Запустил. Меряет верно. Поправил везде все имена и места расположения, залился скет но на 40кHz так и стоит. ни на что не реагирует. Куда дальше копать?
9833 что-то молчит... отсюда https://tsibrov.blogspot.com/2018/06/ad9833.html взял скетч на проверку, переназначил энкодер - по дисплею все отражает но на выходе тишина. вместо катушки подключил небольшой динамик. при касании 3 вывода - 50 герц наводится.
Большое подозрение, что 9833 мертвая. Как можно еще 100% проверить, что живая? Сканером должен определяться ее адрес или просто прописываем в нее значения и все?
Опять же на энкодер никакой реакции. Ни на нажатие ни на прокрутки...
проверить сканером адрес, у меня неисправных не было, программа энкодера еще не написана )))
PS Вы там с тором поосторожнее, делайте классическую
Пришли с Китая 5 штук XR2206, все бракованые, наверное специально отбраковывают и на развес продают в Россию, так как ни чем не докажешь им, что не ты её спалил. Брал готовые генераторы у них, все работают. То есть генераторы КИТ, они комплектуют рабочими микрухами, а когда заказывашь одни микрухи, кладут тебе заведомый брак! Теперь если и буду заказывать, то буду продавцов предупреждать, что извлечение микросхем с посылки будет сниматься на видео, вполть до установке их в панельку рабочего генератора, вместе с осциллограммой, которую эти микросхемы на нём выдадут, (или не выдадут). И это видео будет доказательством в споре, ежели они положат брак, то деньги им придётся вернуть. Пусть думают перед тем,как брак отправлять.
по XR2206 есть проверенный продавец, были 100% исправные, но это не самые дешёвые микросхемы
Ссылочку на него можно?
проверить сканером адрес, у меня неисправных не было, программа энкодера еще не написана )))
PS Вы там с тором поосторожнее, делайте классическую
в 625 посте ссылка. понравилось как там реализован энкодер.
Сканер ничего не находит. сегодня выпаяю и отдельно буду пробовать.
Начало 3 дня тор а далее классика.
Подскажите - второй энкодер для чего?
про энкодер, пока не понятно, для чего он нужен, изначально предполагалось, что можно залить скетч генератора на ad9833.
Не сформировано требований, что будет реализовано для ручного режима, а автоматика работает и без него )))
Кручение перебирает меню.
1. автоматический / ручной режим. выбор частоты резонанса в ручную
2. выбор синуса - меандра можно и (типа катушки)
3. таймер сколько минут
4. мощность излучения
5. отключение подсветки дисплея в минутах, работа с бузером и т.д.
Да, таймер пожалуй нужен...мощность...пожалуй, но тогда и уровень гармоник снижается, но сдаётся мне что они там что-то значат...
Надо выработать консенсунс )))
К удалению
ingfa, https://yadi.sk/d/8X1azfziMW01Pg это последнее что я делал и выкладывал, на схеме все модули какие нужны подписаны, там код от автора темы и библиотеки которые у меня компилировались. Ua6em, говрил что еще один нужен энкодер, активная пищалка и MCP4725. В 405 посту есть схема Alp и там он пишет про резистор который нужен чтобы исправить обрезанный синус. Так же с этой схемой работает код Владимира Циброва https://tsibrov.blogspot.com/2018/06/ad9833.html
вот код:
001
#include <SPI.h>
002
// ***** I2C дисплей *****
003
#include <LiquidCrystal_I2C.h> // <a href="https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library" rel="nofollow">https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library</a>
004
#define cols 20
005
#define rows 4
006
LiquidCrystal_I2C lcd(0x27, cols, rows);
007
char
*Blank;
008
009
// ********** AD9833 **********
010
#define bMode 0x2
011
#define bDiv2 0x8
012
#define bOpbiten 0x20
013
#define bSleep12 0x40
014
#define bSleep1 0x80
015
#define bReset 0x100
016
#define bHLB 0x1000
017
#define bB28 0x2000
018
#define bCntrl_reg 0x0
019
#define bFreq_reg0 0x4000
020
#define bFreq_reg1 0x8000
021
#define bPhase_reg 0xC000
022
023
unsigned
long
Freq;
024
unsigned
long
FreqStep;
025
int
Phase;
026
enum
eWaveForm {wfSin, wfTri, wfSqr, wfSqr2};
027
eWaveForm WaveForm;
028
029
// ********** Параметры меню **********
030
#define ShowScrollBar 1 // Показывать индикаторы прокрутки (0/1)
031
#define ScrollLongCaptions 1// Прокручивать длинные названия (0/1)
032
#define ScrollDelay 800 // Задержка при прокрутке текста
033
#define BacklightDelay 20000// Длительность подсветки
034
#define ReturnFromMenu 1 // Выходить из меню после выбора элемента(0/1)
035
036
enum
eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
037
mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
038
};
039
040
// ********** Переменные для энкодера ***************
041
#define pin_CLK 6 // Энкодер пин A
042
#define pin_DT 5 // Энкодер пин B
043
#define pin_Btn 4 // Кнопка
044
045
unsigned
long
CurrentTime, PrevEncoderTime;
046
enum
eEncoderState {eNone, eLeft, eRight, eButton};
047
eEncoderState EncoderState;
048
int
EncoderA, EncoderB, EncoderAPrev, counter;
049
bool
ButtonPrev;
050
051
// ********** Прототипы функций ***************
052
eEncoderState GetEncoderState();
053
void
LCDBacklight(
byte
v = 2);
054
eMenuKey DrawMenu(eMenuKey Key);
055
056
// ******************** Меню ********************
057
byte
ScrollUp[8] = {0x4, 0xa, 0x11, 0x1f};
058
byte
ScrollDown[8] = {0x0, 0x0, 0x0, 0x0, 0x1f, 0x11, 0xa, 0x4};
059
060
byte
ItemsOnPage = rows;
// Максимальное количество элементов для отображения на экране
061
unsigned
long
BacklightOffTime = 0;
062
unsigned
long
ScrollTime = 0;
063
byte
ScrollPos;
064
byte
CaptionMaxLength;
065
066
struct
sMenuItem {
067
eMenuKey Parent;
// Ключ родителя
068
eMenuKey Key;
// Ключ
069
char
*Caption;
// Название пункта меню
070
void
(*Handler)();
// Обработчик
071
};
072
073
sMenuItem Menu[] = {
074
{mkNull, mkRoot,
"Menu"
, NULL},
075
{mkRoot, mkSetFreq,
"Set frequency"
, NULL},
076
{mkRoot, mkSetPhase,
"Set phase"
, NULL},
077
{mkRoot, mkForm,
"Set wave form"
, NULL},
078
{mkForm, mkSin,
"Sinusoidal"
, NULL},
079
{mkForm, mkTri,
"Triangular"
, NULL},
080
{mkForm, mkSquare,
"Square"
, NULL},
081
{mkForm, mkSquareDiv2,
"Square F/2"
, NULL},
082
{mkForm, mkBack,
"Back"
, NULL},
083
{mkRoot, mkInc,
"Set frequency increment value"
, NULL},
084
{mkInc, mkInc1,
"1 HZ"
, NULL},
085
{mkInc, mkInc10,
"10 HZ"
, NULL},
086
{mkInc, mkInc100,
"100 HZ"
, NULL},
087
{mkInc, mkInc1000,
"1000 HZ"
, NULL},
088
{mkInc, mkBack,
"Back"
, NULL},
089
{mkRoot, mkAbout,
"About"
, NULL},
090
{mkRoot, mkBack,
"Back"
, NULL}
091
};
092
093
const
int
MenuLength =
sizeof
(Menu) /
sizeof
(Menu[0]);
094
095
void
LCDBacklight(
byte
v) {
// Управление подсветкой
096
if
(v == 0) {
// Выключить подсветку
097
BacklightOffTime = millis();
098
lcd.noBacklight();
099
}
100
else
if
(v == 1) {
//Включить подсветку
101
BacklightOffTime = millis() + BacklightDelay;
102
lcd.backlight();
103
}
104
else
{
// Выключить если время вышло
105
if
(BacklightOffTime < millis())
106
lcd.noBacklight();
107
else
108
lcd.backlight();
109
}
110
}
111
112
eMenuKey DrawMenu(eMenuKey Key) {
// Отрисовка указанного уровня меню и навигация по нему
113
eMenuKey Result;
114
int
k, l, Offset, CursorPos, y;
115
sMenuItem **SubMenu = NULL;
116
bool
NeedRepaint;
117
String S;
118
l = 0;
119
LCDBacklight(1);
120
// Запишем в SubMenu элементы подменю
121
for
(
byte
i = 0; i < MenuLength; i++) {
122
if
(Menu[i].Key == Key) {
123
k = i;
124
}
125
else
if
(Menu[i].Parent == Key) {
126
l++;
127
SubMenu = (sMenuItem**) realloc (SubMenu, l *
sizeof
(
void
*));
128
SubMenu[l - 1] = &Menu[i];
129
}
130
}
131
132
if
(l == 0) {
// l==0 - подменю нет
133
if
((ReturnFromMenu == 0) and (Menu[k].Handler != NULL)) (*Menu[k].Handler)();
// Вызываем обработчик если он есть
134
LCDBacklight(1);
135
return
Key;
// и возвращаем индекс данного пункта меню
136
}
137
138
// Иначе рисуем подменю
139
CursorPos = 0;
140
Offset = 0;
141
ScrollPos = 0;
142
NeedRepaint = 1;
143
do
{
144
if
(NeedRepaint) {
145
NeedRepaint = 0;
146
lcd.clear();
147
y = 0;
148
for
(
int
i = Offset; i < min(l, Offset + ItemsOnPage); i++) {
149
lcd.setCursor(1, y++);
150
lcd.print(String(SubMenu[i]->Caption).substring(0, CaptionMaxLength));
151
}
152
lcd.setCursor(0, CursorPos);
153
lcd.print(
">"
);
154
if
(ShowScrollBar) {
155
if
(Offset > 0) {
156
lcd.setCursor(cols - 1, 0);
157
lcd.write(0);
158
}
159
if
(Offset + ItemsOnPage < l) {
160
lcd.setCursor(cols - 1, ItemsOnPage - 1);
161
lcd.write(1);
162
}
163
}
164
}
165
EncoderState = GetEncoderState();
166
switch
(EncoderState) {
167
case
eLeft: {
168
// Прокрутка меню вверх
169
LCDBacklight(1);
170
ScrollTime = millis() + ScrollDelay * 5;
171
if
(CursorPos > 0) {
// Если есть возможность, поднимаем курсор
172
if
((ScrollLongCaptions) and (ScrollPos)) {
173
// Если предыдущий пункт меню прокручивался, то выводим его заново
174
lcd.setCursor(1, CursorPos);
175
lcd.print(Blank);
176
lcd.setCursor(1, CursorPos);
177
lcd.print(String(SubMenu[Offset + CursorPos]->Caption).substring(0, CaptionMaxLength));
178
ScrollPos = 0;
179
}
180
// Стираем курсор на старом месте, рисуем в новом
181
lcd.setCursor(0, CursorPos--);
182
lcd.print(
" "
);
183
lcd.setCursor(0, CursorPos);
184
lcd.print(
">"
);
185
}
186
else
if
(Offset > 0) {
187
//Курсор уже в крайнем положении. Если есть пункты выше, то перерисовываем меню
188
Offset--;
189
NeedRepaint = 1;
190
}
191
break
;
192
}
193
case
eRight: {
194
// Прокрутка меню вниз
195
LCDBacklight(1);
196
ScrollTime = millis() + ScrollDelay * 5;
197
if
(CursorPos < min(l, ItemsOnPage) - 1) {
// Если есть возможность, то опускаем курсор
198
if
((ScrollLongCaptions) and (ScrollPos)) {
199
// Если предыдущий пункт меню прокручивался, то выводим его заново
200
lcd.setCursor(1, CursorPos);
201
lcd.print(Blank);
202
lcd.setCursor(1, CursorPos);
203
lcd.print(String(SubMenu[Offset + CursorPos]->Caption).substring(0, CaptionMaxLength));
204
ScrollPos = 0;
205
}
206
// Стираем курсор на старом месте, рисуем в новом
207
lcd.setCursor(0, CursorPos++);
208
lcd.print(
" "
);
209
lcd.setCursor(0, CursorPos);
210
lcd.print(
">"
);
211
}
212
else
{
213
// Курсор уже в крайнем положении. Если есть пункты ниже, то перерисовываем меню
214
if
(Offset + CursorPos + 1 < l) {
215
Offset++;
216
NeedRepaint = 1;
217
}
218
}
219
break
;
220
}
221
case
eButton: {
222
// Выбран элемент меню. Нажатие кнопки Назад обрабатываем отдельно
223
LCDBacklight(1);
224
ScrollTime = millis() + ScrollDelay * 5;
225
if
(SubMenu[CursorPos + Offset]->Key == mkBack) {
226
free(SubMenu);
227
return
mkBack;
228
}
229
Result = DrawMenu(SubMenu[CursorPos + Offset]->Key);
230
if
((Result != mkBack) and (ReturnFromMenu)) {
231
free(SubMenu);
232
return
Result;
233
}
234
NeedRepaint = 1;
235
break
;
236
}
237
case
eNone: {
238
if
(ScrollLongCaptions) {
239
// При бездействии прокручиваем длинные названия
240
S = SubMenu[CursorPos + Offset]->Caption;
241
if
(S.length() > CaptionMaxLength)
242
{
243
if
(ScrollTime < millis())
244
{
245
ScrollPos++;
246
if
(ScrollPos == S.length() - CaptionMaxLength)
247
ScrollTime = millis() + ScrollDelay * 2;
// Небольшая задержка когда вывели все название
248
else
if
(ScrollPos > S.length() - CaptionMaxLength)
249
{
250
ScrollPos = 0;
251
ScrollTime = millis() + ScrollDelay * 5;
// Задержка перед началом прокрутки
252
}
253
else
254
ScrollTime = millis() + ScrollDelay;
255
lcd.setCursor(1, CursorPos);
256
lcd.print(Blank);
257
lcd.setCursor(1, CursorPos);
258
lcd.print(S.substring(ScrollPos, ScrollPos + CaptionMaxLength));
259
}
260
}
261
}
262
LCDBacklight();
263
}
264
}
265
}
while
(1);
266
}
267
//****************************************
268
269
void
setup
() {
270
pinMode(pin_CLK, INPUT);
271
pinMode(pin_DT, INPUT);
272
pinMode(pin_Btn, INPUT_PULLUP);
273
SPI.begin();
274
lcd.begin();
275
lcd.backlight();
276
CaptionMaxLength = cols - 1;
277
Blank = (
char
*) malloc(cols *
sizeof
(
char
));
278
for
(
byte
i = 0; i < CaptionMaxLength; i++)
279
Blank[i] =
' '
;
280
if
(ShowScrollBar) {
281
CaptionMaxLength--;
282
lcd.createChar(0, ScrollUp);
283
lcd.createChar(1, ScrollDown);
284
}
285
Blank[CaptionMaxLength] = 0;
286
FreqStep = 1000;
// Шаг смены частоты
287
WaveForm = wfSin;
288
WriteAD9833(bCntrl_reg | bReset | bB28);
289
SetFrequency(300000);
// Установим частоту Гц
290
SetPhase(0);
// Сдвиг по фазе 0
291
WriteAD9833(bCntrl_reg | bB28);
// Снимаем Reset
292
LCDRepaint();
// Выведем текущие параметры на дисплей
293
LCDBacklight(1);
// Включаем подвсветку
294
}
295
296
void
loop
() {
297
unsigned
long
F;
298
// В цикле опрашиваем энкодер
299
switch
(GetEncoderState()) {
300
case
eNone: {
// При бездействии отключаем подсветку по таймауту
301
LCDBacklight();
302
return
;
303
}
304
case
eLeft: {
// Уменьшить частоту
305
LCDBacklight(1);
// Включаем подсветку
306
if
(Freq == 1)
return
;
// Меньше уже некуда
307
if
(Freq > FreqStep)
308
SetFrequency(Freq - FreqStep);
309
else
310
SetFrequency(1);
311
break
;
312
}
313
case
eRight: {
// Увеличить частоту
314
LCDBacklight(1);
// Включаем подсветку
315
if
(Freq == 12500000)
return
;
// Больше уже некуда
316
if
(Freq + FreqStep <= 12500000)
317
SetFrequency(Freq + FreqStep);
318
else
319
SetFrequency(12500000);
320
break
;
321
}
322
case
eButton: {
// При нажатии на кнопку показываем меню
323
LCDBacklight(1);
// Включаем подсветку
324
switch
(DrawMenu(mkRoot)) {
// Показываем меню и анализируем выбранный пункт
325
case
mkSetFreq: {
// Установить новое значение частоты
326
F = InputFreq();
// Запрашиваем новое значение
327
while
((F > 12500000) or (F < 1)) {
328
// Частота должна быть в диапазоне 1...12500000Гц
329
lcd.clear();
330
lcd.print(
"Frequency should be"
);
331
lcd.setCursor(0, 1);
332
lcd.print(
"between 1Hz and"
);
333
lcd.setCursor(0, 2);
334
lcd.print(
"12.5Mhz"
);
335
while
(GetEncoderState() == eNone);
336
F = InputFreq();
// Предлагаем ввести частоту повторно
337
}
338
if
(F != Freq)
339
SetFrequency(F);
// Устанавливаем новое значение частоты
340
break
;
341
}
342
case
mkSetPhase: {
// Установить фазу
343
SetPhase(InputPhase());
344
break
;
345
}
346
case
mkSin: {
// Изменить форму сигнала на синусоидальную
347
SetForm(wfSin);
348
break
;
349
}
350
case
mkTri: {
// ... треугольную
351
SetForm(wfTri);
352
break
;
353
}
354
case
mkSquare: {
// ... прямоугольную
355
SetForm(wfSqr);
356
break
;
357
}
358
case
mkSquareDiv2: {
// ... прямоугольную с делителем на 2
359
SetForm(wfSqr2);
360
break
;
361
}
362
case
mkInc1: {
// Установить приращение частоты 1Гц
363
FreqStep = 1;
364
break
;
365
}
366
case
mkInc10: {
367
FreqStep = 10;
// 10Гц
368
break
;
369
}
370
case
mkInc100: {
371
FreqStep = 100;
// 100Гц
372
break
;
373
}
374
case
mkInc1000: {
375
FreqStep = 1000;
// 1000Гц
376
break
;
377
}
378
case
mkAbout: {
379
lcd.clear();
380
lcd.print(
"AD9833 generator"
);
381
lcd.setCursor(0, 1);
382
lcd.print(
"tsibrov.blogspot.com"
);
383
while
(GetEncoderState() == eNone){
384
LCDBacklight();
385
}
386
LCDBacklight(1);
387
break
;
388
}
389
}
390
// После выхода из меню перерисовываем главный экран
391
LCDRepaint();
392
return
;
393
}
394
}
395
// Обновить значение частоты
396
lcd.setCursor(0, 0);
397
lcd.print(Blank);
398
lcd.setCursor(0, 0);
399
lcd.print(
"Freq: "
);
400
lcd.print(Freq);
401
lcd.print(
"Hz"
);
402
}
403
404
// ******************** Вывод информации на дисплей ********************
405
void
LCDRepaint() {
406
lcd.clear();
407
lcd.setCursor(0, 0);
408
lcd.print(
"Freq: "
);
409
lcd.print(Freq);
410
lcd.print(
"Hz"
);
411
lcd.setCursor(0, 1);
412
lcd.print(
"Phase: "
);
413
lcd.print(Phase);
414
lcd.print(
"Deg"
);
415
lcd.setCursor(0, 2);
416
lcd.print(
"Form: "
);
417
switch
(WaveForm) {
418
case
wfSin: {
419
lcd.print(
"Sinusoidal"
);
420
break
;
421
}
422
case
wfTri: {
423
lcd.print(
"Triangular"
);
424
break
;
425
}
426
case
wfSqr: {
427
lcd.print(
"Square"
);
428
break
;
429
}
430
case
wfSqr2: {
431
lcd.print(
"Square F/2"
);
432
break
;
433
}
434
}
435
}
436
437
// ******************** Энкодер с кнопкой ********************
438
eEncoderState GetEncoderState() {
439
// Считываем состояние энкодера
440
eEncoderState Result = eNone;
441
CurrentTime = millis();
442
if
(CurrentTime >= (PrevEncoderTime + 5)) {
443
PrevEncoderTime = CurrentTime;
444
if
(digitalRead(pin_Btn) == LOW ) {
445
if
(ButtonPrev) {
446
Result = eButton;
// Нажата кнопка
447
ButtonPrev = 0;
448
}
449
}
450
else
{
451
ButtonPrev = 1;
452
EncoderA = digitalRead(pin_DT);
453
EncoderB = digitalRead(pin_CLK);
454
if
((!EncoderA) && (EncoderAPrev)) {
// Сигнал A изменился с 1 на 0
455
if
(EncoderB) Result = eRight;
// B=1 => энкодер вращается по часовой
456
else
Result = eLeft;
// B=0 => энкодер вращается против часовой
457
}
458
EncoderAPrev = EncoderA;
// запомним текущее состояние
459
}
460
}
461
return
Result;
462
}
463
464
// ******************** Ввод нового значения частоты ********************
465
unsigned
long
InputFreq() {
466
unsigned
long
F = Freq;
467
int
Positions[] = {4, 5, 7, 8, 9, 11, 12, 13};
468
int
Digits[8];
469
int
p = 0;
470
lcd.clear();
471
lcd.setCursor(2, 0);
472
lcd.print(
"Input frequency:"
);
473
lcd.setCursor(14, 1);
474
lcd.print(
"Hz"
);
475
// Разбиваем частоту на разряды и выводим на дисплей
476
for
(
int
i = 7; i >= 0; i--) {
477
Digits[i] = F % 10;
478
lcd.setCursor(Positions[i], 1);
479
lcd.print(Digits[i]);
480
F = F / 10;
481
}
482
lcd.setCursor(3, 3);
483
lcd.print(
"OK Cancel"
);
484
lcd.setCursor(Positions[0], 1);
485
lcd.cursor();
486
487
//Основной цикл - выбор разряда для изменения либо OK/Cancel
488
while
(1)
489
{
490
EncoderState = GetEncoderState();
491
switch
(EncoderState) {
492
case
eNone: {
493
LCDBacklight();
494
continue
;
495
}
496
case
eLeft: {
// Двигаем курсор влево
497
LCDBacklight(1);
// Включаем подсветку
498
if
(p == 0)
continue
;
// Левее перемещаться некуда
499
if
(p == 9) {
// Выбран Cancel, перемещаемся к OK
500
lcd.setCursor(10, 3); lcd.print(
' '
);
501
lcd.setCursor(2, 3); lcd.print(
'>'
);
502
p--;
503
continue
;
504
}
505
if
(p == 8) {
// Выбран OK, перемещаемся к частоте
506
lcd.setCursor(2, 3); lcd.print(
' '
);
507
p--;
508
lcd.setCursor(Positions[p], 1);
509
lcd.cursor();
510
continue
;
511
}
512
// Выбрана частота, перемещаемся к старшему разряду
513
p--;
514
lcd.setCursor(Positions[p], 1);
515
continue
;;
516
}
517
case
eRight: {
// Двигаем курсор вправо
518
LCDBacklight(1);
// Включаем подсветку
519
if
(p == 9)
continue
;
// Правее перемещаться некуда
520
if
(p == 8) {
// Выбран Ok, перемещаемся к Cancel
521
lcd.setCursor(2, 3); lcd.print(
' '
);
522
lcd.setCursor(10, 3); lcd.print(
'>'
);
523
p++;
524
continue
;
525
}
526
if
(p == 7) {
// Выбран младший разряд частоты, перемещаемся к OK
527
lcd.noCursor();
528
lcd.setCursor(2, 3); lcd.print(
'>'
);
529
p++;
530
continue
;
531
}
532
// Выбрана частота, перемещаемся к младшему разряду
533
p++;
534
lcd.setCursor(Positions[p], 1);
535
continue
;;
536
}
537
case
eButton: {
//Нажата кнопка
538
LCDBacklight(1);
// Включаем подсветку
539
if
(p == 9) {
540
lcd.noCursor();
541
return
Freq;
// Cancel.
542
}
543
if
(p == 8) {
// OK. Собираем и возвращаем новое значение частоты
544
lcd.noCursor();
545
F = 0;
546
for
(
int
i = 0; i < 8; i++)
547
F = F * 10 + Digits[i];
548
return
F;
549
}
550
// Редактирование выбранного разряда частоты
551
EncoderState = eNone;
552
lcd.setCursor(Positions[p], 1);
553
lcd.blink();
554
while
(EncoderState != eButton)
555
{
556
EncoderState = GetEncoderState();
557
switch
(EncoderState) {
558
case
eNone: {
559
LCDBacklight();
560
continue
;
561
}
562
case
eLeft: {
563
LCDBacklight(1);
// Включаем подсветку
564
if
(Digits[p] == 0)
continue
;
565
lcd.setCursor(Positions[p], 1);
566
lcd.print(--Digits[p]);
567
lcd.setCursor(Positions[p], 1);
568
continue
;
569
}
570
case
eRight: {
571
LCDBacklight(1);
// Включаем подсветку
572
if
(Digits[p] == 9)
continue
;
573
lcd.setCursor(Positions[p], 1);
574
lcd.print(++Digits[p]);
575
lcd.setCursor(Positions[p], 1);
576
continue
;
577
}
578
}
579
}
580
LCDBacklight(1);
581
lcd.noBlink();
582
continue
;
583
}
584
}
585
}
586
}
587
588
// ******************** Ввод фазы ********************
589
int
InputPhase() {
590
int
w = Phase;
591
lcd.clear();
592
lcd.setCursor(1, 0);
593
lcd.print(
"Input phase shift:"
);
594
lcd.setCursor(6, 1);
595
lcd.print(w);
596
lcd.print(
"Deg"
);
597
while
(1) {
598
EncoderState = GetEncoderState();
599
switch
(EncoderState) {
600
case
eNone: {
601
LCDBacklight();
602
continue
;
603
}
604
case
eButton: {
605
LCDBacklight(1);
606
return
w;
607
}
608
case
eLeft: {
609
LCDBacklight(1);
610
if
(w > 0) w--;
611
break
;
612
}
613
case
eRight: {
614
LCDBacklight(1);
615
if
(w < 360) w++;
616
break
;
617
}
618
}
619
lcd.setCursor(6, 1);
620
lcd.print(w);
621
lcd.print(
"Deg "
);
622
}
623
}
624
625
// ******************** Установить частоту ********************
626
void
SetFrequency(unsigned
long
val) {
627
Freq = val;
628
unsigned
long
FreqData = round((
float
) val * 10.73741 + 0.5);
629
WriteAD9833(FreqData & 0x3FFF | bFreq_reg0);
630
WriteAD9833((FreqData >> 14) | bFreq_reg0);
631
}
632
633
// ******************** Установить фазу ********************
634
void
SetPhase(
int
val) {
635
Phase = val;
636
unsigned
long
PhaseData = round (
float
(val) * 11.37777 + 0.5);
637
WriteAD9833(PhaseData | bPhase_reg);
638
}
639
640
// ******************** Установить форму ********************
641
void
SetForm(eWaveForm val) {
642
WaveForm = val;
643
int16_t CntrlData;
644
switch
(val) {
645
case
wfSin: {
646
CntrlData = 0;
647
break
;
648
}
649
case
wfTri: {
650
CntrlData = bMode;
651
break
;
652
}
653
case
wfSqr: {
654
CntrlData = bOpbiten | bDiv2 | bSleep12;
655
break
;
656
}
657
case
wfSqr2: {
658
CntrlData = bOpbiten | bSleep12;
659
break
;
660
}
661
}
662
WriteAD9833(CntrlData | bCntrl_reg | bB28);
663
}
664
665
// ******************** Передача 16-битного слова в AD9833 ********************
666
void
WriteAD9833(uint16_t Data) {
667
SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE2));
668
digitalWrite(SS, LOW);
669
delayMicroseconds(1);
670
SPI.transfer16(Data);
671
digitalWrite(SS, HIGH);
672
SPI.endTransaction();
673
}
И меня есть предположения что ина 219 сиреневого цвета немного другой формы лучше чем синее , меньше брака. У Shurchik вроде такая стоит и Alp где тут фото выкладывал.
Для применения только в качестве генератора для катушки Мишина можно добавить в схему пищалку и три светодиода, под таймер на 5,10 и 15 минут...
Да, недорогие и не бракованные XR2206 брал у этого продавца - https://ru.aliexpress.com/item/32842901280.html?spm=2114.13010708.0.0.3a...
Для чего колхоз если у нас есть 4 строчный дисплей......
все-таки моя 9833 не але :( выписал новую..... опять потеря времени...
Может есть у кого? Почтой не отправите?
таймер в нижнюю строку будем выводить?
Если да, то что там писать?
выписывать надо попарно, одна обычно дохлая, у меня даже на AD9850 в одной умудрились чип перевернуть )))
что там писать?
В работе хх минут (а когда менее 1,5 минуты до окончания
В работе xx секунд
и считает в меньшую сторону. Можно мигующую точку добавить чтобы видно было, что работает
понятно, только дисплей то на латыни )))
Да это все тонкости. Есть на крайняк и наши библиотеки...
Вот как вариант но не в этом суть...
кириллица на китайском LSD 2004 https://vk.com/topic-110073626_33452894 ua6em, под ваш код этот способ можно адаптировать?
кириллица на китайском LSD 2004 https://vk.com/topic-110073626_33452894 ua6em, под ваш код этот способ можно адаптировать?
а як жеж )))
а як жеж )))
Отлично. Пока идет новая 9833 может и с энкодерами разберемся?
Попробуем...
а як жеж )))
Отлично. Пока идет новая 9833 может и с энкодерами разберемся?
ua6em, в той версии платы что у вас под 2 энкодера пины на ардуине не в лучшем порядке был назначенные для травления, я там делал обводы, так как свободы в этом деле не имею я сделал по той схеме что была наскоряк. Переназначить для более компактной разводки эти пины только в другом порядке или на соседние я думаю это не проблема?
И в общем я понял что дорожки надо делать как можно толще и все заливать землей, помех чуть чуть меньше будет.
Мне пришли разъемы как на осциллографе и я купил еще разъемы под тюльпаны, и питание. Также обзавелся пищалками и MCP4725 пришла. Все это хозяйство пристрою. В этот раз думаю получиться уже законченная плата под травление!
И транзистор с АД9833 будем ставить чтобы до 1 вольта поднять?
Shurchik, а у вас MCP4725 есть?
1. по переназначению пинов пока не скажу, как там это делалось программно, надо пробовать
2. по пищалке тоже не помню на какой пин выводил, я с кодом бузе соригинальничал, тоже надо смотреть
3. Усиление надо добавить, всё таки режим провала синусоиды надо попробовать реализовать
вообще я приверженец простых решений, включил и пользуйся, таймер пожалуй да, сейчас подключил нажатие кнопки, попробую следующую функцию - короткие нажатия устанавливают таймер по кругу 5-10-15 минут, длинное запускает обратный отсчёт
Shurchik, а у вас MCP4725 есть?
на плате есть и запасная
У меня вот такой вопрос, а плату может у Китайцев заказать, чтобы с маской была...цена вопроса вроде не высокая