ШИМ и analogReference(INTERNAL)
- Войдите на сайт для отправки комментариев
Ср, 08/09/2021 - 09:22
Всем привет! Имеется китайская pro micro. Пин 5 работает как ШИМ. Параллельно измеряется напряжение на А0 и А1. При переключении на analogReference(INTERNAL) ШИМ перестает работать)) Может, так и должно быть?
Скетча не будет? И схемы, заодно - что там и как подключено к пинам 5 и A0/A1
Сейчас, почищу от левых коментов и выложу скетч.
И, заодно, от левых действий. Вы говорите, что проблема в переключении референса. Вот и сделайте скетч в котором есть только analoWrite и переключение. Скетч выкладывайте целиком, чтобы его можно было просто запустить у себя. И не забудьте про правила выкладывания скетча .
Кстати, схема тоже не помешает.
В общем, скетч создавался на 99% копипастой, поэтому названия переменных схеме не соответствует. Но все, как ни странно, работает.
#include <USB-MIDI.h> #include <MIDI.h> #include <MIDI_Controller.h> #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно byte recieved_data[2]; // массив принятых данных byte relay = 2; // реле на 2 цифровом byte mosfet = 5; // мосфет на 5 цифровом (ТУТ ЕСТЬ ШИМ!!!) const uint8_t velocity = 0b1111111; // Maximum velocity (0b1111111 = 0x7F = 127) const uint8_t C4 = 60; // Note number 60 is defined as middle C in the MIDI specification const uint8_t E4 = 64; // Note number 64 is defined as middle E in the MIDI specification const uint8_t G4 = 67; // Note number 67 is defined as middle G in the MIDI specification Digital button[] = { {6, C4, 1, velocity}, // Create a new instance of the class 'Digital', called 'button', on pin 6, 7, 8, that sends MIDI messages with note 'C4' (60), E4 (64), G4 (67) on channel 1, with velocity 127 {7, E4, 1, velocity}, {8, G4, 1, velocity}, }; // Create a new instance of the class 'AnalogHiRes', called 'potentiometer', on pin A0, // that sends MIDI Pitch Bend messages on channel 1 AnalogHiRes potentiometer(A0, 1); // Create a new instance of the class 'Analog', called 'potentiometerA1', on pin A1, // that sends MIDI messages with controller 7 (channel volume) on channel 1 Analog potentiometerA1(A1, MIDI_CC::Channel_Volume, 1); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { analogReference(INTERNAL); Serial.begin(31250); //открываем порт для связи с ПК ::pinMode(relay, OUTPUT); // настроить пин реле как выход ::pinMode(mosfet, OUTPUT); // настроить пин мосфета как выход //myservo.attach(servo); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0 radio.setChannel(115); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MIN); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { byte pipeNo; while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб radio.read( &recieved_data, sizeof(recieved_data) ); // читаем входящий сигнал ::digitalWrite(relay, recieved_data[0]); // подать на реле сигнал с 0 места массива //то бишь 0 или 1 analogWrite(mosfet, recieved_data[1]); // подать на мосфет ШИМ сигнал // в соответствии с принятыми данными со 2 места массива, диапазон 0...255 } MIDI_Controller.refresh(); }Вы не поняли. Я же Вам написал
Вы говорите, что проблема в переключении референса. Вот и сделайте скетч в котором есть только analoWrite и переключение.
Что в Вашем скетче делают NRF и MIDI?
Я хочу запустить скетч у себя, увидеть проблему и попытаться Вам помочь, но городить схему с миди и нрф - через чур, тем более, что миди у меня нет.
Давайте, Вы сократите скетч до минимального, показывающего проблему. Чтобы мне не так трудно было его запустить и увидеть Вашу беду.
Извините, я задавал вопрос в расчете на то, что, может, кто сталкивался с проблемой. Специально собирать макет и моделировать мою ситуацию, по-моему, чересчур трудоемко...
Задам вопрос по-другому. Можно было бы вообще отказаться от ШИМ, если б данные, полученные от nRF24L01 преобразовать в MIIDI и отправить на USB. Дело в том, что я в программировании профан, понимаю, что задача не такая уж сложная, но куда копать - не знаю(( Или создать новую тему, конкретно по nRF24L01 -> MIDI?
Ну, если для Вас решать СВОЮ проблему
чересчур трудоемко
то каково, по Вашему мнению, для других решать ЧУЖУЮ проблему?
Удачи Вам!
Переключения в скетче нет, просто ШИМ работает, когда я заливаю скетч с референсом по умолчанию, и не работает, когда в сетап добавляю analogReference(INTERNAL).
Конечно же, я имел в виду, трудоемко для вас.
Неужели сложно в пустой скетч закопипастить analogWrite и analogReference?
sadman41, попробую.
RocktorT - не пойму. а нафига вы вообще трогаете AnalogReference() ? - у вас в коде нет чтения аналоговых портов, поэтому референс ни на что не влияет.
и еще интересны строчки 42, 43. 69... они вообще компилиются?
RocktorT - не пойму. а нафига вы вообще трогаете AnalogReference() ? - у вас в коде нет чтения аналоговых портов, поэтому референс ни на что не влияет.
и еще интересны строчки 42, 43. 69... они вообще компилиются?
AnalogHiRes potentiometer(A0, 1) и
Analog potentiometerA1(A1, MIDI_CC::Channel_Volume, 1) -
ф-ции из б-ки MIDI_Controller.h - читают А0 и А1
Компиляция проходит без вопросов.
Проверил на другой Pro Micro, из той же партии, минимальный скетч работает как с analogReference(INTERNAL); так и без
void setup() { analogReference(INTERNAL); pinMode(5, OUTPUT); // D5 как выход } void loop() { // ШИМ на 5 пин, 1023/4 = 255 - перевели диапазон analogWrite(5, analogRead(0) / 4); delay(10); }void setup() { pinMode(5, OUTPUT); // D5 как выход } void loop() { // ШИМ на 5 пин, 1023/4 = 255 - перевели диапазон analogWrite(5, analogRead(0) / 4); delay(10); }Значит, дело в чем-то другом. Понимаю, что в моем коде черт ногу сломит, потому, думаю тему можно закрыть. Прошу пардону за отнятое время на базар.
Понимаю, что в моем коде черт ногу сломит, потому, думаю тему можно закрыть. Прошу пардону за отнятое время на базар.
проверяйте по частям. Для начала я бы выкинул все, связанное с NRF, так как скорее всего оно не причем. Удаляйте радио и смотрите - пропадет проблема или нет. Думаю. дело в Миди
проверяйте по частям. Для начала я бы выкинул все, связанное с NRF, так как скорее всего оно не причем. Удаляйте радио и смотрите - пропадет проблема или нет. Думаю. дело в Миди
Не-не, радио работает, с него данные передаются на 5 пин как шим. Короче, оставляю все как есть, хотел повысить стабильность, не судьба.
Явной связки АЦП и PWM я не припоминаю. Возможно, что в библиотеках накручено. Хотя, опять же - что? Только если таймеры переназначаются. Я бы перекинул функционал на другой пин с другим таймером для быстротеста.
Не-не, радио работает, с него данные передаются на 5 пин как шим.
я правильно догадался, что пин 5 и пин А0 (или А1) у вас соединены перемычкой? с радио вы передаете данные на пин 5 как ШИМ, а потом читаете этот сигнал как аналоговый для передачи в Миди?
я правильно догадался
Неправильно! Правильно было в постах #1 и #3
Но, для ТС, как выяснилось, это
чересчур трудоемко
:-(
Но, для ТС, как выяснилось, это чересчур трудоемко
есть подозрение- ему просто стыдно показывать свою схему :)
Но, для ТС, как выяснилось, это чересчур трудоемко
есть подозрение- ему просто стыдно показывать свою схему :)
Ну, есть такое дело))
Там не перемычка (шим же интегрировать надо), а оптрон "лампа>транзистор"
Это, конечно же, доставание левого уха правой ногой, но работает. Проще было бы, как я писал, напрямую передать данные на USB, как МИДИ, но не знаю, как.
В MIDI_Controller.h такой ф-ции не предусмотрено, а MIDI.h - сильно сложная, не с моими программерскими способностями там разбираться.
Проще было бы, как я писал, напрямую передать данные на USB, как МИДИ, но не знаю, как.
посмотреть исходники классов
AnalogHiRes и Analog
из библиотеки MIDI_Controller.h - не предлагать?
посмотреть исходники классов
AnalogHiRes и Analog
из библиотеки MIDI_Controller.h - не предлагать?
Ну вот, началось)))