roboforum.ru

Технический форум по робототехнике.

Проблема с приёмом аналоговых сигналов на Arduino...

Проблема с приёмом аналоговых сигналов на Arduino...

GlassEagle » 02 окт 2011, 00:47

и вообще на AVR (конкретно, ATmega8).

Решил снять сигнал обратной связи с сервиного потенциометра и посмотреть, как его можно в дуне использовать. Набросал такой вот скотч:
Код: Выделить всёРазвернуть
#include <Servo.h>

const int ServoPin=4,  // Digital pin for servo impulses
  ServoFBpin=5,        // Analog pin for servo potentiometer reading
  A0pin=0;             // Analog pin for control potentiometer

int pos=1500;  // Servo position
int pot0=0,  // Previous servo potentiometer signal
  pot1,pot2,pot3,  // Samples of servo potentiometer signal
  pot;       // Current servo potentiometer signal
int A0pot,
  A0pot1,A0pot2,A0pot3,  // Samples of input signal
  A0pot0;  // Signal at previous iteration
int delta=3;  // Difference between current and previous control potentiometer signal
int dpot=6;   // Difference between current and previous servo potentiometer signal

const int usCenter=1500;  // Servo signal durations
const int usLeft=2500;  //2000;
const int usRight=0;    //1000;

Servo s1;

void setup()
{
  s1.attach(ServoPin);
  Serial.begin(9600);
}

void loop()
{
  A0pot1=analogRead(A0pin);  // State of control potentiometer
  A0pot2=analogRead(A0pin);  // State of control potentiometer
  A0pot3=analogRead(A0pin);  // State of control potentiometer
  A0pot=(A0pot1+A0pot2+A0pot3)/3;
  if(abs(A0pot-A0pot0)>delta)
  {
    pos=usRight+((float(usLeft-usRight)*float(A0pot))/1023.);  // New position of servo
    s1.writeMicroseconds(pos);
    delay(19);
    pot3=analogRead(ServoFBpin)>>1;  // State of servo potentiometer
    pot1=analogRead(ServoFBpin)>>1;  // State of servo potentiometer
    pot2=analogRead(ServoFBpin)>>1;  // State of servo potentiometer
    pot=(pot1+pot2+pot3)/3;
    if(abs(pot-pot0)>dpot)
      Serial.println(pot,DEC);
  }
  A0pot0=A0pot;
  pot0=pot;
}

>>1 - это деление на два.
Серва управляется с отдельного потенциометра, подключённого к аналоговому входу 0.
Сигнал с потенциометра сервы заводится на аналоговый вход 5.
В-общем, всё работает, все довольны, все смеются, НО... если отсоединить (физически) сигнал от входа А5 и крутить управляющий потециометр на А0, то Serial.print всё равно показывает наличие сигнала (т.е. меняется значение переменной pot). Это как??? Причём меняется вполне адекватно вращению потенциометра (конкретно, между ~500 и 0) (когда потенциометр сервы подключен, то диапазон получается от ~55 до ~250).

УжЕ весь атмеловский даташит про аналоговые входы 2 раза прочитал - ничё понять не могу (не в даташите, а в этом явлении). Либо где-то чёта в коде накосячил так, что сам не пойму, либо одно из двух.
Конечно, если это явление нормальное и обычное - то чёрт с ним, но выглядит, как сильная наводка с одного аналогового входа на другой (мега погорела?).
Уже и ардуиновский исходник функции analogRead смотрел, вроде нет там криминала.
(Питание у сервы и МК, само собой, отдельное.)

Re: Проблема с приёмом аналоговых сигналов на Arduino...

Grem » 02 окт 2011, 02:38

В-общем, всё работает, все довольны, все смеются, НО... если отсоединить (физически) сигнал от входа А5 и крутить управляющий потециометр на А0, то Serial.print всё равно показывает наличие сигнала

Конечно, он и будет, но абсолютно случайный. Подтяните на землю и будет 0 :)

Re: Проблема с приёмом аналоговых сигналов на Arduino...

Duhas » 02 окт 2011, 08:43

со схемой было бы проще, имхо.

Re: Проблема с приёмом аналоговых сигналов на Arduino...

boez » 02 окт 2011, 11:13

+1 - попробуй на землю закоротить.
Есть подозрение, что это sample-hold АЦПшный дает такое интересное явление. Ведь что такое по сути sample-hold? Аналоговый коммутатор (мультиплаксор) и конденсатор небольшой емкости после него. Коммутатор подключает на короткое время нужный вход (в соответствии с ADMUX) к конденсатору и заряжает его напряжением входа. Потом отключает и АЦП меряет напряжение на конденсаторе. А если вход никуда не подключен? А тогда на конденсаторе останется значение с предыдущего входа :)

Re: Проблема с приёмом аналоговых сигналов на Arduino...

GlassEagle » 02 окт 2011, 14:36

Grem писал(а):Конечно, он и будет, но абсолютно случайный.
Он не случайный (случайный бы не вызвал вопросов, всё было бы понятно), он
меняется вполне адекватно вращению потенциометра (конкретно, между ~500 и 0)

Grem писал(а):Подтяните на землю и будет 0 :)
Ок, попробую!

boez писал(а):...А если вход никуда не подключен? А тогда на конденсаторе останется значение с предыдущего входа :)
Да, это похоже. Спасибо!

Добавлено спустя 56 минут 33 секунды:
Duhas писал(а):со схемой было бы проще, имхо.
Arduino+Servo.png
Так лучше?


Rambler\'s Top100 Mail.ru counter