Управление напряжением с помощью встроенного DAC на Arduino Nano 33 IoT

perdmen
Offline
Зарегистрирован: 18.09.2021

Здравствуйте! нужно управлять контроллером мотор-колеса, управление идет через напряжение от 0 до 3v3

шим не подходит контроллер ведет себя не адекватна...

нашел в интернете код, который нормально компилируется под Arduino Due но на Nano 33 IoT выдает ошибку :exit status 1

Ошибка компиляции для платы Arduino NANO 33 IoT.
int analogPin = 0;  
 
int val = 0;
void setup() {
  Serial.begin(9600);
  pinMode(DAC, OUTPUT);
  pinMode(A1, INPUT);
}
void loop() {
  int sensorValue = analogRead(A1);
  float voltage = sensorValue * (3.3/1023.0);
  // print out the value you read:
  Serial.println(voltage);
  val = analogRead(analogPin);
  analogWrite(DAC, val);
}

+++++++++++++++++++++++++++++++++++++++++++++++

Arduino: 1.8.15 (Mac OS X), Плата:"Arduino NANO 33 IoT"

 
 
 
 
 
 
 
 
 
 
 
In file included from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/Arduino.h:35,
                 from sketch/3v3.ino.cpp:1:
/Users/vladimirsedykh/Documents/Arduino/3v3/3v3.ino: In function 'void setup()':
/Users/vladimirsedykh/Library/Arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:421:28: error: invalid conversion from 'Dac*' to 'pin_size_t {aka unsigned char}' [-fpermissive]
 #define DAC               ((Dac      *)0x42004800UL) /**< \brief (DAC) APB Base Address */
                           ~^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/vladimirsedykh/Documents/Arduino/3v3/3v3.ino:7:11: note: in expansion of macro 'DAC'
   pinMode(DAC, OUTPUT);
           ^~~
In file included from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/Interrupts.h:8:0,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/ArduinoAPI.h:29,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/Arduino.h:23,
                 from sketch/3v3.ino.cpp:1:
/Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/Common.h:94:6: note:   initializing argument 1 of 'void pinMode(pin_size_t, PinMode)'
 void pinMode(pin_size_t pinNumber, PinMode pinMode);
      ^~~~~~~
In file included from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/Arduino.h:35,
                 from sketch/3v3.ino.cpp:1:
/Users/vladimirsedykh/Documents/Arduino/3v3/3v3.ino: In function 'void loop()':
/Users/vladimirsedykh/Library/Arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:421:28: error: invalid conversion from 'Dac*' to 'pin_size_t {aka unsigned char}' [-fpermissive]
 #define DAC               ((Dac      *)0x42004800UL) /**< \brief (DAC) APB Base Address */
                           ~^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/vladimirsedykh/Documents/Arduino/3v3/3v3.ino:19:15: note: in expansion of macro 'DAC'
   analogWrite(DAC, val);
               ^~~
In file included from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/Interrupts.h:8:0,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/ArduinoAPI.h:29,
                 from /Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/Arduino.h:23,
                 from sketch/3v3.ino.cpp:1:
/Users/vladimirsedykh/Library/Arduino15/packages/arduino/hardware/samd/1.8.11/cores/arduino/api/Common.h:99:6: note:   initializing argument 1 of 'void analogWrite(pin_size_t, int)'
 void analogWrite(pin_size_t pinNumber, int value);
      ^~~~~~~~~~~
exit status 1
Ошибка компиляции для платы Arduino NANO 33 IoT.
 
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

 

perdmen
Offline
Зарегистрирован: 18.09.2021

rkit
Offline
Зарегистрирован: 23.11.2016

Спасибо за информацию. Держите нас в курсе.

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

А вот так что получается?
 

int analogPin = 0;

int val = 0;

void setup() {
  Serial.begin(9600);
  pinMode(/*DAC*/A0, OUTPUT);
  pinMode(A1, INPUT);
}

void loop() {
  int sensorValue = analogRead(A1);
  float voltage = sensorValue * (3.3 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
  val = analogRead(analogPin);
  analogWrite(/*DAC*/A0, val);
}

или так:
 

int analogPin = 0;

int val = 0;

void setup() {
  Serial.begin(9600);
  pinMode(/*DAC*A0*/14, OUTPUT);
  pinMode(A1, INPUT);
}

void loop() {
  int sensorValue = analogRead(A1);
  float voltage = sensorValue * (3.3 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
  val = analogRead(analogPin);
  analogWrite(/*DAC*A0*/14, val);
}

 

perdmen
Offline
Зарегистрирован: 18.09.2021

Спасибо!!!! оба варианта скомпилировались, но на А0 ровно 1 вольт, если подключаю диод то то хаотично мерцает, повороты потенциометра немного меняют мерцание но на мультиметре 1 вольт....  Если кто то может тыкнуть где копать буду очень благодарен...

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

perdmen пишет:

Спасибо!!!! оба варианта скомпилировались, но на А0 ровно 1 вольт, если подключаю диод то то хаотично мерцает, повороты потенциометра немного меняют мерцание но на мультиметре 1 вольт....  Если кто то может тыкнуть где копать буду очень благодарен...

не поленился, залез в аддон - C:\Users\User\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.11\variants\nano_33_iot\variant.h

Вот так правильно должно быть:
 

int analogPin = 0;

int val = 0;

void setup() {
  Serial.begin(9600);
  pinMode(/*DAC*A0*14*/DAC0, OUTPUT);
  pinMode(A1, INPUT);
}

void loop() {
  int sensorValue = analogRead(A1);
  float voltage = sensorValue * (3.3 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
  val = analogRead(analogPin);
  analogWrite(/*DAC*A0*14*/DAC0, val);
}

ЗЫ с тебя коньяк )))

perdmen
Offline
Зарегистрирован: 18.09.2021

Все аналогично, компилируется но напряжение около 1 вольта прыгает и не регулируется, при подключении диода хаотично моргает. Не понимаю можно ли здесь писать в личку и как безопасно обменяться контактами, если работать будет присылайте адрес, отправлю вам коньяк. Делаю с MAC, сейчас попробую с винды. Может есть какая библиотека для работы с аналоговым выходом?

 

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

perdmen пишет:

Все аналогично, компилируется но напряжение около 1 вольта прыгает и не регулируется, при подключении диода хаотично моргает. Не понимаю можно ли здесь писать в личку и как безопасно обменяться контактами, если работать будет присылайте адрес, отправлю вам коньяк. Делаю с MAC, сейчас попробую с винды. Может есть какая библиотека для работы с аналоговым выходом?

НИК на яндексе, но платы у меня нет и, непонятно ты на аналоговый пин с чего подаёшь?
Может просто в цикле вывести в порт от 0 до 1023?

volatile uint16_t value = 0;
void setup() {
  Serial.begin(115200);
}

void loop() {
  while(value < 1024) {
    value++;
    analogWrite(DAC0, value);
    delay(10);
    Serial.println(value);
  }
  while(value > 0) {
    value--;
    analogWrite(DAC0, value);
    delay(10);
    Serial.println(value);
  }
}

поправил, выше с нулевого читал и туда жеж выводил, и как тут не быть дураком )))
 

int analogPin = A1;

int val = 0;

void setup() {
  Serial.begin(9600);
  pinMode(/*DAC*A0*14*/DAC0, OUTPUT);
  pinMode(A1, INPUT);
}

void loop() {
  int sensorValue = analogRead(analogPin);
  float voltage = sensorValue * (3.3 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
  val = analogRead(analogPin);
  analogWrite(/*DAC*A0*14*/DAC0, val);
}

И каков результат???

perdmen
Offline
Зарегистрирован: 18.09.2021

К А1 подключен переменный резистор на 10К.

Я поменял плату на Arduino DUE и что то начало получаться, 

int analogPin = 0;  

int val = 0;
void setup() {
  Serial.begin(9600);
  pinMode(DAC1, OUTPUT);
  pinMode(A0, INPUT);
}
void loop() {
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (3.3/1023.0);
  Serial.println(voltage);
  val = analogRead(analogPin);
  analogWrite(DAC1, val);
}
 
При повороте потенциометра вольтаж на DAC1 изменяется от 0.4 до 2.6 вольт и так четыре раза подряд. я так понимаю это из за разницы разрядности АЦП и ЦАП..... 
 
Я так понял что у ЦАП есть опорное напряжение это 2.6в поэтому больше 2.6 выдать нельзя на выходах DAC
 
все что получилось добиться это регулировка напряжения от 0.5 до 2.7 вольт
 
int analogPin = 0;
int val = 0;
void setup() {
  Serial.begin(9600);
  pinMode(DAC1, OUTPUT);
  pinMode(A0, INPUT);
  analogWriteResolution(10);
}
void loop() {
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (3.3 / 1023.0);
  Serial.println(voltage);
  int val = sensorValue - ((0.55) / (3.3 / 1023.0));
  int valhigh = sensorValue - ((2.75) / (3.3 / 1023.0));
  map(sensorValue, 0,1023, val, valhigh);
  analogWrite(DAC1, sensorValue);
}
 
ua6em не сдержался начал пить ваш коньяк без вас, простите....
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если нужно 5 вольт надо не выпендриваться, а взять обычную нано и mcp4725

PS даже не знаю простят ли тебя коллеги на этом форуме за выпитый мой коньяк )))

PPS и таки да, скетчи, что я выложил (крайние) ты не попробовал, может быть тогда бы понял свою ошибку...
у DUE A0 и DAC разнесены по разным пинам, а на nano IOT на одном, значит переменный резистор надо подключать на другой пин, к примеру А1 и читать положение резистора с него