Смена портов ШИМ

SergDoc
Offline
Зарегистрирован: 11.05.2011

 Доброго времени суток, вопрос на засыпку можно ли в Arduino Pro сменить выходы ШИМов с 3, 5, 6, 9, 10 и 11 на 5, 6, 7, 8, 9, 10? сама Atmega168 это позволяет.

kikia99
Offline
Зарегистрирован: 22.03.2011

смотря для чего этот ШИМ Вам нужен , программно реализовать шим можно на любой ноге  

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

а аппаратный шим вроде запоминает уровень даже если к нему больше не обращатся программа (конечно если не нажимать сброс ардуино) правда? 

SergDoc
Offline
Зарегистрирован: 11.05.2011

kikia99 пишет:

смотря для чего этот ШИМ Вам нужен , программно реализовать шим можно на любой ноге  

Дело в том, что мне нужны 6 шимов, SPI (11-Й сразу отпадает) и 3-й порт для входа прерываний (сделан уже), придётся наверно программно делать... 

SergDoc
Offline
Зарегистрирован: 11.05.2011

Adessit пишет:

а аппаратный шим вроде запоминает уровень даже если к нему больше не обращатся программа (конечно если не нажимать сброс ардуино) правда? 

Я делаю по внешним прерываниям, нет прерываний "уровень" сохраняется...

kikia99
Offline
Зарегистрирован: 22.03.2011

ну 6 ног это не проблема  как вариант можно сдвиговый регистр  а можно взять тини запрограмировать ее как ШИМ контроллер а ардуиной ток значения скидывать А можно и не мудрить если больше ничего от ардуино не понадобится то выбирайте свободные ноги и реализуйте на них ШИМ

SergDoc
Offline
Зарегистрирован: 11.05.2011

Спасибо разобрался, сделал все программно... 

Fluffy
Offline
Зарегистрирован: 01.06.2011

поделитесь, как программно на любой ножке мк организовать ШИМ?

SergDoc
Offline
Зарегистрирован: 11.05.2011

#define DIGITAL_TILT_PITCH_PINMODE pinMode(A0,OUTPUT); // выставляем на выход
#define DIGITAL_TILT_PITCH_HIGH PORTC |= 1<<0;
#define DIGITAL_TILT_PITCH_LOW PORTC &= ~(1<<0); 

 

static int16_t servo[4] = {1500,1500,1500,1500};
volatile uint8_t atomicServo[4] = {250,250,250,250}; //для 4-х машинок

TCCR0A = 0; // обнуляем таймер
TIMSK0 |= (1<<OCIE0A); // разрешаем прерывание

 

#if (SERVO_TILT)
  DIGITAL_TILT_PITCH_HIGH 
#endif
OCR0A+= 250; // 1000 us
state++;
} else if (state == 3) {
OCR0A+= atomicServo[1]; // 1000 + [0-1020] us
state++;
} else if (state == 4) {
#if (SERVO_TILT)
  DIGITAL_TILT_PITCH_LOW
#endif

 

SergDoc
Offline
Зарегистрирован: 11.05.2011

нужен меандр просто на выводе с определённой частотой и скважностью, частота постоянная скважность меняется, от фронта до фронта длительность постоянная, а от фронта до тыла разная 

Fluffy
Offline
Зарегистрирован: 01.06.2011

а Вы программируете в arduino ide?

SergDoc
Offline
Зарегистрирован: 11.05.2011

 Точнее пытаюсь