Количество ШИМ на Arduino NANO v3
- Войдите на сайт для отправки комментариев
Пт, 08/09/2017 - 13:47
Добрый день, уважаемые господа! Задался вопросом подключения дополнительных серво к Arduino NANO, все аппаратные ШИМ уже заняты, пробовал подавать analogWrite на выходы A0-A5, но в таком случае они не работают как хотелось бы, а всего лишь выдают "High" если подавать значение >128 и "LOW" если меньше.
Подскажите плиз есть ли какие либо варианты, или только менять плату на более мощную, с большим количеством ШИМ?
Добрый день, уважаемые господа! Задался вопросом подключения дополнительных серво к Arduino NANO, все аппаратные ШИМ уже заняты, пробовал подавать analogWrite на выходы A0-A5, но в таком случае они не работают как хотелось бы, а всего лишь выдают "High" если подавать значение >128 и "LOW" если меньше.
Подскажите плиз есть ли какие либо варианты, или только менять плату на более мощную, с большим количеством ШИМ?
ATmega48A/PA/88A/PA/168A/PA/328/P
̶- Six PWM Channels
Пользуйте внешний ШИМ-контроллер. Например, PCA9685 - 16 каналов на корпус, управление по I2C, или TLC5940 - 16 каналов на корпус, управление по SPI.
Судя по ответам, я так понял что из А0-А5 на Arduino Nano ШИМ получить не возможно. Всем спасибо за советы, теперь знаю в какую сторону копать!!!
Не похоже что ТС пошел повышать уровень знаний своего "встроенного программиста". Но для тех кому интересно решение, то я выкладываю свой "устаревший "код
/* #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); } }А что это в 11-ой строке? Чем Вы это компилировали, что съело?
Не похоже что ТС пошел повышать уровень знаний своего "встроенного программиста". Но для тех кому интересно решение, то я выкладываю свой "устаревший "код
Уровень знаний и правда хочется повысить! Спасибо за код! Но вопрос был не именно в управлении серво (сам себе противоречу конечно), а в возможности использовать выходы A0-A5 в качестве ШИМ, по аналогии с D10,D11,D9,D6,D5,D3 например для управления скоростью мотора.
Аппаратный ШИМ не получится, но можно сделать программный. Если устраивает медленный ШИМ,то можно. Просто для управления сервами нужен один импульс определенной длительности и все. Для ускорения можно напрямую управлять ногами МК, а не digitalWrite.
Аппаратный ШИМ не получится, но можно сделать программный. Если устраивает медленный ШИМ,то можно. Просто для управления сервами нужен один импульс определенной длительности и все. Для ускорения можно напрямую управлять ногами МК, а не digitalWrite.
как реализовать программный ШИМ?