Инверсный ШИМ

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Здравствуйте!

Нужно получить инверсный ШИМ.

Можно конечно поставить транзистор и на этом ограничиться. Но если есть свободные ноги почему бы не сделать так:  Выдаем ШИМ на A0, кидаем этот сигнал на D0, читаем его и генерим инверсный на D1.

duration = pulseIn(D0, HIGH);
digitalWrite(D1, HIGH);
delayMicroseconds(duration);
digitalWrite(D1, LOW);

 

Как считаете?

std
Offline
Зарегистрирован: 05.01.2012
analogWrite(out,256-pwmAmout);
Rednaxela
Offline
Зарегистрирован: 26.08.2013

о! точно! спасибо!

step962
Offline
Зарегистрирован: 23.05.2011

std пишет:

analogWrite(out,256-pwmAmout);

analogWrite(out,255-pwmAmout);

std
Offline
Зарегистрирован: 05.01.2012

А, ну да..

israpil
Offline
Зарегистрирован: 01.11.2013

Что то не понял можно поподробнее, а то ишу нигде не могу найти

 

std
Offline
Зарегистрирован: 05.01.2012

Пусть max - 100% шим, при разрядности 8 (у analogWrite по дефолту, если не трогать регистры таймера) это будет 256. Точнее 255, т. к. начинается с нуля. Пусть pwmAmount - некое кол-во ШИМ, допустим 63 (25%).

Тогда "инверсный" будет равен "максимум минус нормальный" = max-pwmAmount = 255-63 = 192. 192 это инверсное 63.

israpil
Offline
Зарегистрирован: 01.11.2013

А как это написать покажите на примере плавного загорания

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Проверил на осциллографе, Фаза то одна, фронт импульсов одинаков, длительность разная. Инверсивный шим таким способом не получить.  Пришлось как и предполагал использовать перемычку и программную инверсию. 

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

Rednaxela пишет:

Выдаем ШИМ на A0

Интересно на это посмотреть...

Rednaxela пишет:

Пришлось как и предполагал использовать перемычку и программную инверсию. 

Это называется сделать через одно место.

Для 88/168/328-образных дуин, например для 6 вывода:

#define analogWriteInvert(x) OCR0A = x;

void setup() 
{   
  DDRD |= 1<<PD6;
  TCCR0A |= (1<<COM0A0)|(1<<COM0A1);  
  OCR0A = 255;
}

void loop() 
{
  analogWriteInvert(0);
  delay(1000);
  analogWriteInvert(200);
  delay(1000);
  analogWriteInvert(250);
  delay(1000);
  analogWriteInvert(255);
  delay(1000);
}