Количество ШИМ на Arduino NANO v3

al072
Offline
Зарегистрирован: 20.04.2017

Добрый день, уважаемые господа! Задался вопросом подключения дополнительных серво к Arduino NANO, все аппаратные ШИМ уже заняты, пробовал подавать analogWrite на выходы A0-A5, но в таком случае они не работают как хотелось бы, а всего лишь выдают "High" если подавать значение >128 и "LOW" если меньше.

Подскажите плиз есть ли какие либо варианты, или только менять плату на более мощную, с большим количеством ШИМ?

SLKH
Offline
Зарегистрирован: 17.08.2015

al072 пишет:

Добрый день, уважаемые господа! Задался вопросом подключения дополнительных серво к Arduino NANO, все аппаратные ШИМ уже заняты, пробовал подавать analogWrite на выходы A0-A5, но в таком случае они не работают как хотелось бы, а всего лишь выдают "High" если подавать значение >128 и "LOW" если меньше.

Подскажите плиз есть ли какие либо варианты, или только менять плату на более мощную, с большим количеством ШИМ?

ATmega48A/PA/88A/PA/168A/PA/328/P

̶- Six PWM Channels

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пользуйте внешний ШИМ-контроллер. Например, PCA9685 - 16 каналов на корпус, управление по I2C, или TLC5940 - 16 каналов на корпус, управление по SPI.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

al072 пишет:
Подскажите плиз есть ли какие либо варианты, или только менять плату на более мощную, с большим количеством ШИМ?
Или менять плату или менять ... "вашего программиста". Для управления сервой не нужен аппаратный ШИМ.

al072
Offline
Зарегистрирован: 20.04.2017

Судя по ответам, я так понял что из А0-А5 на Arduino Nano ШИМ получить не возможно. Всем спасибо за советы, теперь знаю в какую сторону копать!!!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Не похоже что ТС пошел повышать уровень знаний своего "встроенного программиста". Но для тех кому интересно решение, то я выкладываю свой "устаревший "код

/*
#1 Серва1 упр. выв -> 2 , 3, 4,  5,  6,   7,   8,   9    (servo_pin[])
               +5В -> +5В
               GND -> GND

   резистор  нижний выв   -> GND
             средний выв  -> A0, A1, A2, A3, A4,  A5,  A6,  A7    (R_pin[])
             верхний выв  -> +5
*/
//#1
uint8_t i = 0 ;+544 } ; // величина на серве 544-2400 мкс.
uint16_t servo_value_old[] = { 544, 544, 544, 544, 544, 544, 544, 544 } ; // величина на серве 544-2400 мкс.
uint8_t  servo[]       = {   0,   0,   0,   0,   0,   0,   0,   0 } ;
const int R_pin[]      = {  A0,  A1,  A2,  A3,  A4,  A5,  A6,  A7 } ; // нога резистора

void setup() {
  //#1
  for (i = 0; i < number_of_servo; i++) {
    pinMode      (servo_pin[i], OUTPUT);
    digitalWrite (servo_pin[i], servo[i] = 0);
  }
  i = 0;
}
void loop() {
  //#1 3 миллисекунд обслуживание сервы 1
  static uint32_t past_1 = 0 ;
  if  (servo[i] && (micros() - past_1 >= servo_value[i]))
    digitalWrite (servo_pin[i], servo[i] = 0);
  if (micros() - past_1 >= 3000)  {   // если прошло 3000 микросек
    i = (i + 1) % number_of_servo;
    past_1 = micros() ;
    digitalWrite (servo_pin[i], servo[i] = 1);
    servo_value[i] = map (analogRead(R_pin[i]), 0, 1023, 544, 2400);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что это в 11-ой строке? Чем Вы это компилировали, что съело?

al072
Offline
Зарегистрирован: 20.04.2017

qwone пишет:

Не похоже что ТС пошел повышать уровень знаний своего "встроенного программиста". Но для тех кому интересно решение, то я выкладываю свой "устаревший "код

Уровень знаний и правда хочется повысить! Спасибо за код! Но вопрос был не именно в управлении серво (сам себе противоречу конечно), а в возможности использовать выходы A0-A5 в качестве ШИМ, по аналогии с D10,D11,D9,D6,D5,D3 например для управления скоростью мотора.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Аппаратный ШИМ не получится, но можно сделать программный. Если устраивает медленный ШИМ,то можно. Просто для управления сервами нужен один импульс определенной длительности и все. Для ускорения можно напрямую управлять ногами МК, а не digitalWrite.

al072
Offline
Зарегистрирован: 20.04.2017

qwone пишет:

Аппаратный ШИМ не получится, но можно сделать программный. Если устраивает медленный ШИМ,то можно. Просто для управления сервами нужен один импульс определенной длительности и все. Для ускорения можно напрямую управлять ногами МК, а не digitalWrite.

как реализовать программный ШИМ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

al072 пишет:
как реализовать программный ШИМ?
@_@ . разумеется программой.