Управляем всем с помощью регистров cдвига.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Попробуйте погонять в протеусе

ich
Offline
Зарегистрирован: 10.06.2012

Нашел я настоящий осцилограф и прозвонил то что у меня шлёт ардуина. В итоге добился "методом тыка" того что сервы начали двигаться на заданный угол. 

Честно презнаюсь был удивлён когда увидел сигнал идущий с регистра. Да и значения каторые я нашол путём проб в вели меня в звблуждение.

Дапустим, вот эти значения характеризуют максимальный и минимальный импульс:

#define SERVO_MIN_PULSE 350
#define SERVO_MAX_PULSE 2150

Дак вот, если я юзаю регистр без SPI (т.е. управляю регистром через digitalWrite(..)), то всё работает идеально.
350 = 0°
2150 = 180°

Но после того как переписал всё на SPI, я получил следущее:

#define SERVO_MIN_PULSE 3250
#define SERVO_MAX_PULSE 1450

С такими значениями работает и мой SPI как надо.
3250 = 0°
1450 = 180°
Только вот странновато всё это, вы заметели что теперь минимум (3250) то больше чем максимум (1450).
Да и вообще. Что это вдруг нужно слать, настолько длинный импульс, ведь судя по замеренным данным #36 SPI работает довольно быстро, даже быстрей чем родные digitalWrite.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Похоже, у Вас полярность импульса не та. Такое впечатление, что Ваши константы соответствуют не  длине импульса, а интервалу между импульсами. 

ich
Offline
Зарегистрирован: 10.06.2012

Вот именно что длинне.

#define SERVO_MIN_PULSE 3250
#define SERVO_MAX_PULSE 1450
#define SERVO_REFRESH 20000

// Управляет сервой через SPI
void writeToServoSPI(uint8_t pos){
  // MIN 3250
  // MAX 1450
  int imp = map(pos,0,180,SERVO_MIN_PULSE,SERVO_MAX_PULSE);
  for(int i=0; i<100; i++){
    writeMIO(7, HIGH);
    delayMicroseconds(imp);
    writeMIO(7, LOW);
    delayMicroseconds(SERVO_REFRESH-imp);
  }
}

может что в эти функциях не так:

// Bit's
#define B_SPE 6
#define B_MSTR 4
#define B_SPI2X 0

byte outValue = 0;

// Настраиваем мк на рпботу через SPI
void initSPI(){
  //настраиваем на выход
  DDRB |= _BV(P_MOSI); 
  DDRB |= _BV(P_SCK);
  DDRB |= _BV(P_SS);
  // P_MISO по умолчанию на входе

  SPCR = (1<<B_SPE)|(1<<B_MSTR);  //вкл SPI, ведущий,

  SPSR |= _BV(B_SPI2X); // частота fck/2 = 16/2 = 8MHz
}

// Передаём данные и одновременно получаем
byte transport(byte in){
  PORTB |= _BV(P_SS); // HIGH
  SPDR = in;
  while(!(SPSR & _BV(SPIF)));
  PORTB &= ~_BV(P_SS); // LOW
  return SPDR;
}
// Пишим в конкретный пин по SPI в 595
void writeMIO(byte pin, boolean state){
  if(state)
    outValue |= _BV(pin);
  else
    outValue &= ~_BV(pin);
  inValue = transport(outValue);
}
KickStarter
Offline
Зарегистрирован: 08.12.2012

Доброго времени суток

Никак не могу понять, можно ли с помощью 74HC595 управлять яркостью диодов (надо подключить около 30 диодов)

Как я понимаю, с 74HC595 идёт аналоговый сигнал 1 или 0, а надо цифровой 0--255.  Уже много пролистал но не нашёл инфы, в статьие http://robocraft.ru/blog/arduino/541.html увидел строку, что на серву через 74HC595 подаётся сигнал в виде 0-255, но видать ещё не дошёл мозгом, как получилось... вообще, это всё таки, возможно?

тапками не бить плз, как и многие, только начал

maksim
Offline
Зарегистрирован: 12.02.2012

1. Можно. Но для вашей задачи лучше использовать два вот таких вот драйвера TLC5940NT.
2. 1 или 0 - это как раз цифровой сигнал.
3. 0-255 - это 8 битный ШИМ - цифровое представление аналогового сигнала.

KickStarter
Offline
Зарегистрирован: 08.12.2012

Сижу, читаю о TLC5940, интересно, но не могу найти у себя в городе их, а уже очень срочно.

с цифровым и ШИМ я понлял, моя ошибка

Поскажите как пойти с 74HC595 всё таки?  планировал ещё ULN2003 использовать чтобы не попалить 74HC595.

maksim
Offline
Зарегистрирован: 12.02.2012

Если на одном выходе 74HC595 будет не более 3 стандартных светодиодов, то сгореть не должно.
Это не самое простое и быстрое решение в плане ПО.

KickStarter
Offline
Зарегистрирован: 08.12.2012

может есть какие то готовые библиотеки для этого случая с 74HC595

скажите, правильно ли я понимаю, что управляя через 74HC595 сервой, как в этом примере:

http://arduino.ru/forum/programmirovanie/upravlyaem-vsem-s-pomoshchyu-re...

как раз и дописали библиотеку, которая позволяет посылать не только 0 и 1, а 0..255?

maksim
Offline
Зарегистрирован: 12.02.2012

Все правильно, только не от 0 до 255, а ШИМ с длительностью импульса от 600 до 2200 микросекунд. Попробуйте поискать похожие готовые проэкты.

KickStarter
Offline
Зарегистрирован: 08.12.2012

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

KickStarter
Offline
Зарегистрирован: 08.12.2012

Немного перебью разговор, если позволите...

Помогите, как через 74HC595 управлять яркостью диодов, т.е. сделать на выводах ШИМ? не завалялся ли у кого кусочек кода?